0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PowerShellのプロファイルを利用したプロキシの環境変数設定方法

Posted at

概要

PowerShellのプロファイルを利用したプロキシの環境変数を設定する方法を紹介します。

PowerShellのプロファイルについて

PowerShellでは、プロファイル Microsoft.PowerShell_profile.ps1 に処理を記述することで、PowerShellの起動時に処理を毎回実行することができます。このプロファイルに環境変数を設定するコマンドや関数を記述しておくことで、環境変数を簡単に設定できるようになります。

プロファイルの場所は環境やPowerShellのバージョンによって変わりますが、以下のコマンドをPowerShellで実行することで確認することができます。

PowerShell
PS C:\> echo $profile

このプロファイルにプロキシの環境変数を設定する処理を記述していきます。

認証なしのプロキシの場合

認証が不要な場合は簡単で、以下のように環境変数 HTTP_PROXY HTTPS_PROXY にプロキシサーバーのアドレスを指定すればよいです。以下のような関数 setproxy をプロファイル内で定義します。

Microsoft.PowerShell_profile.ps1
function setproxy {
    $proxy = "http://hostname:8080/"
    $ENV:HTTP_PROXY = $proxy
    $ENV:HTTPS_PROXY = $proxy
}

PowerShellを起動して setproxy を実行することで、このセッション内で有効な環境変数が設定されます。

PowerShell
PS C:\> setproxy

認証付きのプロキシの場合

認証付きのプロキシを利用する場合、http://user01:password@hostname:8080/ のようにユーザー名とパスワードを含めたアドレスを環境変数に指定する必要があります。

以下のようにすることで、スクリプト内でパスワードを平文で扱わずに認証付きのプロキシを設定する関数が記述できます。

Microsoft.PowerShell_profile.ps1
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 を利用してユーザー名とパスワードの入力を行っている点です。関数の実行時に以下のようにユーザー名とパスワードの入力が求められるので、パスワードが平文でスクリプトやコンソールに記述されるのを回避することができます。

PowerShell
PS C:\> setproxy

PowerShell credential request
Enter your credentials.
User: user01
Password for user user01: ********

【参考】認証付きのプロキシの場合で非推奨の方法

参考までに、認証付きのプロキシでパスワードを扱う際にセキュリティ的に推奨されない方法についても紹介します。

パスワードを平文で記載する

素直にプロファイル内でパスワードを直接指定すると以下のようにできますが、パスワードを平文で記述することになるため非推奨です。

Microsoft.PowerShell_profile.ps1
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
}

パスワードを関数の引数で与える

平文で記載する場合に一工夫加えて、以下のように関数の引数としてパスワードを渡すことも考えられます。

Microsoft.PowerShell_profile.ps1
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
}
PowerShell
PS C:\> setproxy("password")

このようにすることでプロファイル内にパスワードを平文で記述する必要はなくなります。しかし、コマンドは履歴に保存されており、 Get-History コマンド等でパスワードが確認できてしまうので、これもセキュリティ的に非推奨です。

PowerShell
PS C:\> Get-History

  Id     Duration CommandLine
  --     -------- -----------
   1        0.009 setproxy("password")
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?