我正在为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)
答案 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。