【问题标题】:Mac OS X: Launching an app using NSWorkspace from a daemon doesn't work if the daemon is run as rootMac OS X:如果守护程序以 root 身份运行,则无法从守护程序使用 NSWorkspace 启动应用程序
【发布时间】:2013-03-20 02:34:47
【问题描述】:

我使用 Xcode 创建了一个命令行工具应用程序。 在那个应用程序中,我使用 NSWorkspace 来启动另一个应用程序包 (.app),如此处所建议的。 MacOsX: How to launch an application (.app) from a "Command Line Tool" type of app

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

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

【问题讨论】:

    标签: macos daemon launchd


    【解决方案1】:

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

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

    创建辅助工具并非易事。 Apple 的Authorization Services Programming Guide 中描述了宏大的概念。

    看看Apple's "SMJobBless" sample code,它展示了如何安装帮助工具,你可以设置用户权限,然后修改它的帮助工具代码来启动你的应用程序。

    【讨论】:

    • 谢谢迈克尔。你能告诉我如何在代码中获取当前登录用户的用户ID吗?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      获取 uid 和 gid 后,只需将 uid 和 gid 设置为控制台用户的值,然后再使用 NSWorkspace 打开应用程序就可以了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 1970-01-01
        • 2016-06-28
        相关资源
        最近更新 更多