Задачи служб авторизации

Эта глава обеспечивает инструкции и примеры кода для задач, которые можно выполнить с Authorization Services. Можно адаптировать эти выборки в собственном приложении к

Простое, самоограничивающее приложение должно ограничить пользователя в собственных операциях приложения с минимальными проблемами безопасности — например, приложение классов-и-копий могло бы только позволить регистратору создавать копии. Считайте Авторизацию в Простом, Самоограниченном приложении, если у Вас есть приложение самоограничения.

Если у Вас есть factored приложение — например, приложение, которое должно выполнить работу как корень, такой как перезапуск демона — необходимо читать и Авторизовывающий в Простом, Самоограниченном приложении и Авторизовывающий в Приложении Factored.

Если Ваш установщик должен выполнить привилегированную работу, считайте Вызов Привилегированного Установщика для наблюдения примера использования установщика Authorization Services.

Посмотрите Пример кода> Безопасность для примеров приложения, выполняющих ограниченные системой привилегированные операции.

Авторизовывая в простом, самоограниченном приложении

Простое, самоограниченное приложение использует Authorization Services для выполнения задач, описанных в следующих разделах:

Создание ссылки авторизации без прав

Сервер безопасности использует ссылку авторизации для доступа к состоянию сеанса авторизации, включающего любые сохраненные учетные данные. Для Вашего приложения нужна только одна ссылка авторизации.

Вы используете AuthorizationCreate функция для выделения памяти для ссылки авторизации. Фрагмент кода в Перечислении 2-1 показывает вызов AuthorizationCreate функция, создающая ссылку авторизации без прав. Ссылка авторизации без прав полезна, если права сразу не необходимы, но ссылка авторизации требуется так, это может использоваться в различных частях приложения. Например, в приложении классов-и-копий, ссылка авторизации могла бы быть создана, когда приложение запускается, но права не требуют, пока пользователь не пытается создать копии.

Перечисление 2-1  , Создающее ссылку авторизации без прав

AuthorizationRef myAuthorizationRef;
OSStatus myStatus;
myStatus = AuthorizationCreate (NULL, kAuthorizationEmptyEnvironment,
            kAuthorizationFlagDefaults, &myAuthorizationRef);

AuthorizationCreate функция берет четыре параметра. Первым является набор прав авторизации. С тех пор NULL передается, никакие права не авторизовываются в это время. Второй параметр является в настоящее время не реализующейся средой авторизации; передача kAuthorizationEmptyEnvironment. Третий параметр является опциями авторизации. Константа kAuthorizationFlagDefaults передается, потому что приложение не запрашивает прав. Четвертый параметр является адресом ссылки авторизации, которую Вы объявили. По возврату ссылка авторизации относится к текущему сеансу авторизации. Если ссылка авторизации создается успешно, функциональные возвраты errAuthorizationSuccess.

Запрос Авторизации описывает, как использовать AuthorizationCopyRights и AuthorizationCreate функции для запроса авторизации. Когда Ваше приложение будет сделано со ссылкой авторизации, используйте AuthorizationFree функционируйте, как описано в Выпуске Ссылки Авторизации.

Запрос авторизации

После создания ссылки авторизации можно тогда запросить авторизацию. Ваше приложение должно сразу выполнить авторизацию перед каждой привилегированной работой. В случае примера классов-и-копий, авторизация запросов приложения сразу прежде, чем создать копию.

Когда Ваша авторизация запросов приложения, Сервер безопасности может запросить пользователя аутентифицировать. Authorization Services позволяет Вам в полной мере пользоваться архитектурой плагина аутентификации Сервера безопасности для контакта с аутентификацией для Вас. Вместо имени пользователя и пароля, аутентификация может использовать цифровые отпечатки или смарт-карты, но Ваш код приложения остается то же.

Рисунок 1-3 показывает диалог аутентификации, что обеспечивает Сервер безопасности. Пользователь вводит пользовательское имя администратора и пароль и нажимает «OK». Сервер безопасности тогда использует имя пользователя и пароль, чтобы аутентифицировать и авторизовать пользователя.

Авторизация требует создания набора прав авторизации и опций авторизации использовать в вызове для функций AuthorizationCopyRights или AuthorizationCreate. В Вашем приложении запросите авторизацию путем выполнения задач, описанных в следующих разделах:

Создание набора прав авторизации

Для авторизации пользователя для определенных прав необходимо создать набор прав авторизации для передачи Серверу безопасности через AuthorizationCopyRights или AuthorizationCreate функции. Набор прав авторизации состоит из массива элемента авторизации и числа элементов в массиве элемента авторизации. Массив элемента авторизации содержит информацию о правах, которые запрашивает Ваше приложение.

Каждый элемент в массиве элемента авторизации состоит из четырех данных:

  • Имя права

  • Значение, содержащее дополнительные данные, принадлежащие вправо

  • Длина байта value поле

  • Дополнительные флаги

Перечисление 2-2 показывает пример массива элемента авторизации. В большинстве случаев, при создании элемента для права, Вы устанавливаете value поле к NULL, и valuelength и flags поля к 0. Необходимо установить name поле к имени права Вы запрашиваете. Для получения информации об именовании Ваших собственных прав посмотрите Права.

Перечисление 2-2  , Создающее массив элемента авторизации

AuthorizationItem myItems[2];
 
myItems[0].name = "com.myOrganization.myProduct.myRight1";
myItems[0].valueLength = 0;
myItems[0].value = NULL;
myItems[0].flags = 0;
 
myItems[1].name = "com.myOrganization.myProduct.myRight2";
myItems[1].valueLength = 0;
myItems[1].value = NULL;
myItems[1].flags = 0;

Например, приложение классов-и-копий могло бы запросить право com.myOrganization.myProduct.transcripts.create. valueLength, value, и flags поля были бы не использованы и набор к 0, NULL, и 0, соответственно.

Перечисление 2-3 показывает пример набора прав авторизации. В наборе прав авторизации, count поле содержит число прав в массиве элемента авторизации, в то время как items полевые точки к элементу авторизации выстраивают Вас создаваемый.

Перечисление 2-3  , Создающее ряд прав авторизации

AuthorizationRights myRights;
myRights.count = sizeof (myItems) / sizeof (myItems[0]);
myRights.items = myItems;

Указание опций авторизации

Вы используете опции авторизации сообщить Серверу безопасности, как продолжить с AuthorizationCopyRights и AuthorizationCreate функции. Путем установки опций авторизации можно использовать эти функции для

  • Авторизуйте частичные права

  • Авторизуйте все права

  • Предварительно авторизуйте права

Можно включать с этими опциями опцию взаимодействовать с пользователем. Сервер безопасности требует, чтобы взаимодействие с пользователем выполнило аутентификацию. Наиболее распространенная комбинация авторизовывает все права и позволяет взаимодействие с пользователем. Перечисление 2-4 показывает пример опций авторизации для авторизации.

Перечисление 2-4  , Указывающее опции авторизации для авторизации

AuthorizationFlags myFlags;
myFlags = kAuthorizationFlagDefaults |
            kAuthorizationFlagInteractionAllowed |
            kAuthorizationFlagExtendRights;

kAuthorizationFlagDefaults постоянные нули битовая маска. kAuthorizationFlagExtendRights постоянный дает Серверу безопасности команду предоставлять права. Без этого флага, AuthorizationCopyRights и AuthorizationCreate функции возвратили бы надлежащий код ошибки, но никакие права не будут расширены на пользователя.

Если Ваше приложение не требует, чтобы все права были открыты доступ, можно включать kAuthorizationFlagPartialRights постоянный для запроса частичной авторизации. Можно тогда определить, что позволить пользователю делать, на основе которого исправляет предоставления Сервера безопасности. Перечисление 2-5 показывает пример установки опций авторизации для частичной авторизации.

Перечисление 2-5  , Указывающее опции авторизации для частичной авторизации

myFlags = kAuthorizationFlagDefaults |
            kAuthorizationFlagInteractionAllowed |
            kAuthorizationFlagExtendRights |
            kAuthorizationFlagPartialRights;

Посмотрите Запрос Предварительной авторизации учиться что опции авторизации установить для предварительной авторизации.

Авторизация

Фрагмент кода в Перечислении 2-6 показывает вызов AuthorizationCopyRights функционируйте на основе ссылки авторизации, и права авторизации устанавливают Вас создаваемый и опции авторизации, которые Вы указали. В примере классов-и-копий, AuthorizationCopyRights функция используется для авторизации права создать копию.

Перечисление 2-6  , Авторизовывающее права

myStatus = AuthorizationCopyRights (myAuthorizationRef, &myRights,
        kAuthorizationEmptyEnvironment, myFlags, NULL);

Первый параметр является ссылкой авторизации, создаваемой в Создании Ссылки Авторизации Без Прав. Второй параметр является набором прав авторизации, создаваемым в Создании Набора Прав Авторизации. Третий параметр является средой авторизации. Среда авторизации в настоящее время не реализуется, так передача kAuthorizationEmptyEnvironment. Четвертый параметр является набором опций авторизации в Указании Опций Авторизации.

Пятый параметр полезен при авторизации частичных прав как показано в Перечислении 2-7. Этот параметр указывает на, пустые авторизованные права устанавливают Вас, объявляют. По возврату это состоит из прав, которые фактически авторизовывает Сервер безопасности. Если Вы создаете указатель на авторизованный набор прав, то необходимо выпустить его, как описано в Выпуске Массива Элемента Авторизации.

Перечисление 2-7  , Авторизовывающее частичные права

AuthorizationRights *myAuthorizedRights;
myStatus = AuthorizationCopyRights (myAuthorizationRef, &myRights,
            kAuthorizationEmptyEnvironment, myFlags,
            &myAuthorizedRights);

AuthorizationCopyRights функциональные возвраты errAuthorizationSuccess если Сервер безопасности предоставляет все права. Можно использовать статус возврата, чтобы определить, может ли пользователь выполнить привилегированную работу.

Можно использовать набор прав авторизации и опции авторизации запросить авторизацию при создании ссылки авторизации.

Перечисление 2-8 показывает авторизацию объединения в качестве примера с AuthorizationCreate функция.

Перечисление 2-8  , Создающее ссылку авторизации с правами

myStatus = AuthorizationCreate (&myRights, kAuthorizationEmptyEnvironment,
            myFlags, &myAuthorizationRef);

Можно также использовать AuthorizationCreate функция для авторизации пользователя для разовой привилегированной работы. Однократная авторизация полезна, если Ваше приложение должно авторизовать только один раз, когда это выполняется. Перечисление 2-9 показывает пример того, как использовать набор прав авторизации и опции авторизации с AuthorizationCreate функция, не производя ссылку авторизации. Передача NULL вместо ссылки авторизации.

Перечисление 2-9  вызов однократной авторизации

myStatus = AuthorizationCreate (&myRights, kAuthorizationEmptyEnvironment,
            myFlags, NULL);

Выпуск массива элемента авторизации

Когда Вы закончите с набором элемента авторизации в Перечислении 2-7, вызовите AuthorizationFreeItemSet функция, как показано в Перечислении 2-10, для выпуска памяти это использует. Используйте эту функцию только на массивах элемента авторизации, которые Сервер безопасности выделяет, такие как используемые в AuthorizationCopyRights и AuthorizationCopyInfo функции.

Перечисление 2-10  , Выпускающее массив элемента авторизации

myStatus = AuthorizationFreeItemSet (myAuthorizedRights);

Выпуск ссылки авторизации

Прежде, чем выйти из Вашего приложения, или в любое время Вы хотите закончить текущий сеанс авторизации, вызвать AuthorizationFree функционируйте для выпуска ссылки авторизации. Например, приложение классов-и-копий ожидало бы, пока пользователь не выходит из приложения прежде, чем выпустить ссылку авторизации. Используя ту же авторизацию ссылаются каждый раз, когда пользователь создает копию, позволяет Серверу безопасности снова использовать любые не истекшие совместно используемые учетные данные. Напротив, действие, такое как пользователь, нажимающий кнопку открытой блокировки в Сетевой предпочтительной области, может инициировать выпуск ссылки авторизации, требуя, чтобы пользователь повторно авторизовал, когда она нажимает кнопку закрытой блокировки.

Сегмент кода в Перечислении 2-11 показывает пример использования AuthorizationFree функция. Необходимо передать ссылку авторизации и опции авторизации. Для опций авторизации передайте константу kAuthorizationFlagDefaults если Вы хотите отменить учетные данные, связанные с текущим процессом или передать константу kAuthorizationFlagDestroyRights выпускать все совместно используемые учетные данные от всех процессов, использующих их.

Перечисление 2-11  , Выпускающее ссылку авторизации

myStatus = AuthorizationFree (myAuthorizationRef,
            kAuthorizationFlagDestroyRights);

Авторизация в приложении Factored

Приложения Factored, или ограниченный системой или самоограниченный, используют приложение, чтобы управлять графическим интерфейсом пользователя и непривилегированными операциями и использовать отдельный инструмент помощника для выполнения привилегированных операций.

Считайте Using Authorization Services в Приложении Factored для описания использования Authorization Services в factored приложении и Using Authorization Services в Инструменте Помощника для описания использования Authorization Services в инструменте помощника.

Используя службы авторизации в приложении Factored

Можно использовать Authorization Services в factored приложении для выполнения задач, описанных в следующих разделах:

Примером factored приложения является тот, перезапускающий интернет-демона. В то время как инструмент помощника перезапускает демона, приложение выполняет все непривилегированные операции. Приложение создает ссылку авторизации и предварительно авторизовывает право перезапустить интернет-демона. Приложение использует результат определить, запустить ли инструмент помощника. Приложение создает внешнюю версию ссылки авторизации и передает ее инструменту помощника. Когда ссылка авторизации больше не необходима, приложение выпускает ее.

Создание ссылки авторизации

Создание ссылки авторизации в factored приложении совпадает с в простом, самоограничивающем приложении. Посмотрите Создание Ссылки Авторизации Без Прав изучить, как создать ссылку авторизации.

Запрос предварительной авторизации

Необходимо предварительно авторизовать права прежде, чем вызвать инструмент помощника. Используя результаты предварительной авторизации, можно препятствовать тому, чтобы неавторизованный пользователь вызвал инструмент помощника. Выполнение так экономит время запуска нового процесса и использования ресурсов, а также сохранения пользователя от подготовки выполнить работу, которую у него нет полномочий выполнить.

Предварительная авторизация требует создания набора прав авторизации и опций авторизации использовать в вызове для функций AuthorizationCopyRights или AuthorizationCreate. В Вашем приложении Вы предварительно авторизовываете пользователя путем выполнения шагов, описанных в следующих разделах:

Создание набора прав перед авторизацией

Набор прав перед авторизацией совпадает с набором прав авторизации, как описано в Создании Набора Прав Авторизации.

Указание опций авторизации для предварительной авторизации

Опции авторизации для предварительной авторизации подобны опциям авторизации для авторизации и частичной авторизации, описанной в Указании Опций Авторизации. Единственная разница между предварительной авторизацией и авторизацией - то, что Вы не используете результат определить, может ли пользователь выполнить привилегированную работу. Вместо этого необходимо использовать результат определить, может ли пользователь быть авторизован в более позднее время.

Перечисление 2-12 показывает пример установки опций авторизации для предварительной авторизации. kAuthorizationFlagDefaults постоянные нули битовая маска. kAuthorizationFlagExtendRights постоянный говорит Серверу безопасности расширять любые права, предоставленные до пользователя. kAuthorizationFlagInteractionAllowed постоянный говорит Серверу безопасности, что он может взаимодействовать с пользователем в целях аутентификации. kAuthorizationFlagPreAuthorize постоянный говорит Серверу безопасности предварительно авторизовывать права, которые требуют.

Перечисление 2-12  , Указывающее опции авторизации для предварительной авторизации

AuthorizationFlags myFlags;
myFlags = kAuthorizationFlagDefaults |
            kAuthorizationFlagExtendRights |
            kAuthorizationFlagInteractionAllowed |
            kAuthorizationFlagPreAuthorize;
Предварительная авторизация

Вызов AuthorizationCopyRights или AuthorizationCreate функция является тем же для предварительной авторизации, как это для авторизации. См. Перечисление 2-6 в разделе Authorizing для примеров.

Создание внешней ссылки авторизации

После создания ссылки авторизации и предварительной авторизации прав, необходимо передать ссылку авторизации на инструмент помощника. Совместное использование ссылки авторизации позволяет инструменту помощника использовать любые учетные данные, которые являются частью сеанса авторизации factored приложения. При передаче ссылки авторизации на инструмент помощника диалоговое окно авторизации может показать путь приложения, а не путь к инструменту помощника. Это также позволяет системе определить, должно ли диалоговое окно авторизации иметь клавиатурный фокус.

Одна проблема со ссылкой авторизации состоит в том, что это не находится в форме, которая может быть передана от одного процесса до другого. Для решения этой проблемы Authorization Services обеспечивает функцию для перевода ссылки авторизации во внешнюю ссылку авторизации, которую можно передать инструменту помощника.

Для создания внешней ссылки авторизации объявите переменную типа AuthorizationExternalForm и передайте его AuthorizationMakeExternalForm функция вместе с существующей ссылкой авторизации. По возврату та переменная содержит форму переводимую ссылки авторизации. Перечисление 2-13 показывает пример создания внешней ссылки авторизации.

Перечисление 2-13  , Создающее внешнюю ссылку авторизации

AuthorizationExternalForm myExternalAuthorizationRef;
myStatus = AuthorizationMakeExternalForm (myAuthorizationRef,
            &myExternalAuthorizationRef);

Читать “Retrieving an Authorization Reference” изучить, как получить ссылку авторизации из внешней ссылки авторизации в Вашем инструменте помощника.

Вызов инструмента помощника

Когда Вы будете готовы вызвать свой инструмент помощника, передайте внешнюю ссылку авторизации на инструмент с помощью некоторой формы межпроцессного взаимодействия, такого как коммуникационный канал. Для примера приложения и самовосстанавливающего инструмента помощника, посмотрите http://developer .apple.com/samplecode/Sample_Code/Security.htm. Для получения дополнительной информации о межпроцессных взаимодействиях посмотрите Внутренний OS X: Системный Обзор.

Выпуск ссылки авторизации

Выпуск ссылки авторизации в factored приложении совпадает с описанный в Выпуске Ссылки Авторизации.

Используя службы авторизации в инструменте помощника

Можно использовать Authorization Services в инструменте помощника для выполнения задач, описанных в следующих разделах:

Например, инструмент помощника, перезапускающий интернет-демона, получает ссылку авторизации из внешней ссылки авторизации, переданной приложением. Тогда инструмент помощника запрашивает авторизацию сразу прежде, чем перезапустить интернет-демона.

Если Ваш инструмент помощника является фактически инструментом помощника самовосстановления, необходимо также считать Восстановление Инструмента Помощника.

Получение ссылки авторизации

Для совместного использования сеанса авторизации factored приложение передает внешнюю ссылку авторизации на инструмент помощника (см. Создание Внешней Ссылки Авторизации). В инструменте помощника Вы используете AuthorizationCreateFromExternalForm функция для получения ссылки авторизации из внешней ссылки авторизации.

Перечисление 2-14 показывает пример с помощью AuthorizationCreateFromExternalForm функция. В этом примере внешняя ссылка авторизации читается в из коммуникационного канала между процессом инструмента помощника и родительским процессом. Вы тогда передаете внешнюю ссылку авторизации на функцию AuthorizationCreateFromExternalForm. По возврату, myAuthorizationRef ссылка авторизации.

Перечисление 2-14  , Получающее ссылку авторизации

AuthorizationRef myAuthorizationRef;
AuthorizationExternalForm myExternalAuthorizationRef;
OSStatus myStatus;
 
/* *** You should read in the external authorization reference into
        myExternalAuthorizationRef here. *** */
 
myStatus = AuthorizationCreateFromExternalForm (&myExternalAuthorizationRef,
            &myAuthorizationRef);

Выполнение авторизации

Выполнение авторизации в Вашем инструменте помощника совпадает с ним, для простых, самоограниченных приложений. Посмотрите Запрос Авторизации для получения дополнительной информации.

Выполнение привилегированной работы

Необходимо использовать результат авторизации определить, разрешают ли пользователю выполнить привилегированную работу. Нет никаких функций Authorization Services, требуемых для того, чтобы фактически выполнить привилегированную работу.

Восстановление инструмента помощника

Если Ваш инструмент помощника должен работать как корень для выполнения привилегированных операций, таких как перезапуск интернет-демона, то это должно иметь свой setuid набор битов. Инструменты, имеющие setuid набор битов (иногда называемый setuid инструменты) должны быть Мужественными двоичными файлами, потому что двоичные файлы CFM не поддерживают setuid или setgid (идентификатор группы набора) бит. То, когда Вы устанавливаете свою программу, Ваш установщик должен установить setuid инструмента помощника, укусило и установило его владельца для укоренения.

В OS X v10.1 и ранее, когда пользователь перемещает setuid инструмент в другой объем или копирует его от одного места до другого, setuid укусил, сбрасывается файловой системой, и группа и владелец изменяются, чтобы соответствовать пользователю, перемещающему setuid инструмент. Это сделано намеренно для сокращения угрозы безопасности, которую setuid инструмент излагает, позволяя любому пользователю выполнить setuid инструмент как корень. С другой стороны, большинство пользователей ожидает, что, когда они копируют приложение или инструмент от одной папки до другого, это будет все еще работать. Таким образом setuid укусил, группа, и владелец должен быть сброшен, не редактируя полномочия в окне терминала. Этот раздел обеспечивает, код, чтобы позволить Вашему setuid инструменту восстанавливать свой собственный setuid укусил, когда происходит эта проблема.

Все setuid инструменты являются возможными проблемами защиты. Этот случай излагает определенную проблему, потому что инструмент самовосстанавливает свой бит setuid, даже если пользователь вмешивается в код setuid инструмента. Как дополнительная защита, Вы могли бы хотеть вывести на экран предупреждение пользователям, выполняя это действие, таким образом, они могут решить продолжать или отменить самооперацию по ремонту, или возможно вынудить пользователя переустановить приложение от установщика.

Можно восстановить setuid, обдумал инструмент помощника путем выполнения задач, описанных в следующих разделах:

Вызов инструмента помощника как корень

Для Вашего инструмента помощника для установки его собственного setuid укусил, инструмент должен иметь полномочия пользователя root. Это - круговая проблема, так как Вы не можете изменить полномочия на своем инструменте помощника, если Ваш инструмент помощника уже не работает как корень. Это то, где функция AuthorizationExecuteWithPrivileges играет роль.

AuthorizationExecuteWithPrivileges функция выполняет любое приложение как корень посредством специального процесса безопасности. Пример кода в Перечислении 2-15 демонстрирует, как инструмент помощника может рекурсивно вызвать себя с полномочиями пользователя root, таким образом, это может восстановить свой собственный бит setuid.

Перечисление 2-15  , Выполняющее инструмент помощника с полномочиями пользователя root

FILE *myCommunicationsPipe = NULL;
char *myArguments[] = {"--self-repair", NULL};
char myPath[MAXPATHLEN];
 
/* *** You should determine the path of your tool here and put the result in
        myPath. *** */
 
myStatus = AuthorizationExecuteWithPrivileges (myAuthorizationRef,
            myPath, kAuthorizationFlagDefaults, myArguments,
            &myCommunicationsPipe);

AuthorizationExecuteWithPrivileges функция ожидает, что Вы передадите пять параметров. Первый параметр является ссылкой авторизации, которую Вы получили как показано в Получении Ссылки Авторизации. Ссылка авторизации позволяет инструменту помощника использовать любые учетные данные, которые являются частью сеанса авторизации factored приложения. Второй параметр является полным путем POSIX инструмента помощника — в этом случае, setuid инструмента — который вызывают. Третий параметр является опциями авторизации. В этой функции этот параметр не реализован, поэтому на данный момент, установите его в kAuthorizationFlagDefaults. Четвертый параметр является завершенным нулем массивом параметров за вызываемый инструмент. Можно использовать этот параметр для передачи любой информации, в которой Вы нуждаетесь от родительского процесса до дочернего процесса. В этом случае, строка "--self-repair" передается, чтобы указать к инструменту помощника, что он должен выполнить код в Перечислении 2-16. Пятый параметр является коммуникационным каналом, таким образом, инструмент помощника может передать данные, это получило от factored приложения до себя.

Установка Setuid укусила

В Перечислении 2-15 инструмент помощника рекурсивно вызывает себя, передавая параметр самовосстановления, --self-repair. Поэтому в том же инструменте помощника, необходимо проверить на параметр самовосстановления и, если это найдено, фиксируйте бит setuid. Посмотрите, что Больше Является Лучшим примером кода (MoreIsBetter) для выборки, самовосстанавливающей setuid инструмент.

Когда Вы вызываете AuthorizationExecuteWithPrivileges функция, Вам нужен способ получить ссылку авторизации, передающуюся в вызове. Перечисление 2-16 показывает код с помощью AuthorizationCopyPrivilegedReference функция для получения ссылки авторизации. Единственное время Вы используете эту функцию, должно получить ссылку авторизации, переданную вызовом AuthorizationExecuteWithPrivileges.

Первый параметр вызова к AuthorizationCopyPrivilegedReference функция является пустой ссылкой авторизации, которую Вы объявляете. Вы не должны вызывать AuthorizationCreate функция. По возврату, контрольным точкам авторизации к копии исходной ссылки авторизации. Второй параметр не реализован, таким образом установите его в kAuthorizationFlagDefaults.

Перечисление 2-16  , Устанавливающее setuid, укусило

myStatus = AuthorizationCopyPrivilegedReference (&myAuthorizationRef,
            kAuthorizationFlagDefaults)

Вызов привилегированного установщика

Иногда, установщик должен установить файлы в каталогах, не принадлежащих пользователю, выполняющему установщик. Это должно быть редким случаем, и необходимо избежать его если вообще возможный. Если этого нельзя избежать, код в Перечислении 2-17 показывает инструмент, работающий /usr/bin/id утилита с дополнительным флагом -un. Путем замены служебного пути и включая собственные флаги, можно использовать этот пример кода для вызова установщика с полномочиями пользователя root. Ваш установщик тогда будет в состоянии выполнить любые привилегированные операции, которых он требует.

Перечисление 2-17  Вызывая привилегированный установщик

#include <Security/Authorization.h>
#include <Security/AuthorizationTags.h>
 
int read (long,StringPtr,int);
int write (long,StringPtr,int);
 
int main() {
 
    OSStatus myStatus;
    AuthorizationFlags myFlags = kAuthorizationFlagDefaults;              // 1
    AuthorizationRef myAuthorizationRef;                                  // 2
 
    myStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment,  // 3
                myFlags, &myAuthorizationRef);
    if (myStatus != errAuthorizationSuccess)
        return myStatus;
 
    {
        AuthorizationItem myItems = {kAuthorizationRightExecute, 0,    // 4
                NULL, 0};
        AuthorizationRights myRights = {1, &myItems};                  // 5
 
        myFlags = kAuthorizationFlagDefaults |                         // 6
                kAuthorizationFlagInteractionAllowed |
                kAuthorizationFlagPreAuthorize |
                kAuthorizationFlagExtendRights;
        myStatus = AuthorizationCopyRights (myAuthorizationRef,        // 7
                                     &myRights, NULL, myFlags, NULL );
    }
 
    if (myStatus != errAuthorizationSuccess) goto DoneWorking;
 
    {
        char myToolPath[] = "/usr/bin/id";
        char *myArguments[] = { "-un", NULL };
        FILE *myCommunicationsPipe = NULL;
        char myReadBuffer[128];
 
        myFlags = kAuthorizationFlagDefaults;                          // 8
        myStatus = AuthorizationExecuteWithPrivileges                  // 9
                (myAuthorizationRef, myToolPath, myFlags, myArguments,
                &myCommunicationsPipe);
 
        if (myStatus == errAuthorizationSuccess)
            for(;;)
            {
                int bytesRead = read (fileno (myCommunicationsPipe),
                        myReadBuffer, sizeof (myReadBuffer));
                if (bytesRead < 1) goto DoneWorking;
                write (fileno (stdout), myReadBuffer, bytesRead);
            }
    }
 
    DoneWorking:
 
    AuthorizationFree (myAuthorizationRef, kAuthorizationFlagDefaults); // 10
 
    if (myStatus) printf("Status: %ld\n", myStatus);
    return myStatus;
}

Вот объяснения пронумерованных строк кода в Перечислении 2-17:

  1. Объявите, что переменная хранит опции авторизации.

  2. Объявите ссылку авторизации.

  3. Используйте AuthorizationCreate функция для инициализации ссылки авторизации. Посмотрите Создание Ссылки Авторизации Без Прав для получения дополнительной информации.

  4. Создайте массив элемента авторизации. Пользователь должен иметь право выполниться для использования AuthorizationExecuteWithPrivileges функция. Для создания права выполнить элемент авторизации установите name поле к kAuthorizationRightExecute, value поля к NULL, valueLength и flags поля к 0. Посмотрите Создание Набора Прав Авторизации для получения дополнительной информации.

  5. Создайте набор прав авторизации. Установите count поле к числу элементов в массиве элемента авторизации и набор items поле для указания на массив элемента авторизации. Посмотрите Создание Набора Прав Авторизации для получения дополнительной информации.

  6. Установите опции авторизации предварительно авторизовать права. Посмотрите Указание Опций Авторизации для Предварительной авторизации для получения дополнительной информации.

  7. Используйте AuthorizationCopyRights функция, чтобы предварительно авторизовать право выполнить Ваш установщик как корень. В этом случае, если пользователь не может предварительно авторизовать, нет никакой причины продолжаться. Посмотрите Авторизацию для получения дополнительной информации.

  8. Установите опции авторизации для AuthorizationExecuteWithPrivileges функция к kAuthorizationFlagDefaults. Другие опции авторизации, такие как указанный kAuthorizationFlagInteractionAllowed постоянный, не необходимы потому что AuthorizationExecuteWithPrivileges функция взаимодействует с пользователем, указываете ли Вы опцию или нет.

  9. Используйте AuthorizationExecuteWithPrivileges функция для вызова установщика. Передайте ссылку авторизации в первом параметре. Передайте полный путь POSIX установщика во втором параметре. Передайте значение по умолчанию опций авторизации в третьем параметре. Передайте любые параметры за установщик в четвертом параметре. Коммуникационный канал к инструменту может быть установлен через пятый параметр. Посмотрите Вызов Инструмента Помощника как Корень для получения дополнительной информации о AuthorizationExecuteWithPrivileges функция.

  10. Выпустите ссылку авторизации использование AuthorizationFree функция. Посмотрите Выпуск Ссылки Авторизации для большего количества подробных данных.