知識は未だ霧の中

スパコン眼鏡NET。HPCのことはあまり書かない。

Windows10の設定の手動プロキシ セットアップが正しく動いていない件とその対応

問題

Windows10の設定の手動プロキシ セットアップ (Manual proxy setup)が(条件によって?)正しく動いていない件

環境

Windows 10 (大分昔のバージョンから。もしかしたら最初からかも)

背景

以前のWindowsではプロキシの設定はInternetExprolerから設定するのがよくある方法だったと思う。

Internet Option -> Local Area Network (LAN) Settings の Proxy serverから

f:id:hrontan:20210122211623p:plain

"User a proxy server for your LAN (These settings will not apply to dial-up or VPN connections)" をオンにする。

f:id:hrontan:20210122211641p:plain

さらに、Socksプロキシなどを使っている場合は Advancedから 下記画像のような設定を行う。 sshのDynamic Proxyを使っているケースではこのような設定をすることになるだろう。 (なお、例ではSocksのプロキシサーバーをlocalhostの8080番ポートで動かしている)

f:id:hrontan:20210122211702p:plain

Windows 10でも上記の方法は正しく動くのであるが、サポートが終わるIEを使い続けるのもよろしくない。

現象

上記のような場合、Windows 10 の標準機能で対応するものは 設定 -> ネットワークとインターネット -> プロキシ の画面である。

f:id:hrontan:20210122212013p:plain

IEでの設定と同じもの設定の表記は図の様に、

となる。

これで問題なく動いているように思われる… が、実はここに大きな問題がある。

問題その①

設定を編集できない。

例えば、ポートを8080から8081に変更して保存しても、再度設定画面を開くと元に戻ってしまっているのだ。 保存ボタンが動いていないようだ。。。

問題その➁

トグルスイッチでプロキシをオフにはできるが、オンにはできない。

プロキシの設定をオン -> オフにすると無事に通信がプロキシ経由でなくなる。 一方、オフ -> オンにしても、再度設定画面を開くと元に戻ってしまっている。もちろんプロキシは有効になっていない。

解決策1

上記の設定は、

Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings

  • ProxyServer (RED_SZ)
  • ProxyEnable (REG_DWORD)

のキーに保存されている。

例の設定だと、"ProxyServer"は"socks=localhost:8080" となり、Proxyのオン/オフはProxyEnableの1/0の対応している。

なので、下記の二つのファイルを用意する。

ProxyEnable.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyEnable"=dword:00000001

ProxyDisable.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyEnable"=dword:00000000

上記のファイルをそのまま実行する場合、無意味に管理者権限を要求されるため(今回は管理者権限が不要な範囲の書き換えしか行っていないため)、次のコマンドでファイルを読み込む

プロキシを有効にしたいとき

ProxyEnable.bat

reg import ProxyEnable.reg 

プロキシを無効にしたいとき

ProxyDisable.bat

reg import ProxyDisble.reg 

解決策2

オシャレにPowershellで解決したい場合

ProxySetting.ps1

param(
    [switch] $Enable,
    [switch] $Disable
)
if ($Enable -ne $Disable){
    Set-ItemProperty -LiteralPath  'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings' -Name 'ProxyEnable' -Value ([int]$Enable.IsPresent)
}else{
    Write-Output "Parameter Error"
}

プロキシを有効にしたいとき

powershell -file .\ProxySetting.ps1 -Enable

プロキシを無効にしたいとき

powershell -file .\ProxySetting.ps1 -Disable

雑感

プロキシの設定に関するバリデーションが間違っているのだろうな。と推測。 プロキシ設定を有効にする際や設定の保存を行う際に、"設定"が入力された文字をチェックして、未対応の場合はエラーも出さずに処理を破棄してしまっているのかと。そのうち直してくれるといいなぁという気持ち。