Как повысить привилегии на OSX с помощью Objective C

Моему пользовательскому setup.app на основе Cocoa в Mac OSX, который я создал в Objective C, необходимо установить LaunchDaemon для выполнения задач с повышенными привилегиями, таких как антивирусная программа, которая должна сканировать весь жесткий диск и, следовательно, требует привилегий root. Как я могу заставить мое приложение установки запрашивать у клиента вход в систему с правами администратора, а затем установить этот LaunchDaemon в /Library/LaunchDaemons (и обратите внимание, что я не имею в виду ~/Library/LaunchDaemons)?

В настоящее время я справляюсь с этим, используя AppleScript с правами администратора. Он запрашивает этот логин, а затем AppleScript выполняет копирование в эту папку без жалоб ОС. Однако я предполагаю, что это неправильная техника - что я должен каким-то образом делать это полностью в Objective C?

Обратите внимание, что я не могу использовать SMBlessJob в этом случае, потому что именно по этой причине я создаю Launch Daemon в первую очередь.

ИСХОДНАЯ ИНФОРМАЦИЯ

У меня есть особая потребность в создании пользовательского setup.app — точно так же, как в приложении Norton AV используется пользовательское setup.app. Это связано с тем, что установщики Apple PKG и DMG не разрешают загрузку очень больших файлов (например, определений вирусов) с сервера во время установки с какой-либо дружеской обратной связью. Я имею в виду, что я могу заставить файл PKG загружать файл с сервера при запуске Perl-скрипта или Bash-скрипта, но тогда установщик просто вешает индикатор выполнения на количество минут, которое требуется для загрузки, не давая никакой другой обратной связи для пользователя, за исключением того, что завис индикатор выполнения, и поэтому пользователь думает, что установщик сломался, когда это не так. Вот почему мне пришлось создать свой собственный setup.app, как это сделал Norton для своего AV-приложения.


person Volomike    schedule 28.03.2016    source источник
comment
Пакет, установленный пользователем, получает права администратора, когда пользователь предоставляет свои учетные данные. Он также может содержать сценарии до и после установки. Используйте скрипт в установщике пакетов, чтобы установить демон, скопировав соответствующий plist и запустив его.   -  person TheDarkKnight    schedule 29.03.2016
comment
Но это тормозит очень большую загрузку, которая занимает 10 минут. Это работает, но обеспечивает плохой видимый прогресс относительно того, что происходит. Попробуйте, и вы увидите. Вот почему я сделал специальное приложение для установки, как это сделали Symantec/Norton со своим приложением.   -  person Volomike    schedule 29.03.2016
comment
Я предлагаю не использовать скрипт для загрузки, а установить демон-приложение, которое затем выполнит загрузку за вас.   -  person TheDarkKnight    schedule 29.03.2016


Ответы (1)


Обычно для этого используется SMJobBless. Это тот, который Apple рекомендует сейчас с 2016 года. Вот файл readme.txt для примера проекта Apple:

https://developer.apple.com/library/mac/samplecode/SMJobBless/Listings/ReadMe_txt.html

Однако это не единственный способ сделать это. Другим путем может быть использование установщиком AppleScript для запроса и запуска сценария Bash или Perl с повышенными привилегиями для установки LaunchDaemon. (На самом деле это проще, чем SMJobBless.)

По сути, любой метод устанавливает LaunchDaemon (например, «службу») в специальную папку, и этот демон может быть настроен с повышенными привилегиями, которые затем могут запускать все, что вы хотите, даже команды командной строки. Супер фантастическое объяснение LaunchDaemons и LaunchAgents здесь:

http://launchd.info/

Теперь проблема заключается в том, как связаться с ним из вашего приложения после его установки. Они оставляют это на ваше усмотрение, и существуют различные методы. Тем не менее, они также оставляют на ваше усмотрение обеспечение безопасности, чтобы это не было вектором атаки.

Фантастическая статья о том, как сделать IPC (межпроцессное взаимодействие между вашим приложением и этой службой), находится здесь:

http://nshipster.com/inter-process-communication/

Одним из протоколов IPC в OSX является распределенные объекты, который довольно гладок с точки зрения архитектуры — вы больше почувствуете, что это «кодирование», а не «отправка сообщений туда и обратно», как в других протоколах IPC. Я написал об этом сообщение о переполнении стека, потому что документы некачественные, а существующие примеры на сайте Apple и других устаревший (не будет компилироваться в XCode7.1 с OSX 10.10+).

В протоколе связи между вашим приложением и демоном/службой вы, вероятно, можете обойтись без сообщений ключ/значение, XML или JSON, которые зашифрованы с помощью AES256 с длинным паролем и преобразованы в кодировку Base64, а затем использовать один из различных механизмов IPC. . Впрочем, это совсем другая тема.

person Volomike    schedule 31.03.2016