WMI セキュリティ記述子オブジェクト
WMI には、セキュリティ記述子を読み取り、操作して、セキュリティ保護可能なオブジェクトにアクセスできるユーザーを特定できるオブジェクトとメソッドがあります。
- セキュリティ記述子の役割
- Access Control と WMI セキュリティ オブジェクト
- Win32_SecurityDescriptor オブジェクト
- DACL と SACL
- Win32_ACE、Win32_Trustee、Win32_SID
- 例: プリンターにアクセスできるユーザーの確認
- 関連トピック
セキュリティ記述子の役割
セキュリティ記述子は、ファイル、レジストリ キー、WMI 名前空間、プリンター、サービス、共有など、セキュリティ保護可能なオブジェクトのセキュリティ属性を定義します。 セキュリティ記述子には、オブジェクトの所有者グループとプライマリ グループに関する情報が含まれています。 プロバイダーは、リソース セキュリティ記述子と要求元ユーザーの ID を比較し、ユーザーが要求しているリソースにアクセスする権限があるかどうかを判断できます。 詳細については、「WMI セキュリティ保護可能オブジェクトへのアクセス」を参照してください。
GetSD などの一部の WMI メソッドは、バイナリ バイト配列形式でセキュリティ記述子を返します。 Windows Vista 以降、Win32_SecurityDescriptorHelper クラスのメソッドを使用して、バイナリ セキュリティ記述子を、Win32_SecurityDescriptor のインスタンスに変換して、より簡単に操作できるようになりました。 詳細については、「セキュリティ保護可能なオブジェクトのアクセス セキュリティの変更」を参照してください。
Access Control と WMI セキュリティ オブジェクト
WMI セキュリティ オブジェクトのリストを次に示します。
次の図に、WMI セキュリティ オブジェクト間のリレーションシップを示します。
アクセス セキュリティの役割の詳細については、セキュリティのベスト プラクティスと、Access Control に関するページ、「WMI セキュリティの維持」を参照してください。
Win32_SecurityDescriptor オブジェクト
次の表に、Win32_SecurityDescriptor クラス プロパティを示します。
プロパティ | 説明 |
---|---|
ControlFlags | SD またはその個々のメンバーの意味を修飾する制御ビットのセット。
ControlFlags ビット値の設定の詳細については、Win32_SecurityDescriptor に関するページを参照してください。 |
DACL | ユーザーとグループの随意アクセス制御リスト (ACL)、およびセキュリティで保護されたオブジェクトに対するアクセス権。 このプロパティには、アクセス制御エントリを表す Win32_ACE インスタンスの配列が含まれます。 詳細については、「DACL の作成」を参照してください。 |
グループ | このセキュリティで保護されたオブジェクトが属するグループ。 このプロパティには、所有者が属するグループの名前、ドメイン、セキュリティ識別子 (SID) を含む Win32_Trustee のインスタンスが含まれます。 |
所有者 | このセキュリティで保護されたオブジェクトの所有者。 このプロパティには、所有者の名前、ドメイン、セキュリティ識別子 (SID) を含む Win32_Trustee のインスタンスが含まれます。 |
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 ではアクセス制御エントリ (ACE) の許可と拒否の両方が認められているため、DACL の Win32_ACE 順序は重要です。 詳細については、「DACL 内の ACE の順序」を参照してください。
Win32_Trustee によって表される各ユーザー アカウントまたはグループには、アカウントを一意に識別し、アカウントのアクセス特権を指定するセキュリティ識別子 (SID) があります。 SID データの指定方法は、オペレーティング システムによって異なります。 詳細については、「セキュリティ保護可能なオブジェクトのアクセス セキュリティの変更」を参照してください。
次の図は、1 つの 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