AuthorizationCreate()显示的更改授权对话框

时间:2012-11-29 21:06:07

标签: objective-c macos cocoa security

浏览Apples BetterAuthorizationSample和更多衍生品(http://www.stevestreeting.com/2011/11/25/escalating-privileges-on-mac-os-x-securely-and-without-using-deprecated-methods/) 我试图对应用程序进行一些小改动,并更好地理解整个安全性和安全性。 ServiceManagement框架..因此我继续添加一个按钮,通过SMJobBless - SMJobRemove()的反向删除已安装的Job。然而,直接向AuthorizationCreate()调用显示一个对话框,该对话框声明并请求安装帮助程序的权限而不是删除它。

这是我得到的对话框(使用kSMRightModifySystemDaemons)。正如你所看到的那样,我的应用程序试图添加一个新的帮助工具。这将使我的用户感到困惑,因为该应用实际上试图删除已安装的帮助工具。

enter image description here

我正在寻找有关如何更改此对话框以反映我的实际操作(作业删除)的知识,还有其他几个似乎完全自定义对话框的应用程序 - 显示自己的自定义标签和按钮.. < / p>

BOOL doRemoveSystemTool(NSString* label, NSError** error)
{
BOOL result = NO;

AuthorizationItem authItem      = { kSMRightModifySystemDaemons, 0, NULL, 0 };
AuthorizationRights authRights  = { 1, &authItem };
AuthorizationFlags flags        =   kAuthorizationFlagDefaults              |
kAuthorizationFlagInteractionAllowed    |
kAuthorizationFlagPreAuthorize          |
kAuthorizationFlagExtendRights;

AuthorizationRef authRef = NULL;
//Obtain authorization
OSStatus status = AuthorizationCreate(&authRights, kAuthorizationEmptyEnvironment, flags, &authRef);
if (status != errAuthorizationSuccess)
{
    NSLog(@"Failed to create AuthorizationRef, return code %ld", (long)status);
} else
{
    //We have authorization so proceed with removing the Job via SMJobRemove
    result = SMJobRemove(kSMDomainSystemLaunchd, (CFStringRef)label, authRef, YES, (CFErrorRef *)error);
}
AuthorizationFree(authRef, kAuthorizationFlagDefaults);
return result;
}

我已尝试从kSMRightBlessPrivilegedHelper更改为kSMRightModifySystemDaemons的authItem,但所有这些都改变了对话框以显示“添加”而不是“安装”

非常感谢这里的一些帮助...

1 个答案:

答案 0 :(得分:0)

我之前没有使用过这个问题,但发现你的问题很有趣,所以我对Apple的文档进行了一些阅读,基于这一点,我想知道用kAuthorizationEnvironmentPrompt设置环境会做你想做的事吗?

From AuthorizationTags.h:
  The name of the AuthorizationItem that should be passed into the environment 
when specifying a invocation specific additional text.  The value should be a 
localized UTF8 string.

您可以使用此创建AuthorizationItem,然后使用包含该AuthorizationItemSet的AuthorizationItemSet,然后将该集合传递给AuthorizationCreate environment:参数的调用。

我试试。

我阅读文档的另一个想法是使用命令行工具执行删除并授权执行命令行工具(“SomethingSomethingHelper”),这可能会让用户感到困惑(因此使用{{1或AuthorizationExecuteWithPrivileges或其他)。