Macos Mac OS X:从守护进程使用NSWorkspace启动应用程序不会';如果守护进程以root用户身份运行,则无法工作
我使用Xcode创建了一个命令行工具应用程序。 在那个应用程序中,我使用NSWorkspace启动了另一个应用程序包(.app),如这里所建议的。 在我尝试使用launchctl作为守护进程启动命令行工具应用程序之前,一切似乎都很正常。 如果守护进程以当前登录用户的身份运行,那么命令行工具应用程序可以正常启动外部应用程序。 如果守护进程以root用户身份运行,则命令行工具应用程序无法启动外部应用程序。 如果守护进程以root用户身份运行,则使用NSWorkspace打开应用程序似乎不起作用Macos Mac OS X:从守护进程使用NSWorkspace启动应用程序不会';如果守护进程以root用户身份运行,则无法工作,macos,daemon,launchd,Macos,Daemon,Launchd,我使用Xcode创建了一个命令行工具应用程序。 在那个应用程序中,我使用NSWorkspace启动了另一个应用程序包(.app),如这里所建议的。 在我尝试使用launchctl作为守护进程启动命令行工具应用程序之前,一切似乎都很正常。 如果守护进程以当前登录用户的身份运行,那么命令行工具应用程序可以正常启动外部应用程序。 如果守护进程以root用户身份运行,则命令行工具应用程序无法启动外部应用程序。 如果守护进程以root用户身份运行,则使用NSWorkspace打开应用程序似乎不起作用 有
有人知道从以root用户身份运行的守护进程打开另一个应用程序的正确方法吗?这可能是您运行的MacOS中的安全限制 我建议做的是创建一个代码签名的“助手工具”,它将自己(通过setuid——在代码签名的应用程序之外我不会这么做)重置为当前登录用户的userid,然后使用NSWorkspace技巧在该用户上下文中启动应用程序 不过,创建辅助工具并不是件小事。这些宏大的概念在苹果的
看一看,它显示了如何安装可以设置用户权限的助手工具,然后修改其助手工具代码以启动应用程序。这是一个太复杂的主题,无法在StackOverflow答案中真正解决。简而言之,守护进程无法可靠地启动应用程序。要获得详细的答案,请阅读苹果的。我最终通过使用此链接中提到的代码获取“控制台用户”的uid和gid:
该链接显示了如何使用
SCDynamicStoreCreate()
和SCDynamicStoreCopyConsoleUser()
获取“控制台用户”uid和gid的示例
获取uid和gid后,只需将uid和gid设置为console用户的uid和gid,然后再使用NSWorkspace打开应用程序,这就帮了我的忙。谢谢Michael。你能告诉我如何获取当前登录用户的用户名吗。