スクリプトでは、既定の WMI 認証と偽装設定を使用できます。 ただし、スクリプトでは、よりセキュリティの高い接続が必要な場合や、暗号化された接続を必要とする名前空間に接続する場合があります。 詳細については、「名前空間セキュリティ記述子の設定」および「名前空間への暗号化接続の要求」を参照してください。
最も簡単なケースでは、スクリプトで既定の認証と偽装の設定を使用できます。 WMI は通常、共有サービス ホストで実行され、ホスト内の他のプロセスと同じ認証を共有します。 別のレベルの認証で WMI プロセスを実行する場合は、/standalonehost スイッチを使用して winmgmt コマンドを使用して WMI を実行し、一般的に WMI の認証レベルを設定します。 詳細については、「WMI セキュリティの管理」を参照してください。
次のスクリプトでは、偽装レベルと認証レベルに既定の設定を使用します。
strComputer = "."
Set objServices = GetObject("winmgmts:\\" _
& strComputer & "\root\CIMV2")
set objProcessSet = objServices.ExecQuery _
("SELECT Name FROM Win32_Process",,48)
For Each Process in objProcessSet
WScript.Echo Process.Name
Next
GetObject の呼び出しでモニカーを使用し、次の例のように既定のセキュリティ設定を設定することもできます。
strComputer = "."
Set objServices = GetObject( _
"winmgmts:{impersonationLevel=impersonate," _
& "authenticationLevel=pktPrivacy}!root/cimv2")
set objProcessSet = objServices.ExecQuery _
("SELECT Name FROM Win32_Process",,48)
For Each Process in objProcessSet
WScript.Echo Process.Name
Next
スクリプトでさまざまな偽装または認証レベルを設定する方法、またはコンピューターの既定値を設定する方法の詳細については、次のトピックを参照してください。
- VBScript を使用した既定の認証資格情報の変更
- VBScript を使用した既定の偽装設定の変更
- レジストリを使用した既定の偽装レベルの設定
- VBScript での SWbemSecurity オブジェクトへのアクセス
- SWbemSecurity
VBScript を使用した既定の認証資格情報の変更
モニカー文字列と SWbemLocator オブジェクトと SWbemSecurity オブジェクトを使用して、スクリプトの認証レベルを変更できます。
認証レベルは、接続先のオペレーティング システムの要件に従って設定する必要があります。 詳細については、「 異なるオペレーティング システム間の接続」を参照してください。
次の VBScript コード例は、"Server1" という名前のリモート コンピューターから空き領域データを取得するスクリプトで認証レベルを変更する方法を示しています。
strComputer = "Server1"
Set objWMIService = GetObject("winmgmts:{authenticationLevel=Pkt}!\\" _
& strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk")
For each objDisk in colDisks
Wscript.Echo "DeviceID: " & vbTab & objDisk.DeviceID & vbNewLine & _
"FreeSpace: " & vbTab & objDisk.FreeSpace
NextstrComputer = "."
Set objServices = GetObject( "winmgmts:{impersonationLevel=impersonate," _
& "authenticationLevel=pktPrivacy}!root/cimv2")
Set objProcessSet = objServices.ExecQuery("SELECT Name FROM Win32_Process",,48)
For Each Process in objProcessSet
WScript.Echo Process.Name
Next
Next
WMI へのスクリプト モニカー接続では、次の表の "モニカー名/説明" 列に示されている短い名前を使用します。 たとえば、次のスクリプトでは、認証レベルが WbemAuthenticationLevelPktIntegrity に設定されています。
SetobjWMIService = GetObject( _
"winmgmts:{authenticationLevel=pktPrivacy}!root\cimv2")
次の表に、設定できる認証レベルを示します。 これらのレベルは、 WbemAuthenticationLevelEnum 列挙体の Wbemdisp.tlb で定義されます。
| 名前/値 | 説明 |
|---|---|
|
WbemAuthenticationLevelDefault 0 |
モニカー: 既定 WMI では、既定の Windows 認証設定が使用されます。 これは、WMI がデータを返すサーバーで必要なレベルにネゴシエートできるようにする推奨設定です。 ただし、名前空間に暗号化が必要な場合 は、WbemAuthenticationLevelPktPrivacy を使用します。 |
|
WbemAuthenticationLevelNone 1 |
モニカー: なし 認証を使用しません。 |
|
WbemAuthenticationLevelConnect 2 |
モニカー: 接続 クライアントがサーバーとの関係を確立した場合にのみ、クライアントの資格情報を認証します。 |
|
WbemAuthenticationLevelCall 3 |
電話をかける サーバーが要求を受信したとき、各呼び出しの開始時にのみ認証します。 |
|
WbemAuthenticationLevelPkt 4 |
モニカー: Pkt 受信したすべてのデータが予想されるクライアントからのデータであることを認証します。 |
|
WbemAuthenticationLevelPktIntegrity 5 |
モニカー: PktIntegrity クライアントとサーバーの間で転送されたデータが変更されていないことを認証して検証します。 |
|
WbemAuthenticationLevelPktPrivacy 6 |
モニカー: PktPrivacy 以前のすべての偽装レベルを認証し、各リモート プロシージャ 呼び出しの引数値を暗号化します。 接続する名前空間に暗号化された接続が必要な場合は、この設定を使用します。 |
呼び出しが成功したことを確認するには、認証レベルを変更した後で戻り値を確認します。
たとえば、ローカル接続には常に wbemAuthenticationLevelPktPrivacy の認証レベルがあるため、次の例では、ローカル コンピューターに接続するため、認証レベルの設定に失敗します。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate," _
& "authenticationLevel=pktPrivacy}!" _
& "\\" & strComputer & "\root\cimv2")
プロバイダーは、その名前空間への接続でパケット プライバシー (PktPrivacy) を使用しない限り、データが返されないよう、名前空間にセキュリティを設定できます。 これにより、ネットワークを通過するデータが暗号化されます。 低い認証レベルを設定しようとすると、アクセス拒否メッセージが表示されます。 詳細については、「 WMI 名前空間のセキュリティ保護」を参照してください。
VBScript を使用した既定の偽装レベルの変更
WMI 用スクリプト API を呼び出す場合は、偽装レベルに対して WMI で提供される既定値を使用することをお勧めします。 リモート呼び出しと、複数のネットワーク ホップを持つ一部のプロバイダーでは、WMI が使用するよりも高い偽装レベルが必要です。 偽装レベルが十分でない場合、プロバイダーは要求を拒否したり、不完全な情報を提供したりする可能性があります。
モニカーまたはセキュリティ保護可能なオブジェクトに SWbemSecurity.ImpersonationLevel を設定して偽装レベルを設定しない場合は、オペレーティング システムの既定の DCOM 偽装レベルを設定します。 偽装レベルは、接続先のオペレーティング システムの要件に従って設定する必要があります。 詳細については、「 異なるオペレーティング システム間の接続」を参照してください。
次の VBScript コード例は、上記と同じスクリプトで偽装レベルを変更する方法を示しています。
strComputer = "Server1"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")
For each objDisk in colDisks
Wscript.Echo "DeviceID: " & vbTab & objDisk.DeviceID & vbNewLine & _
"FreeSpace: " & vbTab & objDisk.FreeSpace
Next
次の表に、 使用する WbemImpersonationLevelEnum の認証レベルを示します。
| 名前/値 | 説明 |
|---|---|
|
wbemImpersonationLevelAnonymous 1 |
モニカー: 匿名 呼び出し元の資格情報を非表示にします。 WMI の呼び出しは、この偽装レベルで失敗する可能性があります。 |
|
wbemImpersonationLevelIdentify 2 |
モニカー: 識別 オブジェクトが呼び出し元の資格情報を照会できるようにします。 WMI の呼び出しは、この偽装レベルで失敗する可能性があります。 |
|
wbemImpersonationLevelImpersonate 3 |
モニカー: 偽装 オブジェクトが呼び出し元の資格情報を使用できるようにします。 これは、WMI 呼び出し用のスクリプト API に推奨される偽装レベルです。 |
|
wbemImpersonationLevelDelegate 4 |
モニカー: デリゲート オブジェクトが他のオブジェクトに呼び出し元の資格情報の使用を許可できるようにします。 この偽装は、WMI 呼び出し用のスクリプト API で動作しますが、不要なセキュリティ リスクを構成する可能性があります。 |
次の例は、Win32_Processの特定のインスタンスを取得するときにモニカー文字列で偽装を設定する方法 を示しています。
Set object = GetObject("winmgmts:{impersonationLevel=impersonate}!root\cimv2:Win32_Process.Handle='0'")
詳細については、「 WMI アプリケーションまたはスクリプトの作成」を参照してください。
レジストリを使用した既定の偽装レベルの設定
レジストリにアクセスできる場合は、既定の偽装レベルのレジストリ キーを設定することもできます。 このキーは、特に指定がない限り、WMI 用スクリプト API で使用される偽装レベルを指定します。 次のパスは、レジストリ パスを識別します。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\スクリプト\既定の偽装レベル
既定では、レジストリ キーは 3 に設定され、偽装レベルを指定します。 プロバイダーによっては、より高いレベルの偽装が必要になる場合があります。
VBScript での SWbemSecurity オブジェクトへのアクセス
偽装レベルを設定するもう 1 つの方法は、SWbemServices、SWbemObject、SWbemObjectSet、SWbemEventSource、SWbemObjectPath、および SwbemLocator オブジェクトのSecurity_ プロパティとして表示される SWbemSecurity セキュリティ オブジェクトからのものです。
WMI は、親オブジェクトのセキュリティ設定を元のオブジェクトの子孫に渡します。 そのため、このオブジェクトまたはそこから作成されたオブジェクト ( SWbemObject 型のオブジェクトなど) を使用して、WMI および API 呼び出しにログオンした後で 、SWbemServices オブジェクトの偽装レベルを設定できます。