【问题标题】:Change Authorization Dialog shown by AuthorizationCreate()AuthorizationCreate() 显示的更改授权对话框
【发布时间】: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


【解决方案1】:

我以前没有使用过这个,但发现你的问题很有趣,所以我稍微阅读了 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,然后将集合传递给 environment: 参数的 AuthorizationCreate 调用。

我会试试的。

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

【讨论】:

  • AuthorizationExecuteWithPrivileges = 已弃用
  • 这是一个提示,但没有答案 IMO
  • @Daij-Djan 我不相信用勺子喂食的答案。给出足够的方向让某人自己前进,他们会学到更多。我相信这确实可能会给出答案,我只是没有时间去编写测试应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多