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 _ 受托者 实例,其中包含所有者所属组 (SID) 的名称、域和安全标识符。
所有者 此安全对象的所有者。 此属性包含一个 Win32 _ 受托者 实例,其中包含所有者 (SID) 的名称、域和安全标识符。
SACL 系统访问控制列表 (ACL) 包含一组 Win32 _ ACE 实例,这些实例表示为用户或组生成审核记录的访问尝试的类型。 有关详细信息,请参阅 用于新对象的 SACL

DACL 和 SACL

随机访问控制列表中的 Win32 _ ACE 对象的数组 (DACL) 和系统访问控制列表 {SACL) 创建用户或组之间的链接及其访问权限。

如果 DACL 属性不包含 (ACE) 的访问控制项,则不会授予访问权限,并且拒绝对对象的访问。

备注

的 DACL 为每个人提供完全访问权限,这是一个严重的安全风险。 有关详细信息,请参阅 创建 DACL

Win32 _ ACE,win32 _ 受信者,win32 _ SID

Win32 _ ACE对象包含标识用户或组的 win32 _ 受信者类的实例,以及一个 AccessMask 属性,该属性是一个位掩码,指定用户或组可以执行的操作。 例如,可能会向用户或组授予读取文件的权限,但不能对文件进行写入。 Win32 _ ACE 对象还包含一个 ACE,用于指示该对象是允许还是拒绝访问。

备注

DACL 中的 Win32 _ ACE 顺序很重要,因为 dacl 中允许和拒绝访问控制项 (ACE) 。 有关详细信息,请参阅 DACL 中的 Ace 顺序

Win32 _ 受信者 表示的每个用户帐户或组都有一个安全标识符 (SID) ,用于唯一标识帐户,并指定帐户的访问权限。 指定 SID 数据的方式取决于操作系统。 有关详细信息,请参阅 更改安全对象上的访问安全性

下图显示了一个 Win32 _ ACE 实例的内容。

一个 win32 - ace 实例的内容

示例:检查是否有权访问打印机

下面的 VBScript 代码示例演示如何使用打印机安全描述符。 此脚本调用 Win32 _ Printer类中的 GetSecurityDescriptor方法,以获取描述符,然后确定安全描述符中是否存在 (DACL) 的自由访问控制列表。 如果有 DACL,则脚本从 DACL 获取 (ACE) 的访问控制项的列表。 每个 ACE 由 Win32 _ ACE的实例表示。 此脚本将检查每个 ACE 以获取用户的名称,并确定用户是否有权访问该打印机。 用户由 win32 _ ACE 实例中嵌入的 win32 _ 受信者的实例表示。

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

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

安全描述符 Helper 类

安全最佳实践

维护 WMI 安全性

访问控制

访问 WMI 命名空间