Hey, Scripting Guy!適応力はあります

Microsoft Scripting Guys

このコラムは、Windows Vista のプレリリース版を基にしています。ここに記載されている情報は変更される可能性があります。

この記事で使用しているコードのダウンロード: ScriptingGuys2006_11.exe (151KB)

多くの方が 、キャリアアップにとってネットワークを広げることが非常に役立つという話を耳にしていると思います。業界内に人脈を築くことで、情報の収集や共有を図ったり、ときには新しい職が見つかったりする場合もあります。Scripting Guys はキャリアを磨くネットワークの要領はまったく得ていません (周知の事実です) が、コンピュータ ネットワークのことなら多少はわかります。スクリプトを使用してネットワークのさまざまな操作ができるからです。

Windows® Management Instrumentation (WMI) には、ネットワーク環境の制御と監視に使用できるクラスが多数用意されています。その中の 2 つ、Win32_NetworkAdapter および Win32_NetworkAdapaterConfiguration を使用すると、コンピュータのネットワーク アダプタ (当たり前ですね) を操作できます。

よく、"スクリプトを使用してネットワーク アダプタを有効にしたり無効にしたりする方法は?" という質問を受けます。じらさずお答えすると、それは無理です。Windows Vista™ を使用するまでは少なくとも。Windows Vista は、Win32_NetworkAdapter クラスに Enable、Disable という 2 つの新しいメソッドが追加されました。これらのメソッドについては、すぐに確認しますが、まずは皆さんががっかりしないうちに、Windows Vista より前のオペレーティング システムでできることを説明します。手始めに、コンピュータで実際に使用できるネットワーク アダプタを検索できます (図 1 を参照してください)。便利ではないでしょうか。

Figure 1 ネットワーク アダプタの検索

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo
Next

図 1 は、最初にローカル コンピュータの WMI サービスに接続します。もちろん、ローカル コンピュータのネットワーク アダプタは GUI で簡単に検索できます。では、リモート コンピュータのネットワーク アダプタの情報を GUI で取得してみてください。このスクリプトの、そして WMI スクリプト全般にいえる長所の 1 つが、strComputer の値をリモート コンピュータの名前に変更するだけで、このスクリプトをリモート コンピュータに対して実行できることです。

WMI サービスに接続した後、Win32_NetworkAdapter クラスをクエリします。このクエリは、コンピュータに搭載されているすべてのネットワーク アダプタのコレクションを返します。その後は、For Each ループを設定して、アダプタのコレクションのそれぞれの Name と Description をエコーバックするだけです。出力は次のようになります。

Name: Broadcom NetXtreme 57xx Gigabit Controller
Description: Broadcom NetXtreme 57xx Gigabit Controller

Name: RAS Async Adapter
Description: RAS Async Adapter

Name: WAN Miniport (L2TP)
Description: WAN Miniport (L2TP)

Name: WAN Miniport (PPTP)
Description: WAN Miniport (PPTP)

Win32_NetworkAdapter の DeviceID、Manufacturer、TimeOfLastReset などのプロパティをエコーバックするだけで、ネットワーク アダプタの他の情報も取得できます。詳細については、名作「Automating TCP/IP Networking on Clients」(英語) を参照してください。場所は、もちろんスクリプト センターです。

変化への適応

Win32_NetworkAdapter クラスは、ネットワーク アダプタについての情報を収集するだけです。アダプタの設定を変更する場合は、Win32_NetworkAdapterConfiguration クラスを使用する必要があります。このクラスは、(Win32_NetworkAdapter にないプロパティがあるおかげで) アダプタの詳しい情報を提供するだけでなく、ネットワーク アダプタを自由に構成できるメソッドを用意しています。

たとえば、アダプタを有効にしたり無効にしたりすることは無理でも、各 TCP/IP 対応アダプタの動的ホスト構成プロトコル (DHCP) を有効にしたり無効にしたりすることは可能です。図 2 に示すスクリプトは、すべての TCP/IP 対応アダプタを検索し、それぞれのアダプタで DHCP が有効かどうかを確認し、有効でない場合は有効にします。

Figure 2 DHCP の有効化

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = False Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableDHCP
        Select Case intReturn
            Case 0
                Wscript.Echo "DHCP enabled"
            Case 1
                Wscript.Echo "You must reboot before DHCP will be enabled"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

図 1 のスクリプトと同様に、図 2 のスクリプトもローカル コンピュータの WMI サービスに接続します。次に、Win32_NetworkAdapterConfiguration クラスにクエリします。TCP/IP 対応アダプタのみを対象にしているので、クエリに次の Where 句を含めました。

Where IPEnabled = 'True'

この句は、IPEnabled が True である Win32_NetworkAdapterConfiguration クラスのインスタンス (これを満たすインスタンスに関連付けられたアダプタは TCP/IP に対応しています) のみを取得することを指定しています。

次に、For Each ループを使用して、クエリから返されたアダプタのコレクションに繰り返し処理を行います。ループの中では、まず各アダプタの DHCPEnabled プロパティをチェックします。このプロパティが False に設定されている場合は DHCP が有効ではないので、有効にします。そのために、アダプタ オブジェクトの EnableDHCP メソッドを呼び出します。それですべてです。

スクリプトの中で起こっていることを見るためだけに、Caption プロパティをエコーバックして処理中のアダプタがわかるようにしました。また、Select Case ステートメントを使用して、処理結果をエンド ユーザーに伝えるための記述子を作成しました。EnableDHCP メソッドは、終了時に整数値を返します。値 0 は、メソッドが正常に実行され、DHCP が有効になったことを示します。値 1 は、メソッドは正常に実行されたが、変更を反映するためにコンピュータを再起動する必要があることを示します。その他の値は、問題があって DHCP が有効にならなかったことを示します。Select Case ステートメントを使用してこれらの整数値をチェックし、適切なメッセージを返します。

アダプタの静的 IP アドレスとサブネット マスクを設定して、DHCP を無効にすることもできます (図 3 を参照してください)。

Figure 3 IP アドレスの設定

arrIPAddress = Array("192.168.0.12")
arrSubnetMask = Array("255.255.255.0")

strComputer = "." 
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")

For Each objItem in colItems
    If objItem.DHCPEnabled = True Then
        Wscript.Echo objItem.Caption
        intReturn = objItem.EnableStatic(arrIPAddress, arrSubnetMask)
        Select Case intReturn
            Case 0
                Wscript.Echo "Static address assigned"
            Case 1
                Wscript.Echo "You must reboot before the static address will take effect"
            Case Else
                Wscript.Echo "Error occurred"
        End Select
        Wscript.Echo
    End If
Next

図 3 のスクリプトは、図 2 のスクリプトとほぼ同じですが、いくつか大きな違いがあります。スクリプトの先頭で、2 つの配列 arrIPAddress および arrSubnetMask を宣言し、それぞれに値を代入します。後の For Each ループで、DHCPEnabled が False ではなく、True である (DHCP が有効である、つまり無効にできる) かどうかをチェックします。その後、アダプタ オブジェクトの EnableStatic メソッドを呼び出します。EnableStatic は EnableDHCP メソッドとは異なりパラメータを取ります。パラメータは、先頭で宣言した、新しい静的 IP アドレスとサブネット マスクが含まれた配列です。

Windows Vista で追加されたもの

Scripting Guys は約束を決して (少なくともめったに) 破りません。前言どおり、今から Windows Vista でできることを説明します。既に説明しましたが、Windows Vista の WMI クラス Win32_NetworkAdapter には、ネットワーク アダプタを有効にしたり無効にしたりするための Enable および Disable という 2 つのメソッドがあります。この他に、アダプタが有効な場合に True、そうでない場合に False を返す新しいプロパティ NetEnabled があります。図 4 に示すスクリプトは、コンピュータ上の無効なネットワーク アダプタをすべて検索して有効にします。

Figure 4 ネットワーク アダプタの有効化

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapter Where NetEnabled = 'False'")

For Each objItem in colItems 
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "Description: " & objItem.Description
    objItem.Enable
    Wscript.Echo
Next

このスクリプトは、図 1 とほぼ同じです (ご存じない方のために言っておくと、私たちは再利用を強く支持しています)。ローカル コンピュータの WMI サービスに接続して、すべての Win32_NetworkAdapter インスタンスにクエリしています。無効なアダプタのみを対象にしているので、次の Where 句を追加しました。

Where NetEnabled = 'False'

この句では、新しい NetEnabled プロパティを使用しています。NetEnabled が False に設定されているアダプタ (つまり、無効になっているネットワーク アダプタ) のみがクエリから返されます。次に、先ほどと同じく、For Each ループを設定して、クエリから返されたネットワーク アダプタ オブジェクトのコレクションをループ処理します。アダプタの Name および Description をエコーバックした後、Enable メソッドを呼び出してアダプタを有効にします。

まったく複雑なところはありません。後は、違う意味のネットワークの扱いに慣れることができたら言うことなしです。

Microsoft Scripting GuysScripting Guy たちはマイクロソフトの仕事をしています、というよりもマイクロソフトにより雇われています。野球をプレイしたり監督したり観戦したり (または他のさまざまな活動を) しているのでない限り、彼らは TechNet Script Center を運営しています。詳細については、https://www.microsoft.com/japan/technet/scriptcenter/default.mspx を参照してください。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.