VBScript を使った WMI へのリモート接続

接続オブジェクトを作成することで、VBScript で WMI へのリモート接続を作成できます。 このオブジェクトには、コンピューターの名前、接続する WMI 名前空間だけでなく、関連する資格情報と認証レベルが含まれています。

VBScript を使ってリモート システムに接続するには

  1. リモート コンピューター名、資格情報、接続の認証レベルなど、接続情報を指定します。

    ログオンに使っているものと同じ資格情報 (ドメインとユーザー名) を使ってリモート コンピューターに接続する場合は、次のコード サンプルのように GetObject モニカーで接続情報を指定できます。

    strComputer = "Computer_B"
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & strComputer & "\Root\CIMv2")
    

    一般には、リモート コンピューター上で接続する WMI 名前空間を指定する必要があります。 これは、既定の名前空間が異なるコンピューター上では同じではない可能性があるためです。 名前空間を指定することで、すべてのコンピューターで同じ名前空間に接続できます。

    モニカー接続を使うための VBScript 定数とスクリプト文字列の詳細については、「VBScript を使用して既定のプロセス セキュリティ レベルを設定する」を参照してください。

  2. 異なるドメインのリモート コンピューターに接続する場合、または異なるユーザー名とパスワードを使う場合は、SWbemLocator.ConnectServer メソッドを使う必要があります。

    モニカーと同様に、ConnectServer を使って、リモート接続の資格情報、認証レベル、名前空間を指定します。 次のコード サンプルは、ConnectServer を使って、Administrator アカウントとパスワードを使ってリモート コンピューターにアクセスする方法を示しています。

    strComputer = "Computer_B"
    Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
                                                         "Root\CIMv2", _
                                                         "fabrikam\administrator", _
                                                         "password")
    
  3. リモート接続に ConnectServer 関数を使う場合、SWbemServices.Security を呼び出して取得できる偽装と認証をセキュリティ オブジェクトに設定します。 列挙体 WbemImpersonationLevelEnum を使って偽装レベルを指定できます。

    次のコード サンプルでは、前の VBScript コード サンプルの偽装レベルを設定します。

    objSWbemServices.Security_.ImpersonationLevel = 3
    

    一部の接続には、特定の認証レベルが必要であることに注意してください。 詳細については、「クライアント アプリケーション プロセスのセキュリティの設定」と「スクリプト クライアントのセキュリティ保護」を参照してください。

    具体的には、リモート コンピューター上で接続する名前空間に、データを返す前に暗号化された接続が必要な場合は、認証レベルを RPC_C_AUTHN_LEVEL_PKT_PRIVACY または 6 に設定する必要があります。 また、名前空間に必要ない場合でも、この認証レベルを使用できます。 これで、データがネットワークを通過するときに確実に暗号化されます。 許可されているよりも低い認証レベルを設定しようとすると、アクセス拒否のメッセージが返されます。 詳細については、「名前空間への暗号化された接続を要求する」を参照してください。

接続が完了したら、引き続き WMI データにアクセスできます。 詳細については、「スクリプトとアプリケーションの WMI タスク」を参照してください。

より大規模な VBScript サンプルについては、SWbemLocator.ConnectServer リファレンス ページの「例」セクションを参照してください。

次の VBScript コード例では、リモート コンピューター名の配列を作成し、各コンピューター上のプラグ アンド プレイ デバイスの名前 (Win32_PnPEntity のインスタンス) を表示することで、同じドメイン内のリモート コンピューターのグループに接続しています。 次のスクリプトを実行するには、リモート コンピューターの管理者である必要があります。 リモート コンピューター名の前に必要な "\\" は、偽装レベルの設定に従ってスクリプトで追加されることに注意してください。 WMI パスの詳細については、「WMI オブジェクトの場所を説明する」を参照してください。

On Error Resume Next 
arrComputers = Array("Computer1","Computer2","Computer3")
For Each strComputer In arrComputers
    WScript.Echo
    WScript.Echo "===================================="
    WScript.Echo "Computer: "& strComputer
    WScript.Echo "===================================="

    Set objWMIService = GetObject("winmgmts:\\" & strComputer& "\Root\CIMv2") 
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PnPEntity",,48) 
    For Each objItem in colItems 
        Wscript.Echo "-----------------------------------"
        Wscript.Echo "Win32_PnPEntity instance"
        Wscript.Echo "-----------------------------------"
        Wscript.Echo "Name: "& objItem.Name
        Wscript.Echo "Status: "& objItem.Status
    Next
Next

次の VBScript コード例を使うと、異なる資格情報を使ってリモート コンピューターに接続できます。 たとえば、異なるドメインのリモート コンピューター、または異なるユーザー名とパスワードを必要とするリモート コンピューターへの接続などです。 この場合、SWbemServices.ConnectServer 接続を使います。

' Full Computer Name
' can be found by right-clicking My Computer,
' then click Properties, then click the Computer Name tab)
' or use the computer's IP address
strComputer = "FullComputerName" 
strDomain = "DOMAIN" 
Wscript.StdOut.Write "Please enter your user name:"
strUser = Wscript.StdIn.ReadLine 
Set objPassword = CreateObject("ScriptPW.Password")
Wscript.StdOut.Write "Please enter your password:"
strPassword = objPassword.GetPassword()
 
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
                                                     "Root\CIMv2", _
                                                     strUser, _
                                                     strPassword, _
                                                     "MS_409", _
                                                     "ntlmdomain:" + strDomain)
Set colSwbemObjectSet = objSWbemServices.ExecQuery("Select * From Win32_Process")
For Each objProcess in colSWbemObjectSet
    Wscript.Echo "Process Name: " & objProcess.Name 
Next

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