Может ли пользователь без полномочий root уничтожить "элемент входа" OS X, запущенный с помощью ServiceManagement Framework?

Я выбираю между использованием элемента входа и агента запуска. В связи с этим у меня есть несколько вопросов:

  1. Может ли пользователь без полномочий root выйти из помощника элемента входа в систему, если он запущен с инфраструктурой управления службами с использованием SMLoginItemSetEnabled? Будет ли вспомогательное приложение перезагружено с помощью launchD, если оно будет убито пользователем или в некоторых случаях ОС?

  2. Почему Apple не рекомендует предоставлять пользовательский интерфейс приложению, которое можно запустить через LaunchAgent? Есть ли проблема, если мы представим минимальный интерфейс?

  3. Элемент входа в систему как вспомогательное приложение требует, чтобы основное приложение вызывало SMLoginItemSetEnabled. Это подразумевает, что основное приложение должно вызываться хотя бы один раз, чтобы включить элемент входа в систему. Это отличает его от агента запуска, который можно загрузить, как только в системе будет установлен plist. Можем ли мы выполнить вспомогательный вход в систему независимо от того, открыл пользователь основное приложение или нет?

Любая помощь будет заметна

2 ответа

LaunchAgents которые настроены с помощью SMJobBless предназначены для не-GUI услуг. Они работают без пользовательского интерфейса в фоновом режиме и не работают как вошедший в систему пользователь.

Если вы хотите графический интерфейс, вам придется использовать SMLoginItemSetEnabledили вручную установить пользователя LaunchAgent через .plist с "LimitLoadToSessionType" = "Aqua" имущество.

  1. Помощники запущены SMLoginItemSetEnabled запускать как текущий пользователь, так что он может быть прерван этим пользователем. Процесс перезапустится, если launchd обнаружит, что агент ушел из-за сигнала или из-за ненормального завершения. Если он завершается из-за чистого завершения, он не будет перезапущен до следующего входа пользователя в систему (под чистым завершением мы подразумеваем завершение с кодом выхода 0, что не произойдет, если программа будет убита, например, через монитор активности. Если у помощника есть возможность выйти, и этот параметр заставляет его завершиться с кодом возврата 0, тогда он не будет перезапущен, что будет рассматриваться приложением как хорошая форма.

  2. Это стилистическая вещь - пользователь не может отключить агент, не взаимодействуя с командной строкой, что считается плохим состоянием. Нет проблем с отображением пользовательского интерфейса LaunchAgent, Пока он зарегистрирован с соответствующими ключами, он будет запущен в контексте пользовательского интерфейса входа в систему, что означает, что он может быть полностью интерактивным. У меня есть несколько приложений, которые действуют так - TunnelBlick, 1Password (это через список LaunchAgent), и они только запускают пункт меню при запуске.

  3. Если вы просто отправляете приложение - например, через магазин приложений, то нет способа автоматически запустить что-либо без какого-либо взаимодействия с пользователем - вам нужно запустить основное приложение, чтобы включить помощника. Элемент входа помощника может быть запущен вручную без запуска основного приложения; но на нем не будет включена магия запуска при запуске. Если вы можете зарегистрировать LaunchAgent plist, то вы можете получить запуск при запуске и сразу запустить его поведение.

Для удаления, однако, LaunchAgents требуется удалить.plist и взаимодействовать с launchd, чтобы отключить его; элементы, зарегистрированные в инфраструктуре Service Mangement, будут естественным образом исчезать после перетаскивания приложения в корзину.

ИМХО, (немного мыльной версии, немного самоуверенный) Если вы отправляете стандартное приложение с помощником, то положитесь на первый запуск, прежде чем настраивать такие вещи, как запуск помощника при входе в систему; прежде всего потому, что он держит пользователя под контролем. Автоустановка элементов автозапуска - одна из моих любимых задач с Windows-приложениями (так много элементов в строке состояния...).

Документы для SMLoginItemSetEnabled Укажите, что элемент входа будет "продолжать работать", что, по-видимому, указывает на то, что он будет перезапущен, если он будет убит:

Булево включенное состояние вспомогательного приложения. Это значение действует только для текущего пользователя. Если true, вспомогательное приложение будет запущено немедленно (и при последующих входах в систему) и продолжит работу. Если false, вспомогательное приложение больше не будет работать.

https://developer.apple.com/documentation/servicemanagement/1501557-smloginitemsetenabled

Другие вопросы по тегам