2

通过launchd 获得root 权限的帮助工具无法建立到我的主程序的NSConnection。

当我使用 sudo 手动启动 HelperTool 时,连接有效,这证明我的服务很好售卖,并且问题来自于 launchd。

日志是:

12.01.12 12:41:07    Debou[8247]    [CaptureQueue startCaptureQueueThread] Launched NSConnection service Debou-CaptureQueueThread - (** NSConnection 0x100522090 receivePort <NSMachPort: 0x1005511d0> sendPort <NSMachPort: 0x1005511d0> refCount 1 **)
12.01.12 12:41:10    com.apple.launchd[1]    System: Looking up service Debou-CaptureQueueThread
12.01.12 12:41:10    com.apple.launchd[1]    (com.Debou.PacketTool[8260]) Mach service lookup failed: Debou-CaptureQueueThread 

为什么launchd 看不到我出售的 NSConnection ?

4

1 回答 1

3

AIUI 这是由于 Mach 命名空间层次结构。您的主程序将在用户会话命名空间中注册其 NSConnection,而 LaunchDaemon 在全局上下文中运行,因此它无法查看任何会话命名空间。请注意,当您使用 sudo 运行帮助程序时,即使它以 root 身份运行,它仍会在会话上下文中运行。请参阅tn2083,尤其是“执行上下文”和“守护进程 IPC 建议”部分。

您可能能够从 LaunchDaemon 提供连接并从主程序进行连接(因为会话命名空间继承自全局命名空间),但完全切换到不同的机制可能会更好。作为奎因“爱斯基摩人!” 在此消息中指出,在安全域之间使用分布式对象(如用户程序和以 root 身份运行的守护程序)使得进行正确的输入验证变得非常困难,因此很可能导致安全错误。

于 2012-01-12T17:39:50.907 回答