Функция QueryServiceObjectSecurity

Функция QueryServiceObjectSecurity извлекает копию дескриптора безопасности, связанного с объектом службы. Вы можете также использовать функцию GetNamedSecurityInfo, чтобы извлечь дескриптор безопасности.

Windows NT 3.51 и ранее:  Функция GetNamedSecurityInfo не поддерживается.

Синтаксис

BOOL QueryServiceObjectSecurity(
  SC_HANDLE hService,
  SECURITY_INFORMATION dwSecurityInformation,
  PSECURITY_DESCRIPTOR lpSecurityDescriptor,
  DWORD cbBufSize,
  LPDWORD pcbBytesNeeded
);

Параметры

hService

[in] Дескриптор службы. Этот дескриптор возвращается функцией OpenService или CreateService, и он должен иметь доступ READ_CONTROL.

dwSecurityInformation

[in] Задает информацию о безопасности, которая требуется. Этот параметр может быть комбинацией следующих значений.

Значение Предназначение
DACL_SECURITY_INFORMATION Запрашивает DACL объекта.
GROUP_SECURITY_INFORMATION Запрашивает первичный идентификатор безопасности (SID) группы объекта.
OWNER_SECURITY_INFORMATION Запрашивает идентификатор безопасности (SID) владельца объекта.
SACL_SECURITY_INFORMATION Запрашивает SACL объекта. Вызывающий процесс (process)должен иметь привилегию SE_SECURITY_NAME. Правильный способ получить этот доступ состоит в том, чтобы разрешить привилегии SE_SECURITY_NAME в текущем маркере доступа (access token) вызывающей программы, открыть дескриптор для доступа ACCESS_SYSTEM_SECURITY, а затем запретить привилегию.

lpSecurityDescriptor

[out] Указатель на буфер, который получает копию дескриптора безопасности указанного объекта службы. Вызывающий процесс должен иметь соответствующий доступ, чтобы рассмотреть указанные аспекты дескриптора безопасности объекта. Структура SECURITY_DESCRIPTOR возвращается в самоопределяющемся относительном формате. Установка этого параметра в значение ПУСТО (NULL), определяет требуемое число байтов, которое возвращается в pcbBytesNeeded.

cbBufSize

[in] Задает размер буфера, в байтах, на который указывает параметр lpSecurityDescriptor. Наибольший разрешенный размер - 8 килобайтов.

pcbBytesNeeded

[out] Указатель на переменную, которая получает число байтов, необходимых, чтобы возвратить затребованную информацию дескриптора безопасности, если функция завершается ошибкой.

Возвращаемые значения

Если функция завершается успешно, возвращаемое значение является ненулевым.

Если функция завершается ошибкой, возвращаемое значение - нуль. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.

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

Код возврата Описание
ERROR_ACCESS_DENIED Указанный дескриптор не был открыт с доступом READ_CONTROL, или вызывающий процесс не владелец объекта.
ERROR_INVALID_HANDLE Указанный дескриптор недействителен.
ERROR_INSUFFICIENT_BUFFER Информация дескриптора безопасности является слишком большой для буфера lpSecurityDescriptor. Число байтов, требуемых чтобы получить всю информацию, возвращается в параметре pcbBytesNeeded. В буфер lpSecurityDescriptor ничего не записывается.
ERROR_INVALID_PARAMETER Указанная информация о безопасности недействительна.

Замечания

Когда служба создается, диспетчер управления службами назначает для объекта службы дескриптор безопасности по умолчанию. Чтобы извлечь копию дескриптора безопасности для объекта службы, вызовите функцию QueryServiceObjectSecurity. Чтобы изменить дескриптор безопасности, вызовите функцию SetServiceObjectSecurity. Описание дескриптора безопасности по умолчанию для объекта службы, см. в статье Защита службы и права доступа.

Чтобы прочитать владельца, группу или DACL из дескриптора безопасности объекта службы, вызывающему процессу, должно быть, предоставлен доступ READ_CONTROL, когда открывался дескриптор. Чтобы получить доступ READ_CONTROL, вызывающая программа должна быть владельцем объекта или DACL объекта должен предоставить этот доступ.

Чтобы прочитать SACL из дескриптора безопасности, вызывающему процессу, должен быть предоставлен доступ ACCESS_SYSTEM_SECURITY, когда открывался дескриптор. Правильный способ получить этот доступ состоит в том, чтобы разрешить привилегии SE_SECURITY_NAME в текущем маркере права доступа вызывающей программы, открыть дескриптор для доступа ACCESS_SYSTEM_SECURITY, а затем запретить привилегию.

Смотри также

Обзор Управление низкоуровневым доступом, Функции, используемые управлением низкоуровневым доступом,  CreateService, GetNamedSecurityInfo, OpenService, SECURITY_DESCRIPTOR, SetServiceObjectSecurity

Размещение и совместимость QueryServiceObjectSecurity

К Windows XP Да 
л Windows 2000 Professional Да
и Windows NT  Workstation Да версии 3.1 и позже
е Windows Me Да
н Windows 98 Да
т Windows 95 Да
 
С Windows Server 2003 Да
е Windows 2000 Server Да
р Windows NT Server Да версии 3.1 и позже
в    
е    
р    
Используемая библиотека Advapi32.lib
Используемая DLL advapi32.dll
 Заголовочный файл  
- объявлено в Winsvc.h
 - включено в Windows.h
 Unicode Нет
 Замечания по платформе Не имеется

 

Назад в оглавление
На главную страницу
На оглавление справки

Hosted by uCoz