CServiceModule::Run

После вызова, выполните сначала сохраняет идентификатора службы потока. Служба будет использовать этот Идентификатор для закрытия, посылая сообщение WM_QUIT , с помощью функции Win32 API, PostThreadMessage.

Затем запустите вызывает функцию Win32 API, CoInitializeEx. По умолчанию выполните проходит COINIT_MULTITHREADED флага в функцию. Этот флаг указывает, что программа должна быть свободнопоточный сервер.

Теперь можно указать безопасность с помощью CSecurityDescriptor. Этот класс значительно упрощает задачу создания и вносить изменения в список управления доступом (DACL) — список записей управления доступом (ACE), где каждая ACE определяет доступ к объекту Win32.

По умолчанию ATL COM AppWizard создает вызов функции-члена InitializeFromThreadToken CSecurityDescriptor. Это инициализирует дескриптор безопасности объекта к пустой DACL, это означает, что любой пользователь имеет доступ к объекту.

Изменение доступа пользователей проще запретить и Разрешить функций-членов CSecurityDescriptor. Эти функции добавить элемент управления ДОСТУПОМ в существующий список DACL. Однако Deny всегда имеет приоритет, поскольку Deny добавляет ACE в начало списка DACL, в то время как Allow добавляет его в конец. Запретить и Разрешить передать имя пользователя в качестве первого параметра и прав доступа (как правило, COM_RIGHTS_EXECUTE) в качестве второго.

Напомним, что пустой DACL, созданный InitializeFromThreadToken предоставляет всем пользователям доступ к COM-объект. Однако как только вы называете Разрешить для добавления элемента управления ДОСТУПОМ, только то, что указанный пользователь будет иметь доступ. В следующем коде показан вызов Разрешить:

CSecurityDescriptor УР;
SD.InitializeFromThreadToken ();

Если (bAllowOneUser)
{
 nbsp; SD.Разрешить ("MYDOMAI&N\\myuser", COM_RIGHTS_EXECUTE);
}
Метод CoInitializeSecurity (sd, -1, NULL, NULL,
                     RPC_C_AUTHN_LEVEL_PKT,
                     RPC_C_IMP_LEVEL_IMPERSONATE,
                     ЗНАЧЕНИЕ NULL, EOAC_NONE, NULL)

Если переменная, bAllowOneUser , имеет значение TRUE, то только один указанный пользователь имеет доступ, потому, что только этот пользователь ACE в списке DACL. Если bAllowOneUser является FALSE, то все пользователи имеют доступ, потому что DACL имеет значение null.

Если служба чтобы задать собственную безопасность не требуется, удалите вызов функции Win32 API, CoInitializeSecurityи COM будет затем определить параметры безопасности из реестра. — Удобный способ для настройки параметров реестра с помощью программы DCOMCNFG рассмотрены далее в этой статье.

После задания безопасности объект зарегистрирован с COM, так что новые клиенты могут подключаться к программе. Наконец программа сообщает SCM, на котором он работает, и программа вводит цикл обработки сообщений. Программа продолжает работу, до тех пор, пока он выполняет выход сообщение на выключение службы.

Дополнительные сведения о безопасности Windows NT можно найти в статье MSDN, «Безопасности Windows NT в теории и практике».

Index