WMI 安全描述符对象

WMI 的某些对象和方法可用于读取和操作安全描述符,以确定谁有权访问安全对象。

安全描述符的角色

安全描述符定义安全对象的安全属性,例如文件、注册表项、WMI 命名空间、打印机、服务或共享。 安全描述符包含有关对象的所有者和主组的信息。 提供程序可以将资源安全描述符与请求用户的标识进行比较,并确定用户是否有权访问用户正在请求的资源。 有关详细信息,请参阅访问 WMI 安全对象

某些 WMI 方法(如 GetSD)以二进制字节数组格式返回安全描述符。 从 Windows Vista 开始,使用 Win32_SecurityDescriptorHelper 类的方法将二进制安全描述符转换为 Win32_SecurityDescriptor 实例,可以更轻松地对其进行操作。 有关详细信息,请参阅更改安全对象的访问安全性

访问控制和 WMI 安全对象

下面是 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 实例的内容。

一个 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

更改安全对象的访问安全性

安全描述符帮助程序类

安全性最佳做法

维护 WMI 安全性

访问控制

访问 WMI 命名空间