💡
この記事は Middleman 時代に書いた古いものです。記録のため、astro-notion-blog に移行していますが、あまり参考にしないでください。
Windows におけるプロキシの設定
学内と学外でネットワークを切り替えるに当たって、もっとも課題になるのがプロキシの設定である。 macOS の場合、システムのネットワークに置いて場所の切り替え機能がある。 高専という場所を作成し、その場所にだけプロキシを設定するという技も可能である。 一方、Windows ではシステムでプロキシをオン・オフを切り替える必要があり、いちいち設定画面を開かなければならない。
私を含めプログラマは面倒なことが嫌いなので、なんとか自動化して楽をしたいと考えるものだ。 早速以下のページを見つけた。→ Windowsのプロキシを自動設定するタスクを作成
確認してみると PowerShell で環境設定まで含めた各種設定をするスクリプトを書き、そのスクリプトをネットワーク切り替えタスク時に自動実行するとのことである。 これだとネットワークを切り替えるだけで何もしなくていいのだが、うちの高専の場合には Web 認証があるため、タスク切り替えまでは無理そうだ (Web 認証を受けるまで、その先のネットワークに接続させてもらえないため)。 ただし、最低限スクリプトを実行するだけでも、かなり労力が減ると思われるので、うまく活用させていただくことにする。
プロキシ切り替えの設定
以下、設定手順を示す。
- 今後のことも考え、実行ファイル置き場として、自分のホームディレクトリの下に「bin」というフォルダを作っておく。
-
まともなエディタはまだ何もインストールしていないので、メモ帳で以下のテキストを入力する。 ファイル名は「全てのファイル」に変更したのち、先ほどの「bin」ディレクトリの下に「configure-proxy.ps1」として保存する。 面倒だからと他人にファイルを貰わず、自分で作成すること。他人からもらったPowerShell スクリプトは簡単には実行できないためである。
$PROXY_HOST="svm-proxy02.edu.metro-cit.ac.jp" $PROXY_PORT=15080 $LOCAL_ADDR="172.24.254.1;<local>" $REG_KEY="HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" try { $ignore = [System.Net.Dns]::GetHostAddresses(${PROXY_HOST}) | ? { $_.AddressFamily -eq "InterNetwork" } Set-ItemProperty -path ${REG_KEY} ProxyEnable -value 1 Set-ItemProperty -path ${REG_KEY} ProxyServer -value "${PROXY_HOST}:${PROXY_PORT}" Set-ItemProperty -path ${REG_KEY} ProxyOverride -value ${LOCAL_ADDR} Set-Item -path env:HTTP_PROXY -value "http://${PROXY_HOST}:${PROXY_PORT}" Set-Item -path env:HTTPS_PROXY -value ${env:HTTP_PROXY} [Environment]::SetEnvironmentVariable("HTTP_PROXY", ${env:HTTP_PROXY}, [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("HTTPS_PROXY", ${env:HTTP_PROXY}, [EnvironmentVariableTarget]::User) } catch { Set-ItemProperty -path ${REG_KEY} ProxyEnable -value 0 Remove-Item -path env:HTTP_PROXY Remove-Item -path env:HTTPS_PROXY [Environment]::SetEnvironmentVariable("HTTP_PROXY", "", [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("HTTPS_PROXY", "", [EnvironmentVariableTarget]::User) } $source=@" [DllImport("wininet.dll")] public static extern bool InternetSetOption(int hInternet, int dwOption, int lpBuffer, int dwBufferLength); "@ $wininet = Add-Type -memberDefinition ${source} -passthru -name InternetSettings ${wininet}::InternetSetOption([IntPtr]::Zero, 95, [IntPtr]::Zero, 0)|out-null ${wininet}::InternetSetOption([IntPtr]::Zero, 37, [IntPtr]::Zero, 0)|out-null exit 0
-
設定はこれだけ。Explorer でクイックアクセスを見ると、先ほどのファイルが表示されている。早速右ボタンで PowerShell で実行としてみる。
-
何回か画面がチラチラするが、無事に作業が終了する。早速、設定→ネットワークとインターネット→プロキシにて設定を見てみると、確かに自動設定されている。
-
環境変数も自動設定してくれるとのことなので、PowerShell を立ち上げて確認してみる。PowerShell は Windows ボタンの右ボタンクリックで起動すると楽だ。
-
PowerShell で環境変数を表示するには「Get-ChildItem env:」とすればよいらしい。確認すると「HTTP_PROXY」「HTTPS_PROXY」が確かに設定されている。
PS C:\Users\hkob> Get-ChildItem env: Name Value ---- ----- (中略) HTTP_PROXY http://svm-proxy02.edu.metro-cit.ac.jp:15080 HTTPS_PROXY http://svm-proxy02.edu.metro-cit.ac.jp:15080 (後略)
-
次に学外でこのプロキシの設定が外れることを確認する。手っ取り早いのはネットワークを切った状態にすることだろう。 MacBook Pro の無線 LAN を切って、先ほどのスクリプトを実行してみる。 プロキシサーバの名前が引けなくなったので、ちゃんとプロキシの設定がオフになっている。
- PowerShell で環境設定も確認したが、HTTP_PROXY, HTTPS_PROXY の環境設定もなくなっていた。
-
いちいち右ボタンで実行するのは面倒だという人は、以下のようにショートカットを作成するとよい。
-
作成したショートカットでプロパティを表示する。
-
プロパティのリンク先にてファイル名の前に「PowerShell -ExecutionPolicy ByPass 」を追加する。
-
この設定によりアイコンが powerShell の形になる。このショートカットをクリックすることで PowerShell スクリプトが自動起動する。
使い方
- 高専に到着したら、そのまま Web 認証を実施する。
- 上記のショートカットをクリックする。
- 以降、システムのプロキシや環境変数のプロキシが設定される
- 高専を離れたら、再度ショートカットをクリックする。
- 名前が引けなくなるので、自動的にプロキシ設定がオフになり、環境変数もリセットされる。
- いちいちディレクトリを開くのも面倒なので、ショートカットだけデスクトップに移動しておいてもよいかと思う。