WMI 安全描述符对象
WMI 具有对象和方法,可让你读取和作安全描述符,以确定谁有权访问安全对象。
- 安全描述符的角色
- 访问控制和 WMI 安全对象
- Win32_SecurityDescriptor 对象
- DACL 和 SACL
- Win32_ACE、Win32_Trustee、Win32_SID
- 示例:检查谁有权访问打印机
- 相关主题
安全描述符的角色
安全描述符定义安全对象的安全属性,例如文件、注册表项、WMI 命名空间、打印机、服务或共享。 安全描述符包含有关对象所有者和主组的信息。 提供程序可以将资源安全描述符与请求用户的标识进行比较,并确定用户是否有权访问用户请求的资源。 有关详细信息,请参阅 访问 WMI 安全对象。
某些 WMI 方法(如 GetSD)以二进制字节数组格式返回安全描述符。 从 Windows Vista 开始,使用 Win32_SecurityDescriptorHelper 类的方法将二进制安全描述符转换为 Win32_SecurityDescriptor实例,这更易于作。 有关详细信息,请参阅 更改安全对象的访问安全性。
访问控制和 WMI 安全对象
下面是 WMI 安全对象的列表:
下图显示了 WMI 安全对象之间的关系。
有关访问安全角色的详细信息,请参阅 安全最佳做法、维护 WMI 安全,以及 访问控制。
Win32_SecurityDescriptor 对象
下表列出了 Win32_SecurityDescriptor 类属性。
财产 | 描述 |
---|---|
ControlFlags | 一组控制位,这些位符合 SD 或其单个成员的含义。 有关设置 ControlFlags 位值的详细信息,请参阅 Win32_SecurityDescriptor。 |
DACL |
自由访问控制列表(ACL) 用户和组及其对受保护对象的访问权限。 此属性包含表示 访问控制项的 Win32_ACE 实例数组。 有关详细信息,请参阅 创建 DACL。 |
组 | 此安全对象所属的组。 此属性包含一个 Win32_Trustee 实例,该实例包含所有者所属组的名称、域和安全标识符(SID)。 |
所有者 | 此安全对象的所有者。 此属性包含一个 Win32_Trustee 实例,该实例包含所有者的名称、域和安全标识符(SID)。 |
SACL |
系统访问控制列表(ACL) 包含一组表示为用户或组生成审核记录的访问尝试类型的 Win32_ACE 实例。 有关详细信息,请参阅新对象 SACL。 |
DACL 和 SACL
自由访问控制列表 (DACL) 和系统访问控制列表 {SACL) 中的 Win32_ACE 对象的数组在用户或组与其访问权限之间创建链接。
当 DACL 属性不包含访问控制项(ACE)时,不会授予访问权限并拒绝对对象的访问权限。
注意
NULL DACL 为所有人提供完全访问权限,这是一个严重的安全风险。 有关详细信息,请参阅 创建 DACL。
Win32_ACE、Win32_Trustee、Win32_SID
Win32_ACE 对象包含标识用户或组的 Win32_Trustee 类的实例,以及位掩码的 AccessMask 属性,该属性指定用户或组可以执行的作。 例如,可能会向用户或组授予读取文件但不写入文件的权限。 Win32_ACE 对象还包含一个 ACE,指示它是允许访问还是拒绝访问。
由 Win32_Trustee 表示的每个用户帐户或组都有一个唯一标识帐户的安全标识符(SID),并指定帐户的访问特权。 如何指定 SID 数据取决于作系统。 有关详细信息,请参阅 更改安全对象的访问安全性。
下图显示了一个 Win32_ACE 实例的内容。
示例:检查谁有权访问打印机
以下 VBScript 代码示例演示如何使用打印机安全描述符。 该脚本调用 Win32_Printer 类中的 GetSecurityDescriptor 方法以获取描述符,然后确定安全描述符中是否存在任意访问控制列表(DACL)。 如果有 DACL,则脚本将从 DACL 获取访问控制项(ACE)列表。 每个 ACE 都由 Win32_ACE实例表示。 该脚本检查每个 ACE 以获取用户的名称,并确定用户是否有权访问打印机。 用户由嵌入 Win32_ACE 实例中的 Win32_Trustee 实例表示。
SE_DACL_PRESENT = &h4
ACCESS_ALLOWED_ACE_TYPE = &h0
ACCESS_DENIED_ACE_TYPE = &h1
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate, (Security)}!\\" & strComputer & "\root\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery _
("Select * from Win32_Printer")
For Each objPrinter in colInstalledPrinters
Wscript.Echo "Name: " & objPrinter.Name
' Get security descriptor for printer
Return = objPrinter.GetSecurityDescriptor( objSD )
If ( return <> 0 ) Then
WScript.Echo "Could not get security descriptor: " & Return
wscript.Quit Return
End If
' Extract the security descriptor flags
intControlFlags = objSD.ControlFlags
If intControlFlags AND SE_DACL_PRESENT Then
' Get the ACE entries from security descriptor
colACEs = objSD.DACL
For Each objACE in colACEs
' Get all the trustees and determine which have access to printer
WScript.Echo objACE.Trustee.Domain & "\" & objACE.Trustee.Name
If objACE.AceType = ACCESS_ALLOWED_ACE_TYPE Then
WScript.Echo vbTab & "User has access to printer"
ElseIf objACE.AceType = ACCESS_DENIED_ACE_TYPE Then
WScript.Echo vbTab & "User does not have access to the printer"
End If
Next
Else
WScript.Echo "No DACL found in security descriptor"
End If
Next