尽管该 API 自 Mac OS X Leopard 以来就已开放,但令人惊讶且不幸的是,关于如何正确使用的文档却很少SMJobBless()
用于创建特权帮助工具。即使直接从 Apple 的示例项目复制代码,也存在很多问题。幸运的是,我找到了解决这个问题的方法,并为我的辅助工具的工作奠定了基础。
然而,似乎SMJobBless()
只祝福该工具并将其复制过来,但不运行它。我已将代码包含在我的辅助工具中main()
功能是should运行,但没有(因为NSLog()
莫名其妙地不起作用——根据我的一点点信息have发现——我已经尝试过syslog()
荷兰国际集团一些“Hello world”类型的字符串,但系统控制台上没有出现任何内容)。没有任何迹象表明辅助工具已启动。
文档大多是无用的。它只是说,之后SMJobBless()
被调用时,辅助工具已“准备好”,甚至没有任何指示“准备好”意味着什么。
此外,Apple 的示例不包含任何进程间通信代码,也没有解释如何与辅助工具交互。您使用分布式对象吗?马赫端口?谁知道?官方没有说明如何做到这一点。
那么,有人知道如何完成此操作吗?我已经确认辅助工具已安装,并且身份验证有效,但我根本不知道如何启动辅助工具并与其进行通信 - 文档中存在这样一个空白,目前这还是一个谜。这非常令人沮丧;我不能成为那个only一个有这个问题的人(但很少有人提到它anywhere), and SMJobBless()
显然有效somehow,因为这是苹果公司使用的。
(请不要提及AuthorizationExecuteWithPrivileges()
。我没有使用它:它已被弃用,肯定会消失,并且是一个主要的安全漏洞。不,谢谢。)
如果您尝试提升权限(从https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html):
默认情况下,XPC服务在最受限制的环境中运行
可能——沙盒化,具有最少的文件系统访问、网络访问和
很快。不支持将服务的权限提升为 root。
SMJobBless 将安装一个辅助工具并将其注册到 Launchd,如 Apple 提供的 SMJobBless 示例所示。让您的帮助工具真正启动的技巧是简单地尝试连接到您的帮助工具的广告服务。
有一个 WWDC2010 的例子叫做ssd
通过套接字演示了一个简单的 launchd 客户端/服务器模型。 Apple 不再提供该功能,但我在这里找到了一个链接:https://lists.apple.com/archives/macnetworkprog/2011/Jul/msg00005.html https://lists.apple.com/archives/macnetworkprog/2011/Jul/msg00005.html
我已将 ssd 示例中的服务器代码中的调度队列处理合并到 SMJobBless 示例中的帮助程序工具中,并且当我的主应用程序尝试在适当的端口上进行连接时,可以确认我的帮助程序工具确实正在运行(以 root 身份运行)。请参阅 Launchd 上的 WWDC2010 视频,了解可用于与辅助工具通信的其他机制(套接字除外)。
我不确定我是否可以合法地重新分发我拥有的修改后的源代码,但合并这两个项目并让您的辅助工具运行应该相当简单。
Edit:这是我编写的一个示例项目,它使用分布式对象在应用程序和助手之间进行通信:https://www.dropbox.com/s/5kjl8koyqzvszrl/Elevator.zip https://www.dropbox.com/s/5kjl8koyqzvszrl/Elevator.zip
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)