Share via


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 () ,以及其對受保護物件的存取權限。 這個屬性包含代表存取控制 EntriesWin32_ACE 實例的陣列。 如需詳細資訊,請參閱 建立 DACL
群組 這個安全物件所屬的群組。 此屬性包含Win32_Trustee的 實例,其中包含 擁有者所屬群組的名稱、網域和安全性識別碼 (SID) 。
擁有者 這個安全物件的擁有者。 此屬性包含Win32_Trustee的 實例,其中包含 擁有者 (SID 名稱、網域和安全性識別碼) 。
SACL 系統存取控制清單 (ACL) 包含Win32_ACE實例陣列,代表產生使用者或群組稽核記錄的存取嘗試類型。 如需詳細資訊,請參閱 New 物件的 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,指出它是否為允許或拒絕存取。

注意

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 命名空間