Установка в качестве приложения-службы

Помимо выполнения в качестве исполняемого файла локального сервера (EXE), COM-объект может также работать в качестве служебного приложения, когда его активирует локальный или удаленный клиент. Службы поддерживают множество полезных и интегрированных с пользовательским интерфейсом административных функций, включая локальные и удаленные запуски, остановку, приостановку и перезапуск, а также возможность установить сервер для запуска под определенной учетной записью пользователя и станцией окон.

Объект, написанный как служба, устанавливается для использования в COM путем установки значения LocalService под ключом AppID и выполнения стандартной установки службы.

Классы также могут быть настроены для выполнения под определенной учетной записью пользователя при активации удаленным клиентом, не будучи реализованными как приложения-сервисы. Для этого класс устанавливает имя пользователя и пароль, который будет использоваться при запуске локального сервера SCM.

Если класс настроен таким образом, вызовы CoRegisterClassObject с этим CLSID завершаются ошибкой, если процесс не был запущен COM от имени фактического запроса активации. Другими словами, классы, настроенные для запуска от имени конкретного пользователя, могут не быть зарегистрированы под любой другой учётной записью.

Имя пользователя берется из именованного значения RunAs под ключом APPID класса. Если имя пользователя — "Интерактивный пользователь", код класса выполняется в контексте безопасности пользователя, вошедшего в систему, и подключен к интерактивной станции окон.

В противном случае пароль извлекается из скрытой части реестра, доступной только администраторам компьютера и системе. Затем имя пользователя и пароль используются для создания сеанса входа в систему, в котором выполняется код класса. При запуске таким образом код класса выполняется с собственным рабочим столом и станцией окон и не предоставляет общий доступ к дескрипторам окон, буферу обмена или другим элементам пользовательского интерфейса с интерактивным пользователем или другими классами, работающими в других учетных записях пользователей.

Сервер, зарегистрированный в LocalService или RunAs может зарегистрировать объект в таблице запущенных объектов, чтобы разрешить любому клиенту подключаться к нему. Для этого вызов сервера IRunningObjectTable::Register должен задать флаг ROTFLAGS_ALLOWANYCLIENT. Сервер, устанавливающий этот бит, должен иметь имя исполняемого файла в разделе AppID реестра, который относится к AppID для этого исполняемого файла. Сервер "активировать как активатор" (не зарегистрирован как LocalService или RunAs) может не зарегистрировать объект с этим флагом.

Регистрация класса при установке

Регистрация работающего сервера EXE

Регистрация объектов в ROT

Самостоятельная Регистрация