Función QueryServiceObjectSecurity (winsvc.h)

La función QueryServiceObjectSecurity recupera una copia del descriptor de seguridad asociado a un objeto de servicio. También puede usar la función GetNamedSecurityInfo para recuperar un descriptor de seguridad.

Sintaxis

BOOL QueryServiceObjectSecurity(
  [in]            SC_HANDLE            hService,
  [in]            SECURITY_INFORMATION dwSecurityInformation,
  [out, optional] PSECURITY_DESCRIPTOR lpSecurityDescriptor,
  [in]            DWORD                cbBufSize,
  [out]           LPDWORD              pcbBytesNeeded
);

Parámetros

[in] hService

Identificador del administrador de control de servicio o del servicio. La función OpenSCManager devuelve los identificadores para el administrador de controles de servicio y la función OpenSCManager devuelve los identificadores de un servicio mediante la función OpenService o CreateService . El identificador debe tener el derecho de acceso READ_CONTROL.

[in] dwSecurityInformation

Conjunto de marcas de bits que indican el tipo de información de seguridad que se va a recuperar. Este parámetro puede ser una combinación de las marcas de bits de SECURITY_INFORMATION , con la excepción de que esta función no admite el valor de LABEL_SECURITY_INFORMATION .

[out, optional] lpSecurityDescriptor

Puntero a un búfer que recibe una copia del descriptor de seguridad del objeto de servicio especificado. El proceso de llamada debe tener el acceso adecuado para ver los aspectos especificados del descriptor de seguridad del objeto. La estructura SECURITY_DESCRIPTOR se devuelve en formato relativo propio .

[in] cbBufSize

Tamaño del búfer al que apunta el parámetro lpSecurityDescriptor , en bytes. El tamaño más grande permitido es de 8 kilobytes.

[out] pcbBytesNeeded

Puntero a una variable que recibe el número de bytes necesarios para devolver la información del descriptor de seguridad solicitada, si se produce un error en la función.

Valor devuelto

Si la función se realiza correctamente, el valor devuelto es distinto de cero.

Si la función no se realiza correctamente, el valor devuelto es cero. Para obtener información de error extendida, llame a GetLastError.

El administrador de control de servicios puede establecer los siguientes códigos de error. Otros códigos de error pueden establecerse mediante las funciones del Registro a las que llama el administrador de control de servicio.

Código devuelto Descripción
ERROR_ACCESS_DENIED
El identificador especificado no se abrió con READ_CONTROL acceso o el proceso de llamada no es el propietario del objeto.
ERROR_INVALID_HANDLE
El identificador especificado no es válido.
ERROR_INSUFFICIENT_BUFFER
La información del descriptor de seguridad es demasiado grande para el búfer lpSecurityDescriptor . El número de bytes necesarios para obtener toda la información se devuelve en el parámetro pcbBytesNeeded . No se escribe nada en el búfer lpSecurityDescriptor .
ERROR_INVALID_PARAMETER
La información de seguridad especificada no es válida.

Comentarios

Cuando se crea un servicio, el administrador de control de servicios asigna un descriptor de seguridad predeterminado al objeto de servicio. Para recuperar una copia del descriptor de seguridad de un objeto de servicio, llame a la función QueryServiceObjectSecurity . Para cambiar el descriptor de seguridad, llame a la función SetServiceObjectSecurity . Para obtener una descripción del descriptor de seguridad predeterminado para un objeto de servicio, consulte Derechos de acceso y seguridad de servicio.

Para leer el propietario, el grupo o la DACL desde el descriptor de seguridad del objeto de servicio, se debe haber concedido al proceso de llamada READ_CONTROL acceso cuando se abrió el identificador. Para obtener READ_CONTROL acceso, el autor de la llamada debe ser el propietario del objeto o la DACL del objeto debe conceder el acceso.

Para leer el SACL desde el descriptor de seguridad, se debe haber concedido al proceso de llamada ACCESS_SYSTEM_SECURITY acceso cuando se abrió el identificador. La manera correcta de obtener este acceso es habilitar el privilegio SE_SECURITY_NAME en el token actual del autor de la llamada, abrir el identificador para ACCESS_SYSTEM_SECURITY acceso y, a continuación, deshabilitar el privilegio.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado winsvc.h (incluye Windows.h)
Library Advapi32.lib
Archivo DLL Advapi32.dll

Consulte también

CreateService

GetNamedSecurityInfo

Access Control de bajo nivel

Funciones de Access Control de bajo nivel

OpenService

SECURITY_DESCRIPTOR

SetServiceObjectSecurity