我在我的一个程序中使用authopen
来修改root拥有的文件。从下面的屏幕截图中可以看出authopen
要求输入管理员密码。我想要实现的是对话框显示我的应用程序名称,然后将授权传递给authopen
。
启动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
,因为那时我必须得到比我想要的更多的权利。
答案 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