objective-c – 使用SMJobBless()编写一个特权帮助工具

即使API已经从Mac OS X Leopard开放,令人惊讶的是,不幸的是,很少有关于如何正确使用SMJobBless()来创建特权帮助工具的文档。即使从Apple的示例项目直接复制代码,也有很多问题。幸运的是,我已经找到了这个方法,并且已经得到了我的帮助工具工作的基础。

但是,似乎SMJobBless()只支持该工具并将其复制,但不会运行它。我已经在我的帮助工具的main()函数中包含代码,该函数应该运行,但不会(因为NSLog()不可思议地不起作用 – 根据我发现的一小部分信息 – 我尝试过syslog()使用一些“Hello world”类型的字符串,但系统控制台上没有任何内容。没有迹象表明帮助工具完全启动。
文档大部分是无用的。简单的说,在SMJobBless()被调用之后,辅助工具是“准备好”的,没有指示什么“准备”甚至意味着。

此外,Apple的示例不包含任何进程间通信代码,也不解释应该如何与辅助工具进行交互。你使用分布式对象吗?马赫口?谁知道?没有关于如何做的官方话。

那么,有没有人有任何关于如何做到这一点的信息?我已经确认了帮助工具的安装,并且身份验证正常工作,但是我根本无法弄清楚如何启动帮助工具并与之进行沟通 – 文档中只有这样一个差距,这是现在的一个谜。这是非常令人沮丧的我不能是唯一有这个问题的人(但是在任何地方都没有提到),而SMJobBless()显然是以某种方式工作的,因为它是苹果公司使用的。

(请不要提及AuthorizationExecuteWithPrivileges()。我没有使用它:它已被弃用,一定要消失,是一个主要的安全漏洞,不用谢了。)

如果您尝试提升权限(从https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html),XPC不是一个选择:

By default, XPC services are run in the most restricted environment
possible—sandboxed with minimal filesystem access, network access, and
so on. Elevating a service’s privileges to root is not supported.

SMJobBless将安装一个帮助工具并将其注册到Launchd,如在Apple提供的SMJobBless示例中。让您的帮助工具实际启动的窍门是简单地尝试连接到您的帮助工具的广告服务。

有一个名为ssd的WWDC2010示例通过套接字演示了一个简单的launchd客户端/服务器模型。苹果不再可用,但我在这里找到了一个链接:http://lists.apple.com/archives/macnetworkprog/2011/Jul/msg00005.html

我将服务器代码中的调度队列处理从ssd示例中合并到SMJobBless示例中的帮助工具中,并且可以确认当我的主应用程序尝试在适当端口上进行连接时,我的帮助工具确实正在运行(作为root用户)。请参阅Launchd上的WWDC2010视频,以了解与辅助工具(插座除外)进行通信的其他机制。

我不知道我可以合法重新分配修改后的源代码,但是合并这两个项目并让您的帮助工具运行起来应该是相当直接的。

编辑:这是一个我写的一个示例项目,它使用分布式对象来进行应用和助手之间的通信:http://dl.dropbox.com/u/463624/Elevator.zip

http://stackoverflow.com/questions/9134841/writing-a-privileged-helper-tool-with-smjobbless

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:objective-c – 使用SMJobBless()编写一个特权帮助工具