У меня есть приложение, которое должно иметь возможность записи в любой файл предпочтений пользователя / текущего хоста (для этого требуется привилегии администратора в соответствии со Справочником утилит предпочтений), а также для включения / отключения агента launchd через его plist (доступный для записи только root) ,
Я использую SFAuthorizationView
, чтобы требовать от пользователей аутентификации в качестве администратора перед изменением этих значений.
Я пытаюсь выбрать наилучший способ фактического изменения этих значений.
Кажется, что дешевый хакерский вариант - использовать AuthorizationExecuteWithPrivileges()
и mv
или defaults
, либо через BLAuthentication, либо создавая что-то подобное самому. Недостатком этого является то, что мы не получаем возвращаемое значение приложения, запускаемого из командной строки, плюс некоторые странные эзотерические ошибки, с которыми я столкнулся (например, получение ошибки -60008 в определенных ситуациях). Очевидно, что Apple настоятельно рекомендует против этого, но люди, похоже, делают это и добиваются определенных успехов.
Второй наиболее хакерский вариант - это создать приложение-помощник с установленным битом suid и параметром --self-repair
, как обсуждалось в разных местах. Это кажется возможным, но, похоже, это не намного меньше проблем, чем третий вариант.
Третий вариант - создать полноценного демона launchd
, который будет работать от имени пользователя root и связываться с моим приложением через сокет. Это кажется излишним излишним для чтения и записи некоторых plist-файлов, но также возможно, что я могу найти другие варианты его использования в будущем, и это не будет единственным демоном для моего приложения, так что это не кажется необоснованным просто добавить еще один.
Я подумываю изменить этот пример кода для моих целей.
Мои два вопроса:
Кажется ли, что опция launchd daemon - лучший путь для этого, или есть куда более простой маршрут, который мне не хватает?
Кто-нибудь еще успешно использовал этот код в качестве основы для чего-то подобного, и кто-нибудь видит какие-либо явные проблемы с ним, которые я пропускаю? Я успешно использовал его в тестовом приложении, но мне было бы интересно услышать мнение вас, ребята.