我在Objective OS上制作的基于Mac OSX的基于Cocoa的setup.app需要安装一个LaunchDaemon来执行提升的权限任务,例如需要扫描整个硬盘驱动器并因此需要root权限的防病毒程序。如何让我的安装应用程序提示客户进行管理员登录,然后将LaunchDaemon安装到/ Library / LaunchDaemons中(注意我不是指〜/ Library / LaunchDaemons)?
我目前处理它的方式是使用具有管理员权限的AppleScript。它会提示进行此登录,然后AppleScript会在没有操作系统抱怨的情况下复制到此文件夹中。但是,我认为这不是正确的技术 - 我应该以某种方式在Objective C中完全做到这一点?
请注意,在这种情况下我不能使用SMBlessJob,因为正是出于这个原因我首先创建了启动守护进程。
背景资料
我特别需要创建自定义setup.app - 就像Norton的AV应用程序使用自定义setup.app一样。这是因为Apple PKG和DMG安装程序不允许在安装期间从服务器下载非常大的文件(如病毒定义),并提供某种友好的反馈。我的意思是,我可以在运行Perl脚本或Bash脚本时让PKG文件从服务器下载文件,但是安装程序只是将进度条挂起了下载所需的分钟数,而不是向其提供任何其他反馈。用户除了挂起进度条,因此用户认为安装程序已损坏,而不是。这就是为什么我必须制作自己的自定义setup.app,就像Norton为他们的AV应用程序做的那样。
答案 0 :(得分:4)
通常情况下,SMJobBless就是这样做的技巧。它是Apple自2016年以来推荐的那个。这是Apple的示例项目的readme.txt:
https://developer.apple.com/library/mac/samplecode/SMJobBless/Listings/ReadMe_txt.html
但是,这不是唯一的方法。另一种方法是让安装程序使用AppleScript提示并运行具有提升权限的Bash或Perl脚本来安装LaunchDaemon。 (这实际上比SMJobBless更容易。)
基本上,任何一种技术都会将LaunchDaemon(例如," service")安装到一个特殊文件夹中,并且该守护进程可以使用提升的权限进行设置,然后可以运行您想要的任何内容 - 甚至是命令行命令。 LaunchDaemons和LaunchAgents的超级精彩解释如下:
现在,问题是如何在安装后从应用程序与它进行通信。他们把这个留给你,有各种各样的技巧。但是,它们也会让你保证这一点,使它不是攻击媒介。
关于如何进行IPC(应用程序与此服务之间的进程间通信)的精彩文章如下:
http://nshipster.com/inter-process-communication/
OSX上的一个IPC协议是分布式对象,从架构的角度来看,它非常流畅 - 你会感觉更像它的编码"而不是"来回发送消息"像其他IPC协议一样。我已经写了Stack Overflow post,因为文档很粗俗,Apple网站和其他网站上的现有示例都是陈旧的(不会在XCode7.1上使用OSX 10.10 +进行编译)。
在应用程序和守护程序/服务之间的通信协议上,您可以使用带有长密码的AES256加密并转换为Base64编码的密钥/值,XML或JSON消息,然后使用其中一个各种IPC机制。然而,这完全是另一个话题。