【发布时间】:2012-11-29 21:06:06
【问题描述】:
查看 Apples BetterAuthorizationSample 和进一步的衍生品(http://www.stevestreeting.com/2011/11/25/escalating-privileges-on-mac-os-x-securely-and-without-using-deprecated-methods/) 我正在尝试对应用程序进行一些小改动,并更好地了解整个安全和服务管理框架。因此,我继续添加一个按钮,该按钮通过 SMJobBless - SMJobRemove() 的反面删除已安装的作业。然而,AuthorizationCreate() 调用直接显示一个对话框,声明并请求安装帮助程序而不是删除它的权限。
这就是我得到的对话框(使用kSMRightModifySystemDaemons)。如您所见,它说我的应用程序试图添加一个新的帮助工具。这会让我的用户感到困惑,因为该应用程序实际上试图删除已安装的帮助工具。
我正在寻找有关如何更改此对话框以反映我的实际操作(作业删除)的知识,还有其他几个似乎完全自定义对话框的应用程序 - 显示自己的自定义标签和按钮..
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;
}
我已经尝试将 authItem 从 kSMRightBlessPrivilegedHelper 更改为 kSMRightModifySystemDaemons,但所做的只是将对话框更改为显示“添加”而不是“安装”
非常感谢您提供帮助...
【问题讨论】:
-
解决方案是使用 AuthorizationRightSet() 创建一个新的权限集,其中最后一个参数(localeTableName)指定默认提示,仍然不确定如何准确获取默认按钮文本,但至少可以轻松更改标签
-
如果你能解释我如何使用
AuthorizationRightSet()让对话更有意义,我很乐意奖励赏金;-) -
苹果有一个例子:developer.apple.com/library/mac/technotes/tn2095/_index.html#//…。以编程方式添加权限“当您使用非 NULL descriptionKey 调用 AuthorizationRightSet 时,它会遍历包中的每个本地化。对于每个本地化,它会查找适当的本地化表文件,然后查找该表中的描述键。然后将生成的字符串添加到正确规范中的默认提示字典中。"
标签: objective-c macos cocoa security