VBScript で既定のプロセス セキュリティ レベルを設定する

スクリプトでは、既定の WMI 認証と偽装設定を使用できます。 ただしスクリプトで、よりセキュリティの高い接続が必要な場合や、暗号化された接続を必要とする名前空間に接続する場合があります。 詳細については、「名前空間セキュリティ記述子の設定」と「名前空間への暗号化された接続の要求」を参照してください。

最も単純な場合は、スクリプトで既定の WMI 認証と偽装設定を使用できます。 WMI は通常、共有サービス ホストで実行され、そのホスト内の他のプロセスと同じ認証を共有します。 異なるレベルの認証を使用して WMI プロセスを実行する場合は、winmgmt コマンドで /standalonehost スイッチを指定して 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 を使用した既定の認証資格情報の変更

モニカー文字列と、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")

次の表に、設定できる認証レベルの一覧を示します。 これらのレベルは、Wbemdisp.tlb 内の列挙 WbemAuthenticationLevelEnum で定義されています。

名前/値 説明
WbemAuthenticationLevelDefault
0
モニカー: 既定
WMI では、既定の Windows 認証設定を使用します。 これは、WMI が、データを返すサーバーから要求されるレベルに対してネゴシエートできるようにする推奨設定です。 ただし、名前空間のために暗号化が必要な場合は、WbemAuthenticationLevelPktPrivacy を使用します。
WbemAuthenticationLevelNone
1
モニカー: None
認証を使用しません。
WbemAuthenticationLevelConnect
2
モニカー: Connect
クライアントがサーバーと関係を確立した場合のみ、クライアントの資格情報を認証します。
WbemAuthenticationLevelCall
3
Call (英語の可能性あり)
サーバーが要求を受信するときに、各呼び出しの最初にだけ認証します。
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
モニカー: Anonymous
呼び出し元の資格情報は非表示になります。 この偽装レベルでは、WMI 呼び出しは失敗することがあります。
wbemImpersonationLevelIdentify
2
モニカー: Identify
オブジェクトによる呼び出し元の資格情報のクエリが許可されます。 この偽装レベルでは、WMI 呼び出しは失敗することがあります。
wbemImpersonationLevelImpersonate
3
モニカー: Impersonate
オブジェクトによる呼び出し元の資格情報の使用が許可されます。 これは、WMI 呼び出し用のスクリプト API で推奨される偽装レベルです。
wbemImpersonationLevelDelegate
4
モニカー: Delegate
オブジェクトが呼び出し元の資格情報の使用を他のオブジェクトに許可できるようにします。 この偽装は、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\Scripting\Default Impersonation Level

既定では、レジストリ キーは 3 に設定され、偽装レベルを指定しています。 一部のプロバイダーには、より高いレベルの偽装が必要になる場合があります。

VBScript での SWbemSecurity オブジェクトへのアクセス

偽装レベルを設定できる別の方法は、SWbemServicesSWbemObjectSWbemObjectSetSWbemEventSourceSWbemObjectPathSwbemLocator の各オブジェクトの Security_ プロパティとして出現する、SWbemSecurity セキュリティ オブジェクトからの方法です。

WMI により、親オブジェクトのセキュリティ設定が、元のオブジェクトの子孫に渡されます。 そのため、このオブジェクト、またはそれから作成された SWbemObject 型のオブジェクトなどのオブジェクトを使用して、WMI と API 呼び出しにログオンした後に SWbemServices オブジェクトの偽装レベルを設定できます。

リモート コンピューター上の WMI への接続

スクリプト クライアントのセキュリティ保護