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 () ,以及其對受保護物件的存取權限。 這個屬性包含代表存取控制 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 實例的內容。
範例:檢查誰可以存取印表機
下列 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