1

У меня есть .pkg, который должен быть установлен. Это в основном для обновления моего приложения, имеющего несколько компонентов. Пакет содержит агента, демона и помощника. В Post скрипт запускаю Агента через Sudo $ USER launchctl load /Library/LaunchAgent/myApp.plist. Я хочу автоматизировать установку pkg. Для установки этого pkg используется командная строка установщика. Это прекрасно работает, когда я запускаю приложение из XCode и pkg чисто установлен.

Но когда я не запускаю свое приложение из режима отладки в XCode, и мое приложение установлено, и я пытаюсь установить pkg с помощью вспомогательного инструмента (работающего от имени пользователя root), выполняется команда установщика. Но проблема с загрузкой агента. Агент никогда не запускается.

Но когда я использую команду Su вместо команды SUDO, чтобы загрузить агента, который использует
su -l $ USER -c "/bin/launchctl load /Library/LaunchAgents/myApp.plist", агент запускается.

Но у меня возникли проблемы с использованием SU, из-за которого установка вспомогательного инструмента впоследствии не удалась.

Итак, 1. почему команда SUDO не работает и не может загрузить агента, когда он запускается из инструмента, работающего от имени пользователя root (Этот инструмент был запущен демоном).

  1. Если я загружаю Агента через SU, установка моего вспомогательного инструмента завершится неудачно.

Обновление:::: Я смог запустить Агент. Но проблема не устранена, потому что не удается установить вспомогательный инструмент, который пытается выполнить аутентификацию. Вот код аутентификации: AuthorizationRef authRef = NULL; AuthorizationItem authItem = {kSMRightBlessPrivilegedHelper, 0, NULL, 0}; AuthorizationRights authRights = {1, & authItem}; AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights;

OSStatus status=AuthorizationCreate(&authRights, kAuthorizationEmptyEnvironment, flags, &authRef);
if (status != errAuthorizationSuccess) 
{
    DLog(@"Failed to create AuthorizationRef, return code %i", status);
}
else
{
    result = SMJobBless(kSMDomainSystemLaunchd, (__bridge CFStringRef)label, authRef, &outError);
    if (!result && error)
    {
        *error = (__bridge NSError *)(outError);
    }
}

0