在沙盒化的Mac应用程序中执行launchctl

4
我需要从我的沙盒OSX应用程序执行launchctl load/unload命令。该应用程序对包含启动代理的plist文件的文件夹具有读写权限(使用安全范围书签,由应用程序的用户在授权之前)。然而,该应用程序会收到以下错误:
-
5/22/13 9:15:56.420 AM sandboxd[28463]: ([28473]) launchctl(28473) deny file-read-data /private/var/db/launchd.db/com.apple.launchd.peruser.501/overrides.plist
-

为了明确,我不想将自己的应用程序添加到自启动项中,我还发现这个http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg80413.html关于类似主题的对话,但没有任何结果。
2个回答

3

文件/private/var/db/launchd.db/com.apple.launchd.peruser.501/overrides.plist只能被管理员用户(root)读取或写入。因此,为了使launchctl load/unload命令生效,您必须使用root用户或使用sudo提高权限。但是,在沙盒中,您不被允许这样做。

根据您的需要,您可以使用辅助应用程序。请查看使用服务管理框架添加登录项


1
为了使应用程序执行需要特权操作的任务,苹果建议创建一个辅助应用程序,只能由父应用程序调用运行,因为它是签名的。该辅助应用程序以提升的权限启动并执行最低所需操作。请查看SMJobBless:-

http://developer.apple.com/library/mac/#samplecode/SMJobBless/Introduction/Intro.html

正如它所述:-
SMJobBless演示了如何安全地安装助手工具,执行特权操作并将其与调用它的应用程序关联。

谢谢,但是SMJobBless示例也使用了“授权服务”(Authorization Services)的方法调用(AuthorizationCopyRights),而且苹果文档指出:“重要提示:授权服务API不支持应用程序沙盒,因为它允许特权升级。” - anka
这是一个我忽略了的好观点。我本来想告诉你去看看苹果的“EvenBetterAuthorizationSample”,但它也使用了授权服务。我开始认为你所要求的可能不可能实现,因为沙盒太过严格限制了。 - TheDarkKnight
1
是的,为了让任何看到这个答案的人清楚,值得注意的是沙盒应用程序不允许提升权限,虽然沙盒应用程序可以包括辅助应用程序,但辅助应用程序也必须被沙盒化。 - AriX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接