在 Mac 应用程序中提升为管理员权限

Posted

技术标签:

【中文标题】在 Mac 应用程序中提升为管理员权限【英文标题】:Elevating to admin rights in Mac application 【发布时间】:2010-11-27 20:28:36 【问题描述】:

我正在制作一个简单的应用程序,可让您快速输入要运行的 shell 命令。 它工作得很好,但是存在 sudo 命令的问题。 目前,它检测到一个 sudo 命令,然后我尝试让它为用户密码打开一个授权窗口,就像您在安装程序中看到的一样。

这是检测到它是 sudo 命令后的代码:

SFAuthorization *authorization = [[SFAuthorization alloc] initWithFlags:kAuthorizationFlagPreAuthorize rights:NULL environment:kAuthorizationEmptyEnvironment];
if ([authorization obtainWithRight:"com.mycompany.myapplication" flags:kAuthorizationFlagPreAuthorize error:nil])
    //authorized, now run the command using NSTask.
else
    //fail

现在,据我所知,这是完全错误的。这正是我从文档中拼凑出来的。有什么想法吗?

【问题讨论】:

【参考方案1】:

您需要使用 AuthorizationExecuteWithPrivileges 函数,如下所示:

- (IBAction)touch: (id) sender 

  NSString * filepath = [_filepathfield stringValue];
  FILE *commpipe = NULL;
  OSStatus execstatus;


  NSLog(@"file path is %@", filepath);

  char *args[] = [filepath cString], NULL;


  SFAuthorization * authorization = [SFAuthorization authorization];

  execstatus = AuthorizationExecuteWithPrivileges([authorization authorizationRef],
                                                  "/usr/bin/touch",
                                                  kAuthorizationFlagDefaults,
                                                  args,
                                                  &commpipe);

  if (execstatus == errAuthorizationSuccess) 
    NSlog(@"Toot! It worked");
  else
    NSLog(@"No dice");


鉴于 BSD 是一朵娇嫩而脾气暴躁的花朵,我建议不要让用户以 root 身份从应用程序中执行任意命令。

/讲座

如果您想限制您自己的程序的功能不被自己的用户使用,那么您示例中的代码就是您要走的路的开始。例如,您可能有一个应用程序只允许某些用户更改已保存文件中的数据。因此,您将在安全数据库“com.mycompany.LibraryApp.AlterData”中创建一个条目,并检查用户在尝试更改数据时是否具有该权限。但这是一个完全不同的话题......

希望对您有所帮助, -p。

【讨论】:

但这不会执行 NSTask。任何想法如何使用权限执行 NSTask?【参考方案2】:

我知道这是一个非常古老的问题,但对于那些仍在寻找答案的人来说,这里是。 (它使用 AppleScript)

NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"do shell script \"[YOUR SCRIPT HERE]\" with administrator privileges"];

当然,将 [YOUR SCRIPT HERE] 替换为您的脚本,并确保以可可方式转义字符串。

NSDictionary *errorInfo;
[script executeAndReturnError:&errorInfo];

如需进一步解释,请发表评论。

【讨论】:

【参考方案3】:

安全很难。我可以解释文档并提供代码 sn-ps,但我可能会错。更糟糕的是,即使我的高级描述是正确的,sn-ps 代码中也很可能存在一个会破坏安全性的小错误。

如果您要处理权限提升问题,最好的方法是阅读文档并使用提供的示例。

https://developer.apple.com/mac/library/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html#//apple_ref/doc/uid/TP30000995-CH204-TP1

【讨论】:

以上是关于在 Mac 应用程序中提升为管理员权限的主要内容,如果未能解决你的问题,请参考以下文章

VS2008 C#用manifest提升程序权限后,调试时还是不行,求解

程序运行时按需要提升为管理员权限

mac电脑没有权限打开应用程序

Windows 8提升普通管理员权限为超级管理员权限以及激活超级管理员Administrator

为软件提升管理员权限(mt.exe)

为软件提升管理员权限(mt.exe)