queryServiceObjectSecurity 函数 (winsvc.h)
QueryServiceObjectSecurity 函数检索与服务对象关联的安全描述符的副本。 还可以使用 GetNamedSecurityInfo 函数检索安全描述符。
语法
BOOL QueryServiceObjectSecurity(
[in] SC_HANDLE hService,
[in] SECURITY_INFORMATION dwSecurityInformation,
[out, optional] PSECURITY_DESCRIPTOR lpSecurityDescriptor,
[in] DWORD cbBufSize,
[out] LPDWORD pcbBytesNeeded
);
参数
[in] hService
服务控制管理器或服务的句柄。 服务控制管理器的句柄由 OpenSCManager 函数返回,服务句柄由 OpenService 或 CreateService 函数返回。 句柄必须具有READ_CONTROL访问权限。
[in] dwSecurityInformation
一组位标志,指示要检索的安全信息的类型。 此参数可以是 SECURITY_INFORMATION 位标志的组合,但此函数不支持 LABEL_SECURITY_INFORMATION 值。
[out, optional] lpSecurityDescriptor
指向接收指定服务对象的安全描述符副本的缓冲区的指针。 调用进程必须具有适当的访问权限才能查看对象安全描述符的指定方面。 SECURITY_DESCRIPTOR结构以自相对格式返回。
[in] cbBufSize
lpSecurityDescriptor 参数指向的缓冲区的大小(以字节为单位)。 允许的最大大小为 8 KB。
[out] pcbBytesNeeded
指向变量的指针,该变量接收返回请求的安全描述符信息(如果函数失败)所需的字节数。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
以下错误代码可能由服务控制管理器设置。 其他错误代码可能由服务控制管理器调用的注册表函数设置。
返回代码 | 说明 |
---|---|
|
指定的句柄未使用READ_CONTROL访问权限打开,或者调用进程不是对象的所有者。 |
|
指定的句柄无效。 |
|
对于 lpSecurityDescriptor 缓冲区,安全描述符信息太大。 获取所有信息所需的字节数在 bytesNeeded 参数中返回。 不会向 lpSecurityDescriptor 缓冲区写入任何内容。 |
|
指定的安全信息无效。 |
注解
创建服务时,服务控制管理器会将默认安全描述符分配给服务对象。 若要检索服务对象的安全描述符的副本,请调用 QueryServiceObjectSecurity 函数。 若要更改安全描述符,请调用 SetServiceObjectSecurity 函数。 有关服务对象的默认安全描述符的说明,请参阅 服务安全性和访问权限。
若要从服务对象的安全描述符读取所有者、组或 DACL,必须在打开句柄时授予调用进程READ_CONTROL访问权限。 若要获取READ_CONTROL访问权限,调用方必须是对象的所有者,或者对象的 DACL 必须授予访问权限。
若要从安全描述符读取 SACL,必须在打开句柄时授予调用进程ACCESS_SYSTEM_SECURITY访问权限。 获取此访问权限的正确方法是在调用方当前令牌中启用SE_SECURITY_NAME特权,打开ACCESS_SYSTEM_SECURITY访问的句柄,然后禁用该权限。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | winsvc.h (包括 Windows.h) |
Library | Advapi32.lib |
DLL | Advapi32.dll |