WMI 安全描述符对象

WMI 具有对象和方法,可让你读取和作安全描述符,以确定谁有权访问安全对象。

安全描述符的角色

安全描述符定义安全对象的安全属性,例如文件、注册表项、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,指示它是允许访问还是拒绝访问。

注意

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 命名空间的访问