2010-04-19 4 views
3

Я пытаюсь выполнить деинсталлятор (написанный на AppleScript) через AuthorizationExecuteWithPrivileges. Я настраиваю свои права после создания пустой аутентификации реф так:Запуск AppleScript с повышенными привилегиями от Objective C

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 я получаю следующее в системный журнал .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 как-то не хочет делать то, что я делаю, потому что он знает, что она находится в УИП ситуации и блокирует вызовы, которые запрашивают або ut пользовательские вещи в applescript.

Я все об этом не так? Я просто хочу, чтобы запустить эквивалент "Судо/USR/BIN/osascript ..."

Edit:

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

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

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

+1

Вы действительно не должны писать инсталляторы в AppleScript. Пожалуйста, выберите любой другой язык. –

+0

Yup, я закончил перевод всего на obj-c. – devguydavid

ответ

2

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

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

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

+0

Вот соответствующий KB: http://support.apple.com/kb/HT2647 «Описание: в библиотеках Open Scripting Architecture существует проблема с дизайном при определении того, следует ли загружать плагины добавления сценариев в приложения, работающие с повышенными привилегиями. Отправка команд добавления сценариев в привилегированное приложение может позволить выполнение произвольного кода с этими привилегиями. Это обновление устраняет проблему, не загружая плагины добавления сценариев в приложения, работающие с системными привилегиями ». Это похоже на то, что происходит с вашим кодом. –

Смежные вопросы