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
自由访问控制列表中的 Win32_ACE 对象数组 (DACL) 和系统访问控制列表 (SACL) 共同在用户或组与其访问权限之间创建链接。
当 DACL 属性不包含访问控制项 (ACE) 时,不会授予访问权限,并且拒绝对对象的访问。
注意
NULL DACL 会向所有人提供完全访问权限,这是一个严重的安全风险。 有关详细信息,请参阅创建 DACL。
Win32_ACE、Win32_Trustee、Win32_SID
Win32_ACE 对象包含标识用户或组的 Win32_Trustee 类的实例,以及作为位掩码的 AccessMask 属性,该属性指定用户或组可以执行的操作。 例如,用户或组可能被授予文件读取权限,但没有被授予文件写入权限。 Win32_ACE 对象还包含一个 ACE,该 ACE 指示它是允许访问还是拒绝访问。
注意
DACL 中的 Win32_ACE 顺序非常重要,因为 DACL 中允许和拒绝访问控制项 (ACE)。 有关详细信息,请参阅 DACL 中 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