Запуск AppleScript с повышенными привилегиями из Objective C

Я пытаюсь выполнить деинсталлятор (написанный на AppleScript) через AuthorizationExecuteWithPrivileges. Я настраиваю свои права после создания пустой ссылки на авторизацию следующим образом:

    char *tool = "/usr/bin/osascript";
    AuthorizationItem items = {kAuthorizationRightExecute, strlen(tool), tool, 0};
    AuthorizationRights rights = {sizeof(items)/sizeof(AuthorizationItem), &items};
    AuthorizationFlags flags = kAuthorizationFlagDefaults |
                               kAuthorizationFlagExtendRights |
                               kAuthorizationFlagPreAuthorize |
                               kAuthorizationFlagInteractionAllowed;
    status = AuthorizationCopyRights(authorizationRef, &rights, NULL, flags, NULL);

Позже я звоню:

    status = AuthorizationExecuteWithPrivileges(authorizationRef, tool, kAuthorizationFlagDefaults, (char *const *)args, NULL);

На Snow Leopard это работает нормально, но на Leopard я получаю в syslog.log следующее:

Apr 19 15:30:09 hostname /usr/bin/osascript[39226]: OpenScripting.framework - 'gdut' event blocked in process with mixed credentials (issetugid=0 uid=501 euid=0 gid=20 egid=20)
Apr 19 15:30:12: --- last message repeated 1 time ---
...
Apr 19 15:30:12 hostname [0x0-0x2e92e9].com.example.uninstaller[39219]: /var/folders/vm/vmkIi0nYG8mHMrllaXaTgk+++TI/-Tmp-/TestApp_tmpfiles/Uninstall.scpt: 
Apr 19 15:30:12 hostname [0x0-0x2e92e9].com.example.uninstaller[39219]: execution error: «constant afdmasup» doesn’t understand the «event earsffdr» message. (-1708)

После изучения этого в течение нескольких часов мое первое предположение состоит в том, что Leopard почему-то не хочет делать то, что делаю я, потому что он знает, что находится в ситуации setuid, и блокирует вызовы, которые спрашивают о специфических для пользователя вещах в applescript.

Я все делаю неправильно? Я просто хочу запустить эквивалент "sudo /usr/bin/osascript..."

Редактировать:

FWIW, первая строка, которая вызывает "ошибку выполнения":

set userAppSupportPath to (POSIX path of (path to application support folder from user domain))

Однако даже с пустым скриптом (при запуске argv, завершении запуска и все) я все равно получаю сообщение «gdut».


person devguydavid    schedule 19.04.2010    source источник
comment
Вам действительно не следует писать установщики на AppleScript. Пожалуйста, выберите любой другой язык.   -  person Nicholas Riley    schedule 20.04.2010
comment
Да, в итоге я перевел все на obj-c.   -  person devguydavid    schedule 11.05.2010


Ответы (1)


Согласно этой ветке. http://forums.macosxhints.com/showthread.php?t=90952&page=3 Похоже, что для OS X было сделано обновление безопасности, которое блокирует доступ к корневым скриптам setuid через AppleScript.

Я подозреваю, что этот механизм также блокирует ваш код.

К сожалению, я думаю, это означает, что это не работает «по замыслу».

person Michael Lamb    schedule 11.06.2010
comment
Вот соответствующая база знаний: support.apple.com/kb/HT2647 Описание: проблема дизайна существует в библиотеках Open Scripting Architecture при определении того, следует ли загружать подключаемые модули добавления сценариев в приложения, работающие с повышенными привилегиями. Отправка команд добавления сценариев в привилегированное приложение может разрешить выполнение произвольного кода с этими привилегиями. Это обновление устраняет проблему, не загружая подключаемые модули сценариев в приложения, работающие с системными привилегиями. Похоже, это именно то, что происходит с вашим кодом. - person Michael Lamb; 12.06.2010