У меня была точно такая же проблема.AuthorizationExecuteWithPrivileges позволяет вам расширить свое разрешение для root, но не делает это автоматически (я думаю, чтобы сохранить сеанс пользователя или что-то еще).
В итоге я создал общий исполняемый файл, который будет запускаться через AuthorizationExecuteWithPrivileges, а затем этоИсполняемый файл установил бы 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
Он будет установлен как root, а затем запустите соответствующую программу с заданными аргументами.
Обратите внимание, что вы must вызов setuid из AuthorizationExecuteWithPrivileges Поскольку только pid, созданный AuthorizationExecuteWithPrivileges, будет иметь повышенные привилегии (и setuid будет исполнять и заменять процесс своими).