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

Създадох приложение за инструмент за команден ред с помощта на Xcode. В това приложение използвах NSWorkspace, за да стартирам друг пакет приложения (.app), както е предложено тук. MacOsX: Как да стартирате приложение (.app) от тип приложение за инструмент за команден ред

Всичко изглежда работи добре, докато не се опитах да стартирам това приложение за инструмент за команден ред като демон, използвайки launchctl. Ако демонът се изпълнява като текущо влезлият потребител, тогава приложението Command Line Tool стартира външното приложение добре. Ако демонът се изпълнява като root, тогава приложението Command Line Tool не може да стартира външното приложение. Използването на NSWorkspace за отваряне на приложение изглежда не работи, ако демонът се изпълнява като root.

Някой знае ли правилния начин за отваряне на друго приложение от демон, който работи като root?


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


Отговори (3)


Това вероятно е ограничение за сигурност в MacOS, с което се сблъсквате.

Това, което бих предложил да направите, е да създадете подписан с код „помощен инструмент“, който се нулира (чрез setuid -- което не бих направил извън приложение, подписано с код) към потребителския идентификатор на текущо влезлия потребител, и след това направете трика NSWorkspace за стартиране на приложението в този потребителски контекст.

Създаването на помощни инструменти обаче не е тривиално. Големите концепции са описани в Authorization Services Programming на Apple Ръководство.

Разгледайте примерния код на „SMJobBless“ на Apple , което показва как да инсталирате помощния инструмент, на който можете да зададете потребителските права, и след това да промените кода на помощния инструмент, за да стартирате приложението си.

person Michael Dautermann    schedule 20.03.2013
comment
Благодаря Майкъл. Можете ли да ми покажете как да получа потребителския идентификатор на влезлия в момента потребител в кода? - person ytw; 03.04.2013

Това е твърде сложна тема, за да се разгледа наистина в отговор на StackOverflow. Краткият отговор е, че демоните не могат да стартират надеждно приложения. За дълъг отговор, моля, прочетете Техническа бележка TN2083: Демони и агенти< на Apple /a>.

person Ken Thomases    schedule 20.03.2013

Най-накрая успях да проработя, като използвах кода, споменат в тази връзка, за да получа uid и gid на „потребител на конзолата“:
https://superuser.com/questions/180819/how-can-you-find-out-the-currently-logged-in-user-in-the-os-x-gui.

Връзката показва пример как да използвате SCDynamicStoreCreate() и SCDynamicStoreCopyConsoleUser(), за да получите uid и gid на „потребител на конзолата“.

След като получите uid и gid, просто задайте uid и gid на тези на потребителя на конзолата, преди да използвате NSWorkspace за отваряне на приложение и това свърши работа за мен.

person ytw    schedule 04.04.2013