如何预授权authopen?

时间:2009-09-22 14:02:56

标签: macos authorization

我在我的一个程序中使用authopen来修改root拥有的文件。从下面的屏幕截图中可以看出authopen要求输入管理员密码。我想要实现的是对话框显示我的应用程序名称,然后将授权传递给authopen

authopen requires that you type your password.

代码

启动authopen,返回授权的文件描述符。

int pipe[2];

socketpair(AF_UNIX, SOCK_STREAM, 0, pipe);

if (fork() == 0) {      // child
    // close parent's pipe
    close(pipe[0]);
    dup2(pipe[1], STDOUT_FILENO);

    const char *authopenPath = "/usr/libexec/authopen";
    execl(authopenPath,
          authopenPath,
          "-stdoutpipe",
          [self.device.devicePath fileSystemRepresentation],
          NULL);

    NSLog(@"Fatal error, we should never reach %s:%d", __FILE__, __LINE__);
    exit(-1);
} else { // parent
    close(pipe[1]);
}

// get file descriptor through sockets

我真的希望使用AuthorizationExecuteWithPrivileges,因为那时我必须得到比我想要的更多的权利。

4 个答案:

答案 0 :(得分:1)

Apple在OS X 10.9 Mavericks中添加了option to authopen,允许这一点。在此之前似乎是不可能的。

  

-extauth

     

指定authopen应从stdin读取一个AuthorizationExternalForm结构,   将其转换为AuthorizationRef,并尝试使用它来授权open(2)   操作

     

授权应该引用与请求的操作相对应的sys.openfile权限。

     

授权数据将在stdin上提供的任何其他数据之前读取   不包含在使用-w编写的数据中。

我还没有用过,所以我没有任何示例代码。 如果有人,请将其添加到此答案中。

答案 1 :(得分:0)

我想如果你在第一个arg中提供你的应用程序路径:

execl(authopenPath,
      "app path", // <--
      "-stdoutpipe",
      [self.device.devicePath fileSystemRepresentation],
      NULL);

对话框将显示:

app name requires that you type your password

答案 2 :(得分:-1)

你需要直接关注10.4中引入的安全框架,我认为,自10.5以来一直是主要的授权源。 OSX仍在PAM(如Linux)中运行,但/ etc / authorization现在取代了这一点。 Apple确实有一两个代码示例,说明如何以实用的方式为某人授权自己创建一个类/条目(或预先授权/预授权,如允许打印的人)。

答案 3 :(得分:-1)

这个问题很老但似乎有可能,正如本技术说明中所解释的那样: 技术说明TN2095:每个人的授权 http://developer.apple.com/library/mac/#technotes/tn2095/_index.html