Mac OS X: запуск приложения с помощью NSWorkspace из демона не работает, если демон запущен от имени пользователя root

Я создал приложение Command Line Tool с помощью Xcode. В этом приложении я использовал NSWorkspace для запуска другого пакета приложений (.app), как предлагается здесь. MacOsX: Как запустить приложение (.app) из приложения типа" Инструмент командной строки "

Кажется, все работает нормально, пока я не попытался запустить это приложение Command Line Tool в качестве демона с помощью launchctl. Если демон запускается от имени текущего вошедшего в систему пользователя, тогда приложение Command Line Tool запускает внешнее приложение нормально. Если демон запускается от имени пользователя root, приложение Command Line Tool не может запустить внешнее приложение. Использование NSWorkspace для открытия приложения, похоже, не работает, если демон запускается от имени пользователя root.

Кто-нибудь знает, как правильно открыть другое приложение из демона, работающего с правами root?


person ytw    schedule 20.03.2013    source источник


Ответы (3)


Скорее всего, это ограничение безопасности в MacOS, с которым вы столкнулись.

Я бы посоветовал создать «вспомогательный инструмент» с кодовой подписью, который сбрасывается (через setuid - чего я бы не стал делать за пределами приложения с кодовой подписью) до идентификатора пользователя, вошедшего в систему в данный момент, а затем выполните уловка NSWorkspace для запуска приложения в этом пользовательском контексте.

Однако создание вспомогательных инструментов нетривиально. Основные концепции описаны в документе Apple Программирование служб авторизации. Путеводитель.

Взгляните на пример кода Apple SMJobBless , в котором показано, как установить вспомогательный инструмент, на который вы могли бы установить права пользователя, а затем изменить его код вспомогательного инструмента для запуска вашего приложения.

person Michael Dautermann    schedule 20.03.2013
comment
Спасибо, Майкл. Не могли бы вы показать мне, как получить в коде идентификатор пользователя, вошедшего в систему? - person ytw; 03.04.2013

Это слишком сложная тема, чтобы ее можно было рассмотреть в ответе StackOverflow. Короткий ответ: демоны не могут надежно запускать приложения. Подробный ответ можно найти в техническом примечании TN2083: Демоны и агенты < / а>.

person Ken Thomases    schedule 20.03.2013

Наконец-то я заставил его работать, используя код, упомянутый в этой ссылке, чтобы получить uid и gid "пользователя консоли":
https://superuser.com/questions/180819/how-can-you-узнать-из-в-настоящее-во-входе-пользователя-в-os-x-gui.

По ссылке показан пример использования SCDynamicStoreCreate() и SCDynamicStoreCopyConsoleUser() для получения uid и gid "пользователя консоли".

После получения uid и gid просто установите uid и gid на значения пользователя консоли, прежде чем использовать NSWorkspace для открытия приложения, и это помогло мне.

person ytw    schedule 04.04.2013