📘 hkob-astro-notion-blog

これまではてなブログにて情報発信をしていましたが、令和5年3月22日より、こちらでの情報発信を始めました。2019年以前の古い記事は過去の Middleman 時代のものなので、情報が古いです。記録のためだけに残しています。

Windows のプロキシの自動設定 - 産技高専における Windows 環境の構築(2)

💡
この記事は Middleman 時代に書いた古いものです。記録のため、astro-notion-blog に移行していますが、あまり参考にしないでください。
Windows におけるプロキシの設定

学内と学外でネットワークを切り替えるに当たって、もっとも課題になるのがプロキシの設定である。 macOS の場合、システムのネットワークに置いて場所の切り替え機能がある。 高専という場所を作成し、その場所にだけプロキシを設定するという技も可能である。 一方、Windows ではシステムでプロキシをオン・オフを切り替える必要があり、いちいち設定画面を開かなければならない。

私を含めプログラマは面倒なことが嫌いなので、なんとか自動化して楽をしたいと考えるものだ。 早速以下のページを見つけた。→ Windowsのプロキシを自動設定するタスクを作成

確認してみると PowerShell で環境設定まで含めた各種設定をするスクリプトを書き、そのスクリプトをネットワーク切り替えタスク時に自動実行するとのことである。 これだとネットワークを切り替えるだけで何もしなくていいのだが、うちの高専の場合には Web 認証があるため、タスク切り替えまでは無理そうだ (Web 認証を受けるまで、その先のネットワークに接続させてもらえないため)。 ただし、最低限スクリプトを実行するだけでも、かなり労力が減ると思われるので、うまく活用させていただくことにする。

プロキシ切り替えの設定

以下、設定手順を示す。

  1. 今後のことも考え、実行ファイル置き場として、自分のホームディレクトリの下に「bin」というフォルダを作っておく。
  2. まともなエディタはまだ何もインストールしていないので、メモ帳で以下のテキストを入力する。 ファイル名は「全てのファイル」に変更したのち、先ほどの「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
  3. 設定はこれだけ。Explorer でクイックアクセスを見ると、先ほどのファイルが表示されている。早速右ボタンで PowerShell で実行としてみる。
  4. 何回か画面がチラチラするが、無事に作業が終了する。早速、設定→ネットワークとインターネット→プロキシにて設定を見てみると、確かに自動設定されている。
  5. 環境変数も自動設定してくれるとのことなので、PowerShell を立ち上げて確認してみる。PowerShell は Windows ボタンの右ボタンクリックで起動すると楽だ。
  6. 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
    (後略)
  7. 次に学外でこのプロキシの設定が外れることを確認する。手っ取り早いのはネットワークを切った状態にすることだろう。 MacBook Pro の無線 LAN を切って、先ほどのスクリプトを実行してみる。 プロキシサーバの名前が引けなくなったので、ちゃんとプロキシの設定がオフになっている。
  8. PowerShell で環境設定も確認したが、HTTP_PROXY, HTTPS_PROXY の環境設定もなくなっていた。
  9. いちいち右ボタンで実行するのは面倒だという人は、以下のようにショートカットを作成するとよい。
  10. 作成したショートカットでプロパティを表示する。
  11. プロパティのリンク先にてファイル名の前に「PowerShell -ExecutionPolicy ByPass 」を追加する。
  12. この設定によりアイコンが powerShell の形になる。このショートカットをクリックすることで PowerShell スクリプトが自動起動する。
使い方
  1. 高専に到着したら、そのまま Web 認証を実施する。
  2. 上記のショートカットをクリックする。
  3. 以降、システムのプロキシや環境変数のプロキシが設定される
  4. 高専を離れたら、再度ショートカットをクリックする。
  5. 名前が引けなくなるので、自動的にプロキシ設定がオフになり、環境変数もリセットされる。
  6. いちいちディレクトリを開くのも面倒なので、ショートカットだけデスクトップに移動しておいてもよいかと思う。