在沙盒OSX应用程序中要求用户输入管理员密码

时间:2012-05-30 09:11:33

标签: objective-c macos cocoa

我正在编写一个应用程序,我希望自定义首选项窗口在允许任何更改之前要求输入管理员密码(但绝不存储它)。现在我一直在使用这个代码片段:

    OSStatus status;
    AuthorizationRef authorizationRef;

    // AuthorizationCreate and pass NULL as the initial
    // AuthorizationRights set so that the AuthorizationRef gets created
    // successfully, and then later call AuthorizationCopyRights to
    // determine or extend the allowable rights.
    // http://developer.apple.com/qa/qa2001/qa1172.html
    status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef);
    if (status != errAuthorizationSuccess)
    {
        NSLog(@"Error Creating Initial Authorization: %d", status);
        return status;
    }

    // kAuthorizationRightExecute == "system.privilege.admin"
    AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0};
    AuthorizationRights rights = {1, &right};
    AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights;

    // Call AuthorizationCopyRights to determine or extend the allowable rights.
    status = AuthorizationCopyRights(authorizationRef, &rights, NULL, flags, NULL);
    if (status != errAuthorizationSuccess)
    {
        NSLog(@"Copy Rights Unsuccessful: %d", status);
    }
    return status;

哪个工作正常,提出了一个标准的os密码对话框,要求输入管理员密码。根据返回的status启用/禁用首选项的nib中的各种控件。但是,现在我正在尝试使用Sandbox应用程序,此代码始终返回errAuthorizationDenied。我已经查看了AuthorizationCopyRightsAuthorizationCreate的文档,但我看不到在沙盒环境中使用它们的参考。

我尝试了AuthorizationFlags flags的各种变体,但结果总是如此。有没有办法修改上面的代码在沙盒中工作,或者这些天是否要求管理员密码?

1 个答案:

答案 0 :(得分:10)

我查看了沙盒的文档,名为Determine Whether Your App is Suitable for Sandboxing的部分会立即回答您的问题。

来自文档

  

以下应用行为与App Sandbox不兼容:

     
      
  • 使用授权服务
  •   

游戏结束。

事实上,我不确定你希望实现的目标。为什么不让用户为应用程序确定自己的自定义首选项?