Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード

Spacer

*

ワイヤレス ネットワーク アダプタがネットワークに接続していることを確認する方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。特定のワイヤレス ネットワーク アダプタがネットワークに接続していることを確認する方法はありますか。

-- MS

SpacerHey, Scripting Guy! AnswerScript Center

MS さん、こんにちは。このコラムを執筆している Scripting Guy にとって今日は悲しい日です。10 日間にわたってイタリアのペストリーを味わい、 古代都市の遺跡を訪ね、水上タクシーでベネチアを駆け巡ってきましたが、ついに我が家に戻るときが来たのです。実はこんな話をしている間にも、Scripting Guy 一家は、マルコ ポーロ空港まで水上タクシーに乗って行こうとしているところです。そしてこのコラムを執筆している Scripting Guyは最後のゼッポレを食べようとしています (ゼッポレは油で揚げた生地にシナモンと砂糖をまぶしたお菓子です)。

これが最後のゼッポレです。ちょっと失礼。このコラムを執筆している Scripting Guy は涙が出そうです。

まあ、よく言われることですが、良いことには終わりがあります。それでもイタリアでの休暇を終えるまでに、このコラムを執筆している Scripting Guy は、次の 2 つのことを成し遂げることを誓いました。1 つ目はゼッポレをもう少し食べること、2 つ目は特定のワイヤレス ネットワーク アダプタがネットワークに接続しているかどうかを確認するスクリプトを皆さんにご紹介することです。

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapter Where Name = 'Broadcom 802.11a/b/g WLAN'")

For Each objItem in colItems
    Select Case objItem.NetConnectionStatus
        Case 0 strStatus = "Disconnected"
        Case 1 strStatus = "Connecting" 
        Case 2 strStatus = "Connected" 
        Case 3 strStatus = "Disconnecting" 
        Case 4 strStatus = "Hardware not present" 
        Case 5 strStatus = "Hardware disabled" 
        Case 6 strStatus = "Hardware malfunction" 
        Case 7 strStatus = "Media disconnected" 
        Case 8 strStatus = "Authenticating" 
        Case 9 strStatus = "Authentication succeeded" 
        Case 10 strStatus = "Authentication failed" 
        Case 11 strStatus = "Invalid address" 
        Case 12 strStatus = "Credentials required"
    End Select 
    Wscript.Echo "Net Connection Status: " & strStatus
Next

ご覧のように、これは特に複雑なスクリプトではありません。ご覧のとおり、コードのほとんどは、戻り値 (たとえば、0) をもっとわかりやすい文字列値 (たとえば、Disconnected (切断)) に変換する Select Case ステートメントです。それ以外は、たいしたことはありません。

スクリプトでは、まず、ローカル コンピュータの WMI サービスに接続しています。リモート コンピュータのネットワーク アダプタの状態も確認できるか、ですって。もちろん、できます。ただし、注意事項が 1 つあります。リモート コンピュータへの接続を試みることは間違いなく可能です。それを行うには、単純にリモート コンピュータの名前を strComputer 変数に代入します。

strComputer = "atl-fs-01"

もちろん、唯一の問題点は、このコンピュータに搭載されているネットワーク アダプタ (ワイヤレス カード) が 1 つだけで、そのワイヤレス カードが現在接続されていない場合、言うまでもなく (といっても、結局言ってしまいますが) そのコンピュータには接続できません。当然、そのコンピュータの WMI サービスにも接続できません。この時点では、このコンピュータが次のどちらの状態なのかを確認する方法はありません。1) コンピュータは起動しているがネットワークに接続していない、2) コンピュータ自体が起動していない。この状態を区別することについては、気にする必要がない場合がほとんどだと思われますが、念のため覚えておいていただくと良いと思います。

MS さんのお話では、MS さんの会社ではある特定のワイヤレス カードが標準装備されているそうです。このような場合は、1 つのネットワーク アダプタに限定できるので、情報の抽出が容易になります。

Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapter Where Name = 'Broadcom 802.11a/b/g WLAN'")

既にお気付きでしょうが、上記のコード行は、ネットワーク アダプタ情報のみ (Name プロパティの値が「Broadcom 802.11a/b/g WLAN」である、Win32_NetworkAdapter クラスのインスタンス) を取得します。別のワイヤレス カードを使用している場合はどうなるのか、ですって。問題はありません。その場合は、WQL クエリで指定するカードの名前を変えるだけです。たとえば、ワイヤレス カードの名前が My Wireless Adapter である場合、WQL クエリを次のように記述します。

Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapter Where Name = 'My Wireless Adapter'")

また、さまざまなメーカーと型のワイヤレス アダプタを使用している場合はどうなるのか、ですって。ご心配には及びません。今回のコラムの最後で、名前に関係なく、特定のコンピュータに搭載されているすべてのワイヤレス アダプタのネットワーク接続情報を返すスクリプトをご紹介します。

ただしその前に、MS さん用のスクリプトの説明を続けさせてください。先ほどのクエリを発行すると、Name プロパティの値が Broadcom 802.11a/b/g WLAN であるすべてのネットワーク アダプタを含むレコードセットが返されます。その後、For Each ループを設定して、このコレクション全体をループ処理します。このループでは Select Case ステートメントを使用して NetConnectionStatus プロパティの値を取得します。この値は次に示す状態のいずれかに対応する整数値です。

状態

0

Disconnected (切断)

1

Connecting (接続中)

2

Connected (接続)

3

Disconnecting (切断中)

4

Hardware not present (ハードウェアがありません)

5

Hardware disabled (ハードウェアが無効です)

6

Hardware malfunction (ハードウェアが正しく動作していません)

7

Media disconnected (メディアが切断されています)

8

Authenticating (認証中)

9

Authentication succeeded (認証は成功しました)

10

Authentication failed (認証は失敗しました)

11

Invalid address (アドレスが無効です)

12

Credentials required (資格情報が必要です)

この Select Case ステートメントでは、NetConnectionStatus プロパティの値を単純に取得して、その値に対応する状態の文字列を strStatus 変数に代入しています。たとえば、NetConnectionStatus プロパティの値が 0 の場合は、次のコード行を実行します。

Case 0 strStatus = "Disconnected"

後は NetConnectionStatus プロパティの値の代わりに strStatus 変数に代入した値を使用して、接続の状態をエコー バックするだけです。

Wscript.Echo "Net Connection Status: " & strStatus

その結果、次のようなレポートが表示されます。

Net Connection status: Authentication succeeded

コンピュータに搭載されているすべてのワイヤレス アダプタのネットワークの接続状態を返す汎用的なスクリプトについては、次のコードが役に立つと思います。

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi")

Set colItems = objWMIService.ExecQuery("Select * From MSNdis_80211_Configuration")

For Each objItem in colItems

    strName = objItem.InstanceName

    Set objWMIService2 = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

    Set colAdapters = objWMIService2.ExecQuery _
        ("Select * from Win32_NetworkAdapter Where Name = '" & strName & "'")
    
    For Each objAdapter in colAdapters
        Select Case objAdapter.NetConnectionStatus
            Case 0 strStatus = "Disconnected"
            Case 1 strStatus = "Connecting" 
            Case 2 strStatus = "Connected" 
            Case 3 strStatus = "Disconnecting" 
            Case 4 strStatus = "Hardware not present" 
            Case 5 strStatus = "Hardware disabled" 
            Case 6 strStatus = "Hardware malfunction" 
            Case 7 strStatus = "Media disconnected" 
            Case 8 strStatus = "Authenticating" 
            Case 9 strStatus = "Authentication succeeded" 
            Case 10 strStatus = "Authentication failed" 
            Case 11 strStatus = "Invalid address" 
            Case 12 strStatus = "Credentials required"
        End Select 

        Wscript.Echo strName
        Wscript.Echo "Net Connection Status: " & strStatus
        Wscript.Echo
    Next
Next

今日のコラムでは、このコードの詳細は説明しません。ですが、このコードでは、まず次のコード行を使用して root\wmi 名前空間にバインドしていることだけは、お知らせしておきましょう。

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi")

それから、MSNdis_80211_Configuration クラスのすべてのインスタンスを選択します。このクラスは、コンピュータに搭載されているすべてのワイヤレス アダプタ (仮想アダプタを含む) の情報を返します。

Set colItems = objWMIService.ExecQuery("Select * From MSNdis_80211_Configuration")

各ワイヤレス アダプタについて InstanceName プロパティの値を取得し、その値を strName という名前の変数に格納したら、次のコード ブロックを使用して、取得した名前に対応する実際の (物理的な) ネットワーク アダプタに関する情報を取得します。

Set objWMIService2 = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colAdapters = objWMIService2.ExecQuery _
    ("Select * from Win32_NetworkAdapter Where Name = '" & strName & "'")

ここで紹介したスクリプトは、皆さんが実際に実行して結果を確認してみてください。

おっと、私たちが乗る水上タクシーが来たようです。ではまた明日。このコラムを執筆している Scripting Guy は職場から皆さんにコラムをお届けします。彼はマイクロソフトの同僚との再会に胸を高鳴らせているのか、ですって。こう言わせてください。それは、同僚の彼に対する気持ちと同じぐらいでしょう。


ページのトップへページのトップへ