Powershellを使って正しく認証プロキシ経由でWebアクセスする

概要

  • プロキシの自動構成スクリプト(.pac)に従って、正しい認証プロキシの認証を通した上で、Powershellでwebアクセスしたい。
  • つまり、アクセスするURLに対応するプロキシのURLを取得して、Invoke-Webrequestに渡してWebアクセスしたい。
  • [System.Net.WebRequest]::GetSystemWebProxy()を使うとOS設定を利用して、URLに対応するプロキシを取得することができる。

実際

OSでプロキシ設定がなされていることを前提としている

# 各種設定
$URL = "http://example.com"

# 認証情報の生成(本来は暗号化して外だししておく)
$ProxyUser = "User"
$ProxyPassword = "PassWord"
$securePassword = ConvertTo-SecureString $ProxyPassword -AsPlainText -Force
$proxyCredntial  = System.Management.Automation.PSCredential ($ProxyUser, $securePassword)

#システムのProxy設定を利用して、URLに対応するProxy経由でアクセス
$SystemProxy = [System.Net.WebRequest]::GetSystemWebProxy()
$proxy = $SystemProxy.GetProxy($URL)
Invoke-Webrequest $URL -Proxy $proxy.AsoluteUri -ProxyCredential $proxyCredntial  Method Get

環境はWindows10で実行しているので、Powerhell 5.0以降であれば動作するはず。

その他

  1. web上にはデフォルトプロキシを設定してしまうという例が散見されるが、汎用性に欠ける。

  2. プロキシの自動構成スクリプト(.pac)、要はJavascriptなので、ScriptControllerで実行してやろうと思った。しかし、ScriptControllerは64bit OSでは廃止されており不可能だった。

  3. 実用を考えるなら、パスワードはスクリプトに記載しせず、事前にSecureStringを利用してファイルに保存しておき、スクリプトの中でCredentialを生成する必要すべき。*1

  4. 例示用のドメインについてはRFC2606を参照のこと。

*1:正直なところ、私はSecureStringについて正しく理解しているとは言い難い。どこかで調べてまとめたい