3

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

我希望能够检查“PrivilegedHelperTool”是否已安装并运行,到目前为止,我发现检查安装的最佳方法是在 /Library/LaunchDaemons/ 中查找 plist 并检查二进制文件是否在 /库/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

4

2 回答 2

0

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

于 2013-10-21T11:55:33.000 回答
0

当您安装后台助手守护程序时,您需要是 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);
}
于 2012-09-20T10:09:47.423 回答