我在Mac(山狮)上为finder编写了一个插件,它运行得很好,但是我必须用sudo运行它。然后我创建一个包(Packagemaker)来运行这个包,它失败了(正确安装,如果我通过单击桌面图标运行它失败,如果通过命令行运行sudo,它可以工作)。 有没有人知道如何解决这个问题就像安装Dropbox(然后同步图标显示)
答案 0 :(得分:3)
您面临的问题是,在内部,mach_inject调用函数task_for_pid。
此函数返回给定进程pid的内核任务ID,并且出于安全原因,Apple现在要求只能从属于 root 的成员的用户使用此函数或 procmod 组。这解释了为什么运行sudo对你有用。
如果您只是为了自己的使用而开发它,最简单的方法是将自己添加到procmod组。但是,如果要分发应用程序,则需要确保任何安装程序安装程序以作为root或procmod组的成员运行。
一种可能性是将您的应用程序分成两部分,其中第二部分已注册为使用SMJobBless以提升的权限运行。如果你不用Objective-C编程,不要担心,因为SMJobBless的实际部分只是C函数调用;在given example code中查找 AuthorizationCopyRights 和 SMJobBless 。
或者,如果应用程序是代码签名的,那也应该有效,尽管这不是我自己尝试过的。你可以read about that here。
从OS X 10.11(El Capitan)开始,task_for_pid
是一个有权的函数调用,仅适用于在其证书中具有特定权利且不再可供第三方开发人员使用的软件。
这会破坏mach_inject,使得在启用SIP(System Integrity Projection)时更难以检索另一个进程的mach任务。