【问题标题】:Cocoa - Gaining Root Access for NSFileManagerCocoa - 获得 NSFileManager 的根访问权限
【发布时间】:2011-06-03 17:19:48
【问题描述】:

我需要在我的应用程序中使用 NSFileManager 移动系统文件,但我似乎没有 root 访问权限。获得此特权的最简单方法是什么?

我查看了 Apple 提供的 BetterAuthorizationSample 代码,但我似乎无法让 NSFileManager 在用户批准后运行它的任务。

【问题讨论】:

    标签: objective-c cocoa root nsfilemanager


    【解决方案1】:

    更新:为了更新仍在使用此答案作为参考的人,BLAuthentication 使用了一个旧的、极不推荐的函数 AuthorizationExecuteWithPriviledges,它在工作时违反了现代安全范式, 并且已被弃用(并且已经有一段时间了)。从技术上讲,您仍然可以使用它,但如果您正在为 Mac OS X Lion 进行开发,我们非常欢迎您使用 ServicesManagement 框架,它允许您作为帮助工具运行具有特权的代码。

    有关如何创建和启动特权帮助工具的参考,请查看我的一个问题,Writing a Privileged Helper Tool with SMJobBless()


    没有真正简单的方法来授权NSFileManager,因此您应该考虑使用在管理员身份验证下运行的标准mvcp 工具和BLAuthentication 类。不幸的是,原作者的网站已关闭,但您可以在 Google 上轻松找到该课程的副本(如果您愿意,我也可以为您上传副本)。


    使用BLAuthentication,您尝试做的事情是这样的:

    #define MOVE @"/bin/mv"
    if (![[BLAuthentication sharedInstance] isAuthenticated:MOVE]) {
        [[BLAuthentication sharedInstance] authenticate:MOVE];
    }
    
    NSArray *arguments = [NSArray arrayWithObjects:@"location1", @"location2", nil];
    [[BLAuthentication sharedInstance] executeCommand:MOVE withArgs:arguments];
    

    上面的代码将提示用户输入管理员密码,并在默认的五分钟时间限制内验证程序。


    警告
    当然,请始终小心系统文件!尽可能避免移动或操纵它们,尤其是当您的程序要在其他人的计算机上运行时(如果出现任何问题,您将受到责备)!

    【讨论】:

    • 非常感谢这篇文章!那么我仍然可以使用 NSFileManager 类,还是从现在开始我必须使用命令“mv”?顺便说一句,如果你能上传给我就太好了!谢谢!!!!
    • 好的,所以我找到了 BLAuthentication 类,并注意到它是从 2001 年开始的。如果它有十年之久,它还能工作吗?您还可以提供有关我将如何实现 NSTask 部分的任何信息吗?
    • Kevin,澄清一些事情:a) 对于常规文件,您仍然可以使用 NSFileManager,但对于 root 访问,请使用 BLAuthentication,如上所示。 b) 对不起,我的错;你甚至不需要NSTask(我忘了更新我的答案的那部分以及代码,但现在它已经修复了)。只需使用-executeCommand:withArgs: 和命令路径(@"/bin/cp" 或@"/bin/mv")来执行移动/复制操作。 c) 是的,尽管BLAuthentication ,它仍然可以完美地编译和运行,即使在 10.6 下(安全框架几乎没有随着时间的推移而改变)。
    • 还有一件事,一旦出现要求输入密码的弹出窗口,该应用程序是否会继续其所有其他内容?如果是这样,有没有办法在运行后暂停它并等待该人在任何其他代码之前输入其密码?
    • Kevin,提示用户授权的模式窗口在主线程上运行,所以是的,它基本上“暂停”了程序和 UI 的其余部分,直到用户输入管理员名称和密码。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 2013-05-02
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多