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 安全性對象之間的
如需存取安全性角色的詳細資訊,請參閱 安全性最佳做法、維護 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 實體數組,這些實例代表為使用者或群組產生稽核記錄的存取嘗試類型。 如需詳細資訊,請參閱 New Object的 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,指出它是否為允許或拒絕存取。
Win32_Trustee 所代表的每個用戶帳戶或群組都有一個可唯一識別帳戶的安全性標識碼 (SID),並指定帳戶的訪問許可權。 您指定 SID 資料的方式取決於作系統。 如需詳細資訊,請參閱 在安全性實體物件上變更存取安全性。
下圖顯示一個 Win32_ACE 實例的內容。
範例:檢查誰可以存取印表機
下列 VBScript 程式代碼範例示範如何使用印表機安全性描述元。 腳本會呼叫 Win32_Printer 類別中的 GetSecurityDescriptor 方法來取得描述元,然後判斷安全性描述元中是否存在任意訪問控制清單 (DACL)。 如果有 DACL,腳本會從 DACL 取得存取控制專案清單。。 每個 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