none
プログラムからネットワークの再接続をしたい RRS feed

  • 質問

  • よろしくお願いします。

    現在、接続されているネットワークを自動で切断し、そのあと、自動で接続する、

    という一連の流れを、プログラムから実行したいのですが、

    どのような方法があるでしょうか。

    「ネットワークと共有センター」の「接続または切断」をクリックして、「切断」と「接続」を手動でクリックすれば可能ですが、これを自動化させたいです。

    できれば、接続時のユーザー情報の入力は省略(OS に記録しているものを自動で使用)したいです。

    (接続先は変更しません。)

    OS 側で、「切断時に自動接続する」などの設定が必要であれば、それもプログラムから設定したいです。

    (この設定があれば、切断するだけで、自動的に再接続されるはずなので・・・)

    PC を再起動すると、自動でインターネットが切断された後、接続されますが、

    PC を再起動せずに、これを行いたいです。

    自分で調べた範囲では、

    「ネットワーク、インターネットに接続しているか調べる」(http://dobon.net/vb/dotnet/internet/detectinternetconnect.html)

    によって、現在、接続されているか、切断されているか、を知る方法がわかりました。

    接続、切断する方法はわかりませんでした。

    VB.NET から shell などを起動する方法でも構いません。

    どうぞよろしくお願いします。

    本番環境

    OS : Windows 7

    開発環境

    OS : Windows 7

    .Net Framework 3.5



    • 編集済み FrRL 2013年7月6日 13:30
    2013年7月6日 12:52

回答

  • こんな感じの .vbs ファイルを実行してみるのはどうでしょうか。(COM 操作が多いので、あえて VB.NET ではなく VBS で記述しています)

    WMI あたりで、もっとスマートにできるのかも知れませんが…。

    Option Explicit
    
    Dim sh, fo, fs, fi, f, v
    Set sh = WScript.CreateObject("Shell.Application")
    For Each f In sh.Namespace("::{7007ACC7-3202-11D1-AAD2-00805FC1270E}").Items()
      If f.Name = "ローカル エリア接続" Then
        For Each v In f.Verbs
          If Left(v.Name, 5) = "無効にする" Then
            v.DoIt
            WScript.Sleep 1500
            Exit For
          End If
        Next
        Exit For
      End If
    Next
    WScript.Sleep 1500
    For Each f In sh.Namespace("::{7007ACC7-3202-11D1-AAD2-00805FC1270E}").Items()
      If f.Name = "ローカル エリア接続" Then
        For Each v In f.Verbs
          If Left(v.Name, 5) = "有効にする" Then
            v.DoIt
            WScript.Sleep 1500
            Exit For
          End If
        Next
        Exit For
      End If
    Next
    

    • 回答としてマーク 星 睦美 2013年7月29日 2:18
    2013年7月6日 15:05
  •  複数の考えるポイントがあります。

     まず、IP アドレスを借りるときに、どのように借りているか。たいていの場合、期限をつけて借りているはずです。その期限内であれば、同じアドレスが割り当てられます。それは、設定で変えられるかもしれません。

     そして、直接つながっている機器は、どれなのか。依頼主様の環境を調べなければわかりませんが、たとえば家庭用の回線の場合、終端装置などが直接つながっている機器で、PC はそこから NAT でつながっていることになっていることがあります。


    Jitta@わんくま同盟

    • 回答としてマーク 星 睦美 2013年7月29日 2:20
    2013年7月7日 7:43
  • 依頼主の環境(本番環境)では、複数の ISP (インターネットサービスプロバイダー)と契約していて、「ネットワークと共有センター」の「接続または切断」で、複数の PPPoe 接続が一覧表示される状態なのですが、この中の、接続中の PPPoe 接続について、切断と再接続を行いたいです。

    (依頼主ではなく)質問者さんは、複数のISP契約、またその環境下でどのように設定すれば希望するISP側の経路で通信可能か、などわかりますでしょうか? (いわゆるマルチホーミングですが。)

    それが扱えないのであれば、手に負えないように思います。現に再現できないと書かれていますが、質問者さんの環境はJittaさんが指摘しているようなブロードバンドルーターがはさまっているのではありませんか? その程度で再現できないと言ってしまうようでは…。

    質問そのものに対しては、魔界の仮面弁士さんの提案するVBS以外にも、WMIのWin32_NetworkAdapterクラス及びそのEnable / Disableメソッドを使用することもできます。…と書くと今度はWMIの操作方法を聞かれるかな。

    • 回答としてマーク 星 睦美 2013年7月29日 2:20
    2013年7月7日 22:41

すべての返信

  • こんな感じの .vbs ファイルを実行してみるのはどうでしょうか。(COM 操作が多いので、あえて VB.NET ではなく VBS で記述しています)

    WMI あたりで、もっとスマートにできるのかも知れませんが…。

    Option Explicit
    
    Dim sh, fo, fs, fi, f, v
    Set sh = WScript.CreateObject("Shell.Application")
    For Each f In sh.Namespace("::{7007ACC7-3202-11D1-AAD2-00805FC1270E}").Items()
      If f.Name = "ローカル エリア接続" Then
        For Each v In f.Verbs
          If Left(v.Name, 5) = "無効にする" Then
            v.DoIt
            WScript.Sleep 1500
            Exit For
          End If
        Next
        Exit For
      End If
    Next
    WScript.Sleep 1500
    For Each f In sh.Namespace("::{7007ACC7-3202-11D1-AAD2-00805FC1270E}").Items()
      If f.Name = "ローカル エリア接続" Then
        For Each v In f.Verbs
          If Left(v.Name, 5) = "有効にする" Then
            v.DoIt
            WScript.Sleep 1500
            Exit For
          End If
        Next
        Exit For
      End If
    Next
    

    • 回答としてマーク 星 睦美 2013年7月29日 2:18
    2013年7月6日 15:05
  • 魔界の仮面弁士さま、ご回答ありがとうございます。

    ローカルエリア接続の有効・無効の方法について、大変参考になりました。

    COM 操作が多い場合は、VBS の方が記述しやすいんですね。勉強になります。

    早速試させていただく前に、一つだけ、確認したいことがあるのですが、ローカルエリア接続の再接続でも、PC に割り当てられたグローバル IP アドレスは更新されるでしょうか?

    こちらの質問について、言葉が不十分な点があり、まことに申し訳ありませんでした。目的は、インターネットプロバイダーから取得した IP アドレスを新たに取得しなおすことです。

    依頼主の環境(本番環境)では、複数の ISP (インターネットサービスプロバイダー)と契約していて、「ネットワークと共有センター」の「接続または切断」で、複数の PPPoe 接続が一覧表示される状態なのですが、この中の、接続中の PPPoe 接続について、切断と再接続を行いたいです。

    しかし、当方の開発環境では再現できなくて・・・。

    PPPoe 接続をしている時、ローカルエリア接続の再接続を行うと、プロバイダーへの再接続が要求されるのでしょうか?ローカルエリア接続の再接続の場合、LAN 内でのプライベート IP アドレスだけが再取得される、という形になりませんでしょうか?

    言葉不足でまことに申し訳ございませんでした。

    どちらにしても、ご提示いただいたコードは大変参考になりました。この後、ぜひ試させて頂きたいと思います。

    (この類の開発は、テスト用の PPPoe のアカウントを依頼主から借りないと難しいですね。すみません…)

    • 編集済み FrRL 2013年7月6日 17:08 追記のための編集
    2013年7月6日 16:37
  •  複数の考えるポイントがあります。

     まず、IP アドレスを借りるときに、どのように借りているか。たいていの場合、期限をつけて借りているはずです。その期限内であれば、同じアドレスが割り当てられます。それは、設定で変えられるかもしれません。

     そして、直接つながっている機器は、どれなのか。依頼主様の環境を調べなければわかりませんが、たとえば家庭用の回線の場合、終端装置などが直接つながっている機器で、PC はそこから NAT でつながっていることになっていることがあります。


    Jitta@わんくま同盟

    • 回答としてマーク 星 睦美 2013年7月29日 2:20
    2013年7月7日 7:43
  • 依頼主の環境(本番環境)では、複数の ISP (インターネットサービスプロバイダー)と契約していて、「ネットワークと共有センター」の「接続または切断」で、複数の PPPoe 接続が一覧表示される状態なのですが、この中の、接続中の PPPoe 接続について、切断と再接続を行いたいです。

    (依頼主ではなく)質問者さんは、複数のISP契約、またその環境下でどのように設定すれば希望するISP側の経路で通信可能か、などわかりますでしょうか? (いわゆるマルチホーミングですが。)

    それが扱えないのであれば、手に負えないように思います。現に再現できないと書かれていますが、質問者さんの環境はJittaさんが指摘しているようなブロードバンドルーターがはさまっているのではありませんか? その程度で再現できないと言ってしまうようでは…。

    質問そのものに対しては、魔界の仮面弁士さんの提案するVBS以外にも、WMIのWin32_NetworkAdapterクラス及びそのEnable / Disableメソッドを使用することもできます。…と書くと今度はWMIの操作方法を聞かれるかな。

    • 回答としてマーク 星 睦美 2013年7月29日 2:20
    2013年7月7日 22:41
  • FrRL さん、こんにちは
    フォーラム オペレーターの星 睦美です。

    FrRL さんが検証作業をするうえで参考にしていただけたと思いますので、
    フォーラムの回答者からの返信に私から[回答としてマーク] させていただきました。

    これからもフォーラムをお役立てください。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年7月29日 2:26
  • ご回答いただき、有難うございます。

    また、フォーラムオペレーター様による回答のマーク有難うございました。

     

    作業の報告が遅くなってしまい申し訳ございません。

    現在、本番環境と同様の環境(複数 ISP を保持する環境)で開発・テストをさせていただくために、先方と話を進めている状況です。

    NAT 環境およびマルチホーミングについて、お教えいただいたキーワードをもとに私なりに調べました。また WMI の操作方法についても私なりに調べることができました。

    NAT 環境下での使用なのかどうかという点と、その場合の再接続の方法、またどのようにしてマルチホーミングを行っているのか、または行っていないのかという点を今後調べ、また対策について調べていく予定です。

    大変参考になるアドバイスをいただいて有難うございました。

    後日、一つの解が得られた際に、結果を報告させて頂きたいと思います。

    2013年7月29日 14:39