выполняю скрипт 'do shell script "installer-pkg /Users/alex/Library/Containers/stealth/Data/Public/ Stealth.pkg -target /" with administrator privileges' (код ниже). Долго и нудно пытался выяснить, почему на девелоперской машине то работает, то нет, а у обычного пользователя всегда нет. Пришел к тому, что при установленном приложении в /Applications скрипт не срабатывает вообще, запроса пароля нет, при этом в словаре errorInfo нет ключа NSAppleScriptErrorNumber, eventResult = nil. причина не ясна вообще. На девелоперской же машине, оно нормально выкидывает окно запроса пароля, при отмене обрабатывает ошибку, при вводе пароля - не задумываясь обновляет stealth.app в scratch-dir от paserver'а, а не в /Applications.
Естественно, что из того же ScriptEditor этот же скрипт отлично обновляет приложение, установленное в /Applications.
Есть четкое ощущение, что это маковские заморочки с правами, подскажите, куда копать?
Приложение подписанное обоими сертификами, но не нотаризовано, ибо x32. Delphi Rio, MacOs Mojave 10.14.3
P.S. Собственно, для чего это всё: По согласию пользователя качается файл обновления (.pkg) с сайта, обновляется (желательно в тихом режиме, программа перезапускается). Запуск обновления в ручном режиме я давно сделал, но хотелось бы делать это в автомате, а от пользователя только ввод пароля.
Код:
function runProcessAsAdministrator(const scriptPath: string; Parameters: array
of string; out OutputText : String) : Boolean;
var
appleScript : NSAppleScript;
I : Integer;
eventResult : NSAppleEventDescriptor;
errorInfo : NSDictionary;
cb_ptr : Pointer;
errorNumber : NSNumber;
allArgs,fullScriptLine : String;
scriptExecLine : NSString;
arr : NSArray;
begin
if Length(Parameters) > 0 then
begin
for I := 0 to Length(Parameters)-1 do
allArgs := allArgs + Parameters[i] + ' ';
allArgs := allArgs.TrimRight;
end;
fullScriptLine := scriptPath + ' ' + allArgs;
scriptExecLine := StrToNSStr('do shell script "' + fullScriptLine +'" with administrator privileges');
appleScript := TNSAppleScript.Wrap(TNSAppleScript.Alloc.initWithSource(scriptExecLine));
eventResult := TNSAppleEventDescriptor.Alloc;
eventResult := appleScript.executeAndReturnError(@cb_ptr);
errorInfo := TNSDictionary.Wrap(cb_ptr);
Result := Assigned(eventResult);
if Result then
OutputText := NSStrToStr(eventResult.stringValue)
else
begin
if Assigned(errorInfo) then
begin
cb_ptr := errorInfo.valueForKey(NSAppleScriptErrorNumber);
if Assigned(cb_ptr) then
begin
errorNumber := TNSNumber.Wrap(cb_ptr);
if errorNumber.intValue = -128 then
OutputText := 'The administrator password is required to do this.'
else
OutputText := NSStrToStr(TNSString.Wrap(cb_ptr));
end
else //debug purpose only!!!
begin
i := errorInfo.count; //if we have real error - here will be 5, else 4
cb_ptr := errorInfo.allKeys;//if Dict is empty, this pointer will be zero
if Assigned(cb_ptr) then
begin
arr := TNSArray.Wrap(cb_ptr); //result looks like incorrect
i := arr.Count; //this will return AV always!
for I := 0 to arr.Count - 1 do
OutputText:= NSStrToStr(TNSString.Wrap(arr.objectAtIndex(i)));
end;
end;
end;
ShowMessageMultiplatform('Returnval = ' + Boolean.ToString(Result,TUseBoolStrs.True) + sLineBreak
+ 'OutText = ' + OutputText);
end;
end;
Вопрос
Vizit0r
доброго времени суток!
выполняю скрипт 'do shell script "installer-pkg /Users/alex/Library/Containers/stealth/Data/Public/ Stealth.pkg -target /" with administrator privileges' (код ниже). Долго и нудно пытался выяснить, почему на девелоперской машине то работает, то нет, а у обычного пользователя всегда нет. Пришел к тому, что при установленном приложении в /Applications скрипт не срабатывает вообще, запроса пароля нет, при этом в словаре errorInfo нет ключа NSAppleScriptErrorNumber, eventResult = nil. причина не ясна вообще. На девелоперской же машине, оно нормально выкидывает окно запроса пароля, при отмене обрабатывает ошибку, при вводе пароля - не задумываясь обновляет stealth.app в scratch-dir от paserver'а, а не в /Applications.
Естественно, что из того же ScriptEditor этот же скрипт отлично обновляет приложение, установленное в /Applications.
Есть четкое ощущение, что это маковские заморочки с правами, подскажите, куда копать?
Приложение подписанное обоими сертификами, но не нотаризовано, ибо x32. Delphi Rio, MacOs Mojave 10.14.3
P.S. Собственно, для чего это всё: По согласию пользователя качается файл обновления (.pkg) с сайта, обновляется (желательно в тихом режиме, программа перезапускается). Запуск обновления в ручном режиме я давно сделал, но хотелось бы делать это в автомате, а от пользователя только ввод пароля.
Код:
Ссылка на комментарий
1 ответ на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.