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

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

最も単純なケースでは、スクリプトで既定の認証と権限借用の設定を使用できます。 通常、WMI は共有サービスホストで実行され、ホスト内の他のプロセスと同じ認証を共有します。 異なるレベルの認証を使用して WMI プロセスを実行する場合は、 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 を使用して既定の認証資格情報を変更する

モニカー文字列と 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
モニカー: 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 を設定することによって偽装レベルを設定しない場合は、オペレーティングシステムの既定の 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
モニカー: Impersonate
オブジェクトによる呼び出し元の資格情報の使用が許可されます。 これは、WMI 呼び出し用のスクリプト API に推奨される偽装レベルです。
wbemImpersonationLevelDelegate
4
モニカー: デリゲート
オブジェクトが呼び出し元の資格情報の使用を他のオブジェクトに許可できるようにします。 この偽装は、WMI 呼び出し用のスクリプト API で動作しますが、不要なセキュリティリスクが生じる可能性があります。

次の例は、 Win32 _ プロセスの特定のインスタンスを取得するときに、モニカー文字列の権限借用を設定する方法を示しています。

Set object = GetObject("winmgmts:{impersonationLevel=impersonate}!root\cimv2:Win32_Process.Handle='0'")

詳細については、「 WMI アプリケーションまたはスクリプトの作成」を参照してください。

レジストリを使用して既定の偽装レベルを設定する

レジストリにアクセスできる場合は、既定の偽装レベルのレジストリキーを設定することもできます。 このキーは、特に指定がない限り、WMI のスクリプト API が使用する偽装レベルを指定します。 次のパスは、レジストリパスを識別します。

HKEY _ローカル _ コンピューター \ ソフトウェア \ Microsoft \ WBEM \ スクリプト の \ 既定の偽装レベル

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

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

偽装レベルを設定するもう1つの方法は、 SWbemServicesSWbemObjectSWbemObjectSetSWbemEventSourceSWbemObjectPathSwbemLocatorの各オブジェクトの セキュリティ _プロパティとして表示される、 SWbemSecurityセキュリティオブジェクトからのものです。

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

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

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