Статус привилегированного помощника Mountain Lion

Я создаю приложение для 10.8+, которое, помимо прочего, должно исправлять файлы. Из-за этой функциональности я создал «PrivilegedHelperTool» и установил как KeepLive = YES RunAtLoad = YES (поэтому он всегда работает). Я также использую XPC поверх Mach для связи с приложением с графическим интерфейсом (меню).

Я хотел бы иметь возможность проверить, установлен ли и работает ли «PrivilegedHelperTool», и пока лучший способ проверить установку, который я нашел, — это найти plist в /Library/LaunchDaemons/ и проверить, находится ли двоичный файл в / Библиотека/PrivilegedHelperTools.

Это действительно лучший способ?

Также я не нашел надежного способа проверить, работает ли PrivilegedHelperTool (работает от имени пользователя root), не будучи пользователем root (например, список sudo launchctl)

Я добавил обертку, которая использует launch.h (/usr/include/launch.h) http://brockerhoff.net/blog/2009/02/02/cocoa-musings-pt-3/, но он возвращает только пользовательские процессы и заставляет конечного пользователя повышать привилегии только для проверки какой-то «плагин» работает неправильно.

Верно ли, что лучшее, на что я могу надеяться, это попытаться поговорить с моей службой, и если она не отвечает, предположим, что она «повреждена или не работает»? ( http://mac-os-forge.2317878.n4.nabble.com/Programmatic-interface-to-launchctl-and-some-other-questions-OS-X-10-5-tp189494p189496.html )


person drunknbass    schedule 19.09.2012    source источник
comment
Следите за сообщениями Apple здесь devforums.apple.com/message/731960#731960   -  person drunknbass    schedule 20.09.2012
comment
Возможно, это не лучшее решение, но самое простое, что я могу придумать. Поскольку у вас уже есть обмен сообщениями, почему бы не использовать его? Вы отправляете сообщение демону, и демон возвращает необходимую вам информацию (uid_t, что угодно). Если он не запущен, от демона не будет ответа. Кроме того, если вы не хотите полагаться на обмен сообщениями, чтобы узнать, работает ли он, возможно, исходный код ps может вам помочь.   -  person YllierDev    schedule 20.09.2012
comment
Я хотел бы иметь более тонкий контроль над зерном, чем выпускать пиджин носителя и надеяться, что он вернется. Демон может быть не запущен (маловероятно) Демон может быть запущен, но удален (может быть, пограничный случай?) и т. д. Я бы предпочел знать, что демон не запущен, и запросить sudo для его запуска, а не предположить худшее и переустановить его в первый раз. признак неисправности (на сообщение XPC не ответили)   -  person drunknbass    schedule 20.09.2012
comment
Так что это неправда. Также я не нашел надежного способа проверить, работает ли PrivilegedHelperTool (работает от имени пользователя root), еще не будучи пользователем root (например, список sudo launchctl). Моя ошибка была частично связана с тем, что я слишком рано читал канал и пропустил кучу и потому что, когда я отлаживал этот плагин / демон, он был установлен как OnDemand = YES (и не всегда работал, когда я был на кли), ps и синтаксический анализ вывода грязный, но его должно быть достаточно.   -  person drunknbass    schedule 21.09.2012
comment
Apple ответила на своих форумах разработчиков более подробной информацией. devforums.apple.com/message/732894#732894 (требуется учетная запись Apple dev)   -  person drunknbass    schedule 22.09.2012


Ответы (2)


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

Это фрагмент кода, чтобы стать root из приложения. он предложит пользователю обычное диалоговое окно имени пользователя/пароля, которое вы также видите при установке чего-либо из pkg.

OSStatus myStatus;
uid_t   uid = -1;
AuthorizationRights myRights;
AuthorizationFlags myFlags;
AuthorizationItem myItems[1];


uid = geteuid();
if(uid != 0)
{
    myItems[0].name = "com.whatever";
    myItems[0].valueLength = 0;
    myItems[0].value = NULL;
    myItems[0].flags = 0;
    myRights.count = sizeof (myItems) / sizeof (myItems[0]);
    myRights.items = myItems;
    myFlags = kAuthorizationFlagDefaults |
        kAuthorizationFlagInteractionAllowed |
        kAuthorizationFlagExtendRights |
        kAuthorizationFlagPartialRights;
    myStatus = AuthorizationCreate (&myRights, kAuthorizationEmptyEnvironment,myFlags,NULL);
}
person Andreas Fink    schedule 20.09.2012
comment
Моя проблема не становится root. Проблема в том, что помощник - это то, что имеет привилегии root и установлено. Интерфейсы GUI для этого помощника должны знать, установлен ли он? Это работает? и т. д. Я не вижу способа с помощью графического интерфейса запрашивать, работает ли он без рута, чего будет недостаточно. - person drunknbass; 20.09.2012

Вы можете использовать sysctl, чтобы получить все запущенные процессы. Взгляните на мой ответ.

person Parag Bafna    schedule 21.10.2013