2012-09-19 33 views
3

我正在构建一个10.8+的应用程序,其中包括修补文件。由于这个功能,我创建了一个“PrivilegedHelperTool”并且安装为KeepLive = YES RunAtLoad = YES(所以它始终运行)。我也使用XPC通过一个GUI应用程序(菜单)山狮特权助手守护进程状态

我想能够检查是否安装了“PrivilegedHelperTool”,并且正在运行并且迄今为止检查安装的最佳方法发现是在/ Library/LaunchDaemons /中查找plist,并检查二进制文件是在/ Library/PrivilegedHelperTools中。

这真的是最好的方法吗?

而且我没有发现任何可靠的方法来检查,如果没有PrivilegedHelperTool已经是根(如须藤launchctl列表)

我添加了使用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

从苹果在这里跟进 https://devforums.apple.com/message/731960#731960 – drunknbass

+0

这可能不是最好的解决方案,但我能想到的最简单。既然你已经有消息,为什么不使用那个?你发送守护进程消息,守护进程返回你需要的信息(uid_t,无论什么)。如果它没有运行,守护进程将不会有回复。另外,如果你不想依赖消息传递来知道它是否正在运行,也许ps的源代码可能会帮助你。 – YllierDev

+0

编号喜欢有更好的粮食控制比“释放载体pidgin,并希望它返回”。 守护进程可能无法运行(不太可能) 守护程序可能运行,但删除(也许边缘情况?) 等 我宁愿知道守护程序没有运行,并要求须藤启动它与最坏的假设并重新安装它在麻烦的第一个迹象(XPC消息没有响应) – drunknbass

回答

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); 
} 
+0

我的问题是没有成为根。问题是帮助者是具有root权限并被安装的东西。该GUI前端到这个帮助要知道, 是它安装? 是它运行? 等 我没有看到GUI的路要走,如果它的运行W/O根,它不会是足够的查询。 – drunknbass

0

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