none
ネットワークアダプターの有効・無効の切り替え RRS feed

  • 質問

  • お世話になります。

    ネットワークアダプターの有効・無効の切り替えを行いたいのですが、
    わかりません。

    $nic = gwmi -Query "select * from win32_networkadapter where servicename ='****'"
    $nic.Reset()
    Reset関数がエラーとなります。

    VISTAのwin32_networkadapterクラスには、「Enable、Disable」メソッドがあるらしいのですが・・・・

    方法があれば教えてください。
    2009年4月3日 1:19

回答

  • ローカルエリア接続とかの単位でいいならXPでもこれで切り替えられると思います

    $sh = New-Object -ComObject Shell.Application
    $nc = $sh.NameSpace(3).Items() | ? { $_.Name -eq "ネットワーク接続" }
    $lan = $nc.GetFolder.Items() | ? { $_.Name -eq "ローカル エリア接続" }
    if ( $disable = $lan.Verbs() | ? { $_.Name -eq "無効にする(&B)" } ) { $disable.DoIt() }
    else if ( $enable = $lan.Verbs() | ? { $_.Name -eq  "有効にする(&A)" } ) { $enable.DoIt() }
    • 回答としてマーク TAKAKUN 2009年4月7日 1:16
    2009年4月6日 15:10

すべての返信

  • こんにちは

    現在手元に環境がないので試していませんが

    $nic.Disable() と $nic.Enable() は使用できませんか?

    2009年4月3日 2:48
  • http://msdn.microsoft.com/en-us/library/aa394216(VS.85).aspx

    ここによると、ResetはNot Implemenedとなっています。
    HIROさんがおっさはられている、Disable、Enableで有効、無効の切り替えができることを確認しました。

    ちなみに、VISTAの場合、管理者権限で動かす必要があります。
    http://techbank.jp/nora/(SQL Serverを中心に情報発信中)
    2009年4月3日 15:28
  • >野良さん
    検証ありがとうございました。
    2009年4月3日 15:32
  • ご返事ありがとうございます。

    済みません、プラットフォームを書き忘れていました。

    WindowsXPです。

    確かにVISTAでは動作しますが、XPではこのようなメソッドはないので
    どのようにしたらという質問です。

    申し訳ないです。

    XPでは可能ですか?

    2009年4月6日 1:03
  • Enable()とDisable()はXPでは使用できないので、win32_networkadapter を使用しての変更は無理かもしれません。

    代わりに netsh というコマンドをPowerShellで使用するというのはどうでしょうか?
    (申し訳ないのですが詳しい使用方法までは調べておりません)

    こちらはXPもサポートしているようです。

    2009年4月6日 4:14
  • ご返事ありがとうございます。

    netsh無理っぽいです。

    コマンド的には、下記の方法で行うらしいですが、Windows2003のみが利用可能で
    Xpでは、そんなコマンドはないとおこられます。

    netsh interface set interface "ローカル エリア接続" disable

    CUIでは、なにかと制限がありますね。
    これからでしょうか?

    2009年4月6日 10:16
  • ローカルエリア接続とかの単位でいいならXPでもこれで切り替えられると思います

    $sh = New-Object -ComObject Shell.Application
    $nc = $sh.NameSpace(3).Items() | ? { $_.Name -eq "ネットワーク接続" }
    $lan = $nc.GetFolder.Items() | ? { $_.Name -eq "ローカル エリア接続" }
    if ( $disable = $lan.Verbs() | ? { $_.Name -eq "無効にする(&B)" } ) { $disable.DoIt() }
    else if ( $enable = $lan.Verbs() | ? { $_.Name -eq  "有効にする(&A)" } ) { $enable.DoIt() }
    • 回答としてマーク TAKAKUN 2009年4月7日 1:16
    2009年4月6日 15:10
  • ご返事ありがとうございます。

    Shell.Applicationを使用することで可能となりました。
    ありがとうございました。

    だた一つS.K.さんの記述された内容で理解ができない部分があったので
    教えてください。

    if ( $disable = $lan.Verbs() | ? { $_.Name -eq "無効にする(&B)" } ) { $disable.DoIt() }

    パイプへのオブジェクトへの流れ方なんですが、左辺値のコマンド結果を配列オブジェクトに格納して
    流れていくイメージを持っていたので、このような記述ができるとは思いませんでした。

    この場合、パイプへの流れ方はどのようなイメージとなるのでしょうか。
    教えてください。


    2009年4月7日 1:10
  • 一行で済ませたほうが自分にとって見やすいのではしょって書いてます、すみません
    パイプ演算子は代入演算子より優先度が高いので
     $lan.Verbs() | ? { $_.Name -eq "無効にする(&B)" }
    がまず評価され、その結果の出力が変数に代入されます(出力がない場合は $null です)
    後はif文なので () の中の式を評価して(intに型変換して)0でないなら次の文を実行、ですね
    2009年4月7日 9:37
  • ご返事ありがとうございます。

    勉強になりました。
    演算子の優先順位まで考えてなかったです。

    ありがとうございました。

    2009年4月8日 2:09