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

Dav*_*IRV 9 security macos cocoa objective-c

翻翻苹果BetterAuthorizationSample,并进一步衍生品(http://www.stevestreeting.com/2011/11/25/escalating-privileges-on-mac-os-x-securely-and-without-using-deprecated-methods/)我我正在尝试对应用程序进行一些小改动,并更好地了解整个Security&ServiceManagement框架.因此,我继续添加一个按钮,通过SMJobBless - SMJobRemove()的反向删除已安装的Job.然而,直接向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;
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试从kSMRightBlessPrivilegedHelper更改为kSMRightModifySystemDaemons的authItem,但所有这一切都改变了对话框以显示'Add'而不是'Install'

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

Dad*_*Dad 1

我以前没有使用过这个,但发现你的问题很有趣,所以我读了一点苹果的文档,基于此我想知道用 a 设置环境是否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.
Run Code Online (Sandbox Code Playgroud)

您可以使用它创建一个 AuthorizationItem,然后创建一个包含它的 AuthorizationItemSet,然后将该集合传递到参数AuthorizationCreate的调用中environment:

我会尝试一下。

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

  • AuthorizationExecuteWithPrivileges = 已弃用 (2认同)