【问题标题】:Mountain Lion Privileged Helper Daemon statusMountain Lion 特权助手守护进程状态
【发布时间】:2012-09-19 18:31:51
【问题描述】:

我正在为 10.8+ 构建一个应用程序,其中必须修补文件。由于这个功能,我创建了一个“PrivilegedHelperTool”并安装为 KeepLive = YES RunAtLoad = YES(所以它一直在运行)。我还使用 XPC over mach 与 GUI 应用程序(菜单栏)进行通信

我希望能够检查“PrivilegedHelperTool”是否已安装并正在运行,到目前为止,我发现检查安装的最佳方法是在 /Library/LaunchDaemons/ 中查找 plist 并检查二进制文件位于 /Library/PrivilegedHelperTools 中。

这真的是最好的方法吗?

我还没有找到可靠的方法来检查 PrivilegedHelperTool(以 root 身份运行)是否已经是 root(例如 sudo launchctl list)

我添加了一个使用 launch.h (/usr/include/launch.h) http://brockerhoff.net/blog/2009/02/02/cocoa-musings-pt-3/ 的包装器 但它只返回用户进程并让最终用户提升权限只是为了检查某些“插件”是否正在运行似乎是错误的。

我所能期望的最好的结果是尝试与我的服务交谈,如果它没有响应,是否认为它“损坏或未运行”? (http://mac-os-forge.2317878.n4.nabble.com/Programmatic-interface-to-launchctl-and-some-other-questions-OS-X-10-5-tp189494p189496.html)

【问题讨论】:

  • 这可能不是最好的解决方案,但我能想到的最简单的解决方案。既然你已经有了消息,为什么不使用那个呢?您向守护程序发送消息,并且守护程序返回您需要的信息(uid_t,等等)。如果它没有运行,守护进程将不会回复。另外,如果您不想依靠消息传递来了解它是否正在运行,也许 ps 的源代码可能会对您有所帮助。
  • 我希望拥有比“释放载体 pidgin 并希望它返回”更精细的粒度控制。守护程序可能没有运行(不太可能) 守护程序可能正在运行但被删除(可能是边缘情况?)等。我宁愿知道一个守护程序没有运行并请求 sudo 来启动它,而不是假设最坏的情况并首先重新安装它故障征兆(XPC 消息未响应)
  • 所以这不是真的“我还没有找到可靠的方法来检查 PrivilegedHelperTool(以 root 身份运行)是否已经是 root(例如 sudo launchctl list)”我的错误部分是因为我是过早地读取管道并错过了一堆,因为当我调试这个插件/守护进程时设置为 OnDemand = YES(当我在 cli 上时并不总是运行)ps 和解析输出是脏的,但应该足够了。跨度>
  • Apple 在他们的开发者论坛上回复了更多细节。 devforums.apple.com/message/732894#732894(需要苹果开发者账号)

标签: objective-c cocoa osx-lion macos-carbon launchd


【解决方案1】:

当您安装后台助手守护程序时,您需要是 root。 因此,要么您的安装程序以适当的权限安装守护程序,要么在您启动应用程序时,您要求用户将自己授权为管理员,以便您可以即时安装守护程序。

这是一个代码 sn-p 成为应用程序的根。它会提示用户使用正常的用户名/密码对话框,您在从 pkg 安装某些东西时也会看到。

OSStatus myStatus;
uid_t   uid = -1;
AuthorizationRights myRights;
AuthorizationFlags myFlags;
AuthorizationItem myItems[1];


uid = geteuid();
if(uid != 0)
{
    myItems[0].name = "com.whatever";
    myItems[0].valueLength = 0;
    myItems[0].value = NULL;
    myItems[0].flags = 0;
    myRights.count = sizeof (myItems) / sizeof (myItems[0]);
    myRights.items = myItems;
    myFlags = kAuthorizationFlagDefaults |
        kAuthorizationFlagInteractionAllowed |
        kAuthorizationFlagExtendRights |
        kAuthorizationFlagPartialRights;
    myStatus = AuthorizationCreate (&myRights, kAuthorizationEmptyEnvironment,myFlags,NULL);
}

【讨论】:

  • 我的问题不是root。问题是助手是具有root权限并已安装的。这个助手的 GUI 前端需要知道,它安装了吗?它在运行吗?等等。我看不到从 GUI 查询它是否在没有 root 的情况下运行的方法,这还不够。
【解决方案2】:

您可以使用sysctl 获取所有正在运行的进程。看看my answer。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多