2013-05-22 109 views
3

执行launchctl我需要从我的沙盒OSX的应用程序执行launchctl load/unload命令。该应用具有read-write对启动代理的plist文件所在的文件夹的权限(使用应用的用户之前授予的安全范围的书签)。在沙盒Mac应用程序

但是应用程序获取以下错误:

- 
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/[email protected]/msg80413.html谈话没有任何结果。

回答

3

文件/private/var/db/launchd.db/com.apple.launchd.peruser.501/overrides.plist CAND只能被读取或由管理员用户(root)写。因此,要使launchctl load\unload正常工作,您必须在根指令前使用root或使用sudo来提升。但是,在沙箱中,您不允许这样做。

根据您的需求,您可以使用一个助手应用程序。看看Adding Login Items Using the Service Management Framework

1

为了让应用程序做一些需要特权操作,苹果表明,一个助手应用程序被创建,它只能被称为由父应用程序来运行,由于被签署。助手应用程序使用提升的权限启动并执行所需的最小操作。看看这里SMJobBless -

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

因为它规定: -

SMJobBless demonstrates how to securely install a helper tool that performs a privileged operation and how to associate the tool with an application that invokes it.

+0

谢谢你,但'SMJobBless'示例还使用了 “授权服务” 的方法调用(' AuthorizationCopyRights')和Apple文档声明:“重要信息:应用程序沙箱中不支持授权服务API,因为它允许权限升级。” – anka

+0

这是我忽略的一个好点。我打算告诉你看看Apple的“EvenBetterAuthorizationSample”,但它也使用授权服务。我开始认为你所要求的是不可能的,因为沙盒太严格了。 – TheDarkKnight

+1

是的,值得注意的是,任何人看到这个答案都值得注意,沙盒应用程序不允许提升权限,尽管沙盒应用程序可以包含帮助程序应用程序,但助手应用程序也必须被沙盒化。 – AriX