3

我使用 Xcode 创建了一个命令行工具应用程序。在那个应用程序中,我使用 NSWorkspace 来启动另一个应用程序包 (.app),如此处所建议的。 MacOsX:如何从“命令行工具”类型的应用程序启动应用程序 (.app)

在我尝试使用 launchctl 将命令行工具应用程序作为守护进程启动之前,一切似乎都运行良好。如果守护进程以当前登录的用户身份运行,则命令行工具应用程序启动外部应用程序就好了。如果守护程序以 root 身份运行,则命令行工具应用程序无法启动外部应用程序。如果守护程序以 root 身份运行,则使用 NSWorkspace 打开应用程序似乎不起作用。

有谁知道从以 root 身份运行的守护进程打开另一个应用程序的正确方法?

4

3 回答 3

2

这可能是您遇到的 MacOS 中的安全限制。

我建议做的是创建一个代码签名的“帮助工具”,将自身(通过 setuid - 我不会在代码签名的应用程序之外执行)重置为当前登录用户的用户 ID,然后执行在该用户上下文中启动应用程序的 NSWorkspace 技巧。

但是,创建辅助工具并非易事。Apple 的授权服务编程指南中描述了宏大的概念。

看看Apple 的“SMJobBless”示例代码,它展示了如何安装可以设置用户权限的帮助工具,然后修改它的帮助工具代码以启动您的应用程序。

于 2013-03-20T03:38:21.950 回答
2

这是一个太复杂的主题,无法在 StackOverflow 答案中真正解决。简短的回答是守护进程不能可靠地启动应用程序。如需详细答案,请阅读 Apple 的技术说明 TN2083:守护进程和代理

于 2013-03-20T07:52:52.250 回答
0

我终于通过使用此链接中提到的代码来获取“控制台用户”的 uid 和 gid 使其工作:
https ://superuser.com/questions/180819/how-can-you-find-out-the-currently-登录用户-in-the-os-x-gui

该链接显示了如何使用SCDynamicStoreCreate()SCDynamicStoreCopyConsoleUser()获取“控制台用户”的 uid 和 gid 的示例。

获取 uid 和 gid 后,只需将 uid 和 gid 设置为控制台用户,然后再使用 NSWorkspace 打开应用程序,这对我来说就成功了。

于 2013-04-04T23:54:16.983 回答