AuthorizationExecuteWithPrivileges()作为root错误

| 我是可可的初学者。 我只想在我的Cocoa App中启动Apache和其他进程。 这是我的代码:
    OSStatus myStatus;
    AuthorizationFlags myFlags = kAuthorizationFlagDefaults;
    AuthorizationRef myAuthorizationRef;
    FILE *pipe = NULL;
    myStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, myFlags, &myAuthorizationRef);
    AuthorizationItem myItems = {kAuthorizationRightExecute, 0, NULL, 0};
    AuthorizationRights myRights = {1, &myItems};
    myFlags = kAuthorizationFlagDefaults | 
    kAuthorizationFlagInteractionAllowed |
    kAuthorizationFlagPreAuthorize |
    kAuthorizationFlagExtendRights;
    myStatus = AuthorizationCopyPrivilegedReference (&myAuthorizationRef,kAuthorizationFlagDefaults);
    myStatus = AuthorizationCopyRights (myAuthorizationRef,&myRights, NULL, myFlags, NULL ); 

    char *tool = \"/usr/sbin/apachectl\";
    char *args[] = { \"start\",NULL} ;    

    myStatus = AuthorizationExecuteWithPrivileges(myAuthorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe);
    char c[100];
    int n=fread(c,1,100,pipe);
    c[n] = \'\\0\';
    NSLog(@\"%s\\n\",c);
theResult:此操作需要root当我运行\'whoami \'时,我是\'root \',但是当我运行getuid()时,我是\'501 \'... 我尝试使用setuid(0);但这没有设置! 你能帮助我吗?谢谢     
已邀请:
我将为uid = 501的用户定义对/ etc / sudoers中的/ usr / sbin / apachectl的访问,并执行\“ sudo / usr / sbin / apachectl \”而不是代码中的/ usr / sbin / apachectl。     
我有这个完全相同的问题。 AuthorizationExecuteWithPrivileges允许您升级对root的许可,但不会自动进行(我想保留用户会话或其他内容)。 我最终制作了一个通用的可执行文件,该文件将通过AuthorizationExecuteWithPrivileges运行,然后该可执行文件将setuid设置为root,然后执行您实际上想以root身份运行的进程。 这是setuid包装器可执行文件的源代码:
#include <stdio.h>

int main(int argc, char** argv) {
  if (argc < 2) {
    printf(\"not enough arguments\\n\");
    return -1;
  }
  if (0 != setuid(0)) {
    printf(\"setuid failed.\\n\");
    return -3;
  }
  int i;
  char** argvz = (char**)malloc(sizeof(char*) * (argc - 1));
  for (i = 1; i < argc; i++) {
    argvz[i - 1] = argv[i];
  }

  execv(argv[1], argvz);
  printf(\"execv returned?\\n\");
  return -2;
}
然后,基本上按以下方式运行(通过AuthorizationExecuteWithPrivileges调用):
setuid my-program-to-run and arguments to pass
它将setuid作为root,然后使用给定的args运行有问题的程序。 请注意,您必须从AuthorizationExecuteWithPrivileges调用setuid,因为只有AuthorizationExecuteWithPrivileges创建的pid才具有升级权限(setuid将执行并用您自己的进程替换)。     
我正面临着同样的问题! 太疯狂了,whoami返回“ root”,root命令返回“ root required”! sudoers解决方案可能有效,但我认为我们必须在setuid位周围进行搜索,如此处所写https://github.com/notbrien/OSXSlightlyBetterAuth/blob/master/OSXSlightlyBetterAuth.m#L94     

要回复问题请先登录注册