概要
PowerShellのプロファイルを利用したプロキシの環境変数を設定する方法を紹介します。
PowerShellのプロファイルについて
PowerShellでは、プロファイル Microsoft.PowerShell_profile.ps1
に処理を記述することで、PowerShellの起動時に処理を毎回実行することができます。このプロファイルに環境変数を設定するコマンドや関数を記述しておくことで、環境変数を簡単に設定できるようになります。
プロファイルの場所は環境やPowerShellのバージョンによって変わりますが、以下のコマンドをPowerShellで実行することで確認することができます。
PS C:\> echo $profile
このプロファイルにプロキシの環境変数を設定する処理を記述していきます。
認証なしのプロキシの場合
認証が不要な場合は簡単で、以下のように環境変数 HTTP_PROXY
HTTPS_PROXY
にプロキシサーバーのアドレスを指定すればよいです。以下のような関数 setproxy
をプロファイル内で定義します。
function setproxy {
$proxy = "http://hostname:8080/"
$ENV:HTTP_PROXY = $proxy
$ENV:HTTPS_PROXY = $proxy
}
PowerShellを起動して setproxy
を実行することで、このセッション内で有効な環境変数が設定されます。
PS C:\> setproxy
認証付きのプロキシの場合
認証付きのプロキシを利用する場合、http://user01:password@hostname:8080/
のようにユーザー名とパスワードを含めたアドレスを環境変数に指定する必要があります。
以下のようにすることで、スクリプト内でパスワードを平文で扱わずに認証付きのプロキシを設定する関数が記述できます。
function setproxy {
$proxy = "http://hostname:8080"
$uri = New-Object System.URI($proxy)
$cred = Get-Credential
$user = $cred.UserName
$pass = $cred.GetNetworkCredential().Password
$uri = New-Object System.URI("http://$($user):$($pass)@$($uri.Authority)")
$ENV:HTTP_PROXY = $uri.AbsoluteUri
$ENV:HTTPS_PROXY = $uri.AbsoluteUri
}
ここではアドレスの文字列処理が必要になるため、拡張性も考慮して System.URI
オブジェクトを利用していますが、文字列で扱っても問題ありません。
この処理のポイントとしては、 Get-Credential
を利用してユーザー名とパスワードの入力を行っている点です。関数の実行時に以下のようにユーザー名とパスワードの入力が求められるので、パスワードが平文でスクリプトやコンソールに記述されるのを回避することができます。
PS C:\> setproxy
PowerShell credential request
Enter your credentials.
User: user01
Password for user user01: ********
【参考】認証付きのプロキシの場合で非推奨の方法
参考までに、認証付きのプロキシでパスワードを扱う際にセキュリティ的に推奨されない方法についても紹介します。
パスワードを平文で記載する
素直にプロファイル内でパスワードを直接指定すると以下のようにできますが、パスワードを平文で記述することになるため非推奨です。
function setproxy {
$proxy = "http://hostname:8080/"
$user = "user01"
$pass = "password"
$uri = New-Object System.URI($proxy)
$uri = New-Object System.URI("http://$($user):$($pass)@$($uri.Authority)")
$ENV:HTTP_PROXY = $uri.AbsoluteUri
$ENV:HTTPS_PROXY = $uri.AbsoluteUri
}
パスワードを関数の引数で与える
平文で記載する場合に一工夫加えて、以下のように関数の引数としてパスワードを渡すことも考えられます。
function setproxy($pass) {
$proxy = "http://hostname:8080/"
$user = "user01"
$uri = New-Object System.URI($proxy)
$uri = New-Object System.URI("http://$($user):$($pass)@$($uri.Authority)")
$ENV:HTTP_PROXY = $uri.AbsoluteUri
$ENV:HTTPS_PROXY = $uri.AbsoluteUri
}
PS C:\> setproxy("password")
このようにすることでプロファイル内にパスワードを平文で記述する必要はなくなります。しかし、コマンドは履歴に保存されており、 Get-History
コマンド等でパスワードが確認できてしまうので、これもセキュリティ的に非推奨です。
PS C:\> Get-History
Id Duration CommandLine
-- -------- -----------
1 0.009 setproxy("password")