Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Mac OS X:从守护进程使用NSWorkspace启动应用程序不会';如果守护进程以root用户身份运行,则无法工作_Macos_Daemon_Launchd - Fatal编程技术网

Macos Mac OS X:从守护进程使用NSWorkspace启动应用程序不会';如果守护进程以root用户身份运行,则无法工作

Macos Mac OS X:从守护进程使用NSWorkspace启动应用程序不会';如果守护进程以root用户身份运行,则无法工作,macos,daemon,launchd,Macos,Daemon,Launchd,我使用Xcode创建了一个命令行工具应用程序。 在那个应用程序中,我使用NSWorkspace启动了另一个应用程序包(.app),如这里所建议的。 在我尝试使用launchctl作为守护进程启动命令行工具应用程序之前,一切似乎都很正常。 如果守护进程以当前登录用户的身份运行,那么命令行工具应用程序可以正常启动外部应用程序。 如果守护进程以root用户身份运行,则命令行工具应用程序无法启动外部应用程序。 如果守护进程以root用户身份运行,则使用NSWorkspace打开应用程序似乎不起作用 有

我使用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。你能告诉我如何获取当前登录用户的用户名吗。