Mountain Lion Privileged Helper Daemon状态

时间:2012-09-19 18:31:52

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

我正在为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

2 个答案:

答案 0 :(得分:0)

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

这是一个从应用程序中成为root的代码片段。它将使用您在从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);
}

答案 1 :(得分:0)

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