質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.96%

WindowsのProxy設定をレジストリの変更で行う場合に必要な操作

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,864

score 40

初めまして。akaiと申します。

1.行っている事

Windows10で、コマンドラインでレジストリを変更することでプロキシを設定しています。
具体的には、下記のレジストリキーにプロキシサーバーを設定し、

Key: HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer
Type: REG_SZ
Value: socks=localhost:10900

さらに下記のレジストリキーを変更することで、プロキシの有効|無効を切り替えております。

Key: HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable
Type: REG_DWORD
Value: 1(Enable) | 0(Disable)


設定が適用されたかどうか(=接続がプロキシ経由に変更されたかどうか)は、https://whatismyipaddress.com/に接続することで確認しています。

2.発生している問題

問題は、上記1.に書きました方法では、設定がすぐには適用されない事です
GUIでプロキシサーバーの設定を変更した場合は、ダイアログボックスのOKボタンを押下すれば、すぐに適用され、プロキシ経由の接続となります。
しかし、上記1.に書きました方法でレジストリからプロキシをEnableにしても、そのままではプロキシ経由の接続に変更されず、プロキシ設定前の接続で接続できる状態が継続し、この時ブラウザを再起動しても変更されず、次のいずれかの操作を行ってはじめて、プロキシ経由の接続に変更されます。

  • インターネット接続を一旦切断し、再接続する
  • 「ネットワークのトラブルシューティングツール」を実行し、「問題を検出しています」の画面が完了し、「~いくつかのWebサイトにアクセスできることが確認されました」と表示(つまり何も修復や設定変更は行われていないはず)されたとき

3.実現したい事、教えて頂きたい事

コマンドラインで行ったプロキシの設定をすぐに反映させたいのですが、
上記1.のレジストリの変更の後に、足りない操作は何でしょうか?
上記1.のレジストリの変更により、GUIの操作で変更される項目は全て変更できているはずだと思うのですが、なぜ再接続などをしないと、反映されないのでしょうか?
WindowsのダイアログボックスのOKボタンを押下するときに、何かコマンドが実行されるのでしょうか?
(と思い、Win32 APIタグをこの質問に付けました。)

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

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings のレジストリについて、もともとそのレジストリ設定はInternet Explorerとその関連するコンポーネントでWindows内において共通で使われているもので、設定の内容はマイクロソフトが公式に公開しているものではなく、レジストリ設定をハック(<悪い意味ではありません)されたものが長い間に周知されたものでしかありません。もしかしたらレジストリの詳細内容は今や公式に案内されている部分もあるかもしれませんが、全体の動きとしては未サポートのはずです。特に、Microsoft Edgeが公式のブラウザーになってからは、使っていなかった設定データだと思います。

ではユーザーがその設定を手動で変えた場合に、いつ反映するかというとそれも非公式なもので、確実なのはユーザーがいったんログオフ(サインアウト)して再度ログオン(サインイン)したときにユーザープロファイルが再読み込みされたときと、質問者さんが既にご指摘の部分、「WindowsのダイアログボックスのOKボタンを押下するとき」です。OKボタンを押すと効くのは、その設定データを扱うアプリケーションそのものだからです。ブラウザーを再起動しても効かない場合があるのは、ブラウザーは単なるUIを持つ外側のアプリケーションであり、設定を取り扱うコアとなるプログラムは別にあり、それがWindows全体のインターネット接続設定を取り扱っている為です。ですので、ユーザーが手動でレジストリ設定を変更したときに即、設定を反映させるのは難しいかと思います。

まぁ、あと簡単に考えられるのは「インターネットのプロパティ」設定画面は以下のコマンドラインで開くので、「ローカルエリアネットワーク(LAN)の設定」画面で[OK]ボタンをプログラムで押せるよう、がんばってボタン押下をシミュレートする、でしょうか。

C:>C:\Windows\System32\rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl

ちなみにソフトウェアによってはWinHTTPと言う別のインターネット関連技術(と設定項目)を使います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/22 21:16 編集

    dodox86様
    ありがとうございます。理解しました。
    また、アドバイスをありがとうございました!
    教えて頂いたように、OKボタンを押すように組むことにしました。
    「インターネットのプロパティ」設定画面の「接続」タブを直接`control.exe Inetcpl.cpl,Connections,4`で開けるようでしたので、力業ですが下記のようにしまして、これでプロキシ設定がすぐに反映されるようにできました。
    しょっちゅう変更したかったので、大変便利です。
    お世話になりました。

    ```
    Set objWs = CreateObject("WScript.Shell")
    objWs.Run("control.exe Inetcpl.cpl,Connections,4")
    For i=0 To 5000
    ret = objWs.AppActivate("インターネットのプロパティ")
    If ret = True Then
    objWs.Sendkeys "{tab}{tab}{tab}{tab}{enter}"
    For j=0 To 5000
    ret = objWs.AppActivate("ローカル エリア ネットワーク (LAN) の設定")
    If ret = True Then
    objWs.Sendkeys "{enter}{tab}{enter}"
    Exit For
    End If
    WScript.Sleep 1
    Next
    Exit For
    End If
    WScript.Sleep 1
    Next
    WScript.Quit(0)
    ```

    キャンセル

  • 2020/04/22 21:40

    せっかくですので、有効|無効をトグルするVBSを記載します。どなたかの参考になればと思います。

    ```
    Set objWs = CreateObject("WScript.Shell")

    strRegKeyProxyEnable = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable"
    If objWs.RegRead(strRegKeyProxyEnable) = 0 Then
    intNewStatus = 1
    strNewStatus = "Enabled"

    'Start ssh tunnel
    objWs.Run "ssh -D 10900 server", vbHide, False
    Else
    intNewStatus = 0
    strNewStatus = "Disabled"

    'Stop ssh tunnel
    For Each p In GetObject("winmgmts:\\.\root\cimv2").ExecQuery("select * from Win32_Process where CommandLine Like '%ssh%-D%10900%'")
    'MsgBox p.CommandLine p.ProcessId
    p.Terminate
    Next
    End If

    'Toggle registry value to the new status
    objWs.RegWrite strRegKeyProxyEnable, intNewStatus, "REG_DWORD"

    MsgBox strNewStatus, , "Socks Proxy"

    'Push OK button
    objWs.Run("control.exe Inetcpl.cpl,Connections,4")
    For i=0 To 5000
    ret = objWs.AppActivate("インターネットのプロパティ")
    If ret = True Then
    objWs.Sendkeys "{tab}{tab}{tab}{tab}{enter}"
    For j=0 To 5000
    ret = objWs.AppActivate("ローカル エリア ネットワーク (LAN) の設定")
    If ret = True Then
    objWs.Sendkeys "{enter}{tab}{enter}"
    Exit For
    End If
    WScript.Sleep 1
    Next
    Exit For
    End If
    WScript.Sleep 1
    Next

    Set objWs = Nothing
    WScript.Quit(0)
    ```

    キャンセル

  • 2020/04/22 21:46

    こういう、回答を踏まえてのその後の進捗のご報告はとても良いと思いますし、回答者としてもうれしいものですね。後で同じ問題にあたった方が居ればまた、役に立つと思います。どうもありがとうございます。>akainemさん

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る