プロキシサーバーの背後で PowerShell を効果的に使用する方法

企業ネットワーク内での PowerShell プロキシアクセスのトラブルシューティング方法

企業のプロキシの背後で PowerShell を操作するのは大変ですか? ええ、時々面倒です。 やUpdate-Helpなどのコマンドを実行するInvoke-WebRequestと、接続できないというエラーが表示されることがあります。これは、PowerShell、特に古い Windows PowerShell 5.1 が、Web 要求にシステムのプロキシ設定を自動的に使用しないためです。コマンドを実行するだけで問題なく動作することに慣れている場合、これは大きな問題です。通常、これは、インターネット トラフィックをプロキシ サーバー経由でルーティングする保護されたネットワーク上にいる場合に発生します。多くの場合、認証が必要です。PowerShell にそのプロキシ経由で通信させることは確かに可能ですが、Windows が必要以上に困難にするため、手動での設定が必要になります。表示されるのは、「リモート サーバーに接続できません」などのエラーです。または、更新コマンドでは、コンテンツが利用できない、またはパッケージ ソースを解決できないというメッセージが表示されることがあります。あまり使いやすくはありません。朗報です。PowerShell をプロキシ経由でインターネットリクエストを適切にルーティングするように設定する方法はいくつかあります。クラシック PowerShell (5.1) でも PowerShell Core (6+) でも同じです。ここでは、主な方法、つまり WinHTTP プロキシの設定、認証の処理、そしてセッションごとに設定し直す必要がないようにプロファイルに反映させる方法について解説します。—

PowerShell でプロキシアクセスの問題を修正する方法

WinHTTPプロキシ設定を設定する – PowerShellは多くのタスクでこれをデフォルトにするため

最初に確認すべき点です。PowerShell は内部的に WinHTTP 設定を使用しますが、これはブラウザや Internet Explorer のプロキシ設定とは別のものです。現在の設定を確認するには、PowerShell を開いて次のコマンドを実行します。 netsh winhttp show proxy 「直接アクセス (プロキシサーバーなし)」と表示されている場合、PowerShell はまだプロキシを経由するように構成されていません。設定によっては、IE 設定をインポートするとそれが継承されることもあります。 netsh winhttp import proxy source=ie 会社で既に PC に IE プロキシ設定を使用するように設定されている場合、これで十分な場合が多いです。そうでない場合、またはこれが機能しない場合は、プロキシを手動で設定できます。IP netsh winhttp set proxy "192.168.0.14:3128" とポートを実際のプロキシアドレスに置き換えてください。バイパスリストを追加して、ローカルアドレスや内部サイトがプロキシを経由しないようにすることもできます。 netsh winhttp set proxy "192.168.0.14:3128" bypass-list="10.*, 172.*, 192.168.*, *.corp.domain" 完了したら、 でもう一度確認してくださいnetsh winhttp show proxy。基本的に、Windows に対して、送信 Web 要求をそのプロキシ経由でルーティングするように指示していることになります。これは役立ちますが、プロキシで認証が​​必要な場合は、そこでエラーが発生します。—

プロキシ認証の処理 – デフォルトのWebClientはプロキシ資格情報を無視するため

ここで問題となるのは、PowerShell の一般的な Web リクエスト クラス(特に古いバージョン)が、ログインユーザーの資格情報をプロキシに自動的に送信しないという点です。そのため、コマンドが「407 プロキシ認証が必要です」などのエラーで失敗します。この問題を解決するには、資格情報を明示的に指定する必要があります。 – ドメイン アカウントを使用しており、プロキシが Active Directory 認証(NTLM または Kerberos)をサポートしている場合は、現在の資格情報を再利用できます。 $Wcl = New-Object System. Net. WebClient $Wcl. Headers. Add("user-agent", "PowerShell Script") $Wcl. Proxy. Credentials = [System. Net. CredentialCache]::DefaultNetworkCredentials この方法では、PowerShell は現在のログイン情報を使用し、パスワードの入力を求めません。ただし、この方法がうまくいかない場合や、プロキシが明示的な資格情報を必要とする場合があります。手動で入力する場合は、次のコマンドを実行します。 $Wcl = New-Object System. Net. WebClient $Creds = Get-Credential $Wcl. Proxy. Credentials = $Creds ログイン プロンプトが表示されます。設定後、プロキシがこれらの資格情報を受け入れる限り、Invoke-WebRequestまたはなどのコマンドが成功する可能性があります。 – PowerShell Core (6+) では状況が少し異なり、 HttpClientクラスを使用します。このクラスは別の方法で設定します。 また、対話的に資格情報を要求するように設定することもできます。 注: 多くの場合、DefaultProxy をグローバルに設定すると非常に便利ですが、リクエストごとにプロキシを指定する必要がある場合もあります。 — Update-Help [System. Net. Http. HttpClient]::DefaultProxy = New-Object System. Net. WebProxy('http://proxyserver:3128') [System. Net. Http. HttpClient]::DefaultProxy. Credentials = [System. Net. CredentialCache]::DefaultCredentials [System. Net. Http. HttpClient]::DefaultProxy. Credentials = Get-Credential

PowerShellプロファイルにプロキシ設定を保存するので、毎回設定する必要はありません。

セッションごとにプロキシを手動で設定するのは、すぐに面倒になりますね。自動化するには、PowerShellプロファイルスクリプトに以下のコマンドを追加できます。以下のコマンドを実行するだけです。 notepad $PROFILE または、すべてのユーザーに対してこの処理を実行する場合は、 WebRequestWebProxyのnotepad $PROFILE. AllUsersCurrentHost資格情報を 使った設定など、プロキシ設定コマンドをここに貼り付けてください。スクリプトを実行する前に、実行ポリシーの設定が必要になる場合があります。 保存後、PowerShellを再起動するだけで、プロキシ設定が自動的に読み込まれます。社内プロキシを頻繁に使用していて、設定をやり直すのが面倒な場合は、非常に便利です。— Set-ExecutionPolicy RemoteSigned

プロキシ設定の確認 – 現在設定されている内容を確認する方法

プロキシ設定が有効になっているか確認するには、以下のコマンドを使用してください。ProxyEnable Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' | Select-Object ProxyServer, ProxyEnable が 1 の場合、有効になっています。実際のプロキシアドレスは ProxyServer に入力してください。また、システムが適切なプロキシを経由してトラフィックをルーティングしているかどうかを確認するには、以下のコマンドをテストしてください。 [System. Net. WebProxy]::GetDefaultProxy() プロキシを簡単に有効または無効にするには、 以下のコマンドをテストしSet-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable -Value 1Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable -Value 0 ください。これらの設定を切り替えると他のアプリケーションに影響する可能性があるため、問題がない場合にのみ実行してください。—

PowerShellでWindowsのプロキシ設定を変更する – 動的に変更する必要がある場合がある

新しいプロキシを直接設定したいですか? 次のような関数を使います: 次 function Set-Proxy($server, $port) { if ((Test-NetConnection -ComputerName $server -Port $port).TcpTestSucceeded) { Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -Name ProxyServer -Value "$($server):$($port)" Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -Name ProxyEnable -Value 1 } else { Write-Error "Proxy server or port invalid: $($server):$($port)" } } のように呼び出します: Set-Proxy 192.168.1.100 3128 プロキシ例外アドレスを追加することもできます: $ProxyExceptionList = ";*.woshub.com;*.contoso.com" $ProxyProperty = Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" if ($ProxyProperty. ProxyOverride) { $OldValue = $ProxyProperty. ProxyOverride $NewValue = $OldValue + $ProxyExceptionList Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name ProxyOverride -Value $NewValue } else { Write-Warning "Proxy override list is empty!" } また、プロキシのユーザー名とパスワードを保存したい場合(これはあまり安全ではありませんが)は、レジストリに保存できます: Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -Name ProxyUser -Value "username" Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -Name ProxyPass -Value "password"

まとめ

PowerShell を企業プロキシの背後でスムーズに動作させるのは、まさにプラグアンドプレイとは言い難いですが、少し手動で設定すれば可能です。重要なのは、PowerShell がブラウザが読み込んでいる設定だけでなく、Windows または WinHTTP のプロキシ設定も使用することを理解することです。プロキシをグローバルに設定し、資格情報を適切に処理し、必要に応じて設定をプロファイルに保存しておけば、後々頭を悩ませる手間を大幅に省くことができます。Windows は設定を必要以上に難しくしているように感じることもありますが、少なくともこれらのトリックを使えば、通常は問題なく動作する設定になります。

  • 現在のプロキシ設定を で確認しますnetsh winhttp show proxy
  • で設定しますnetsh winhttp set proxy
  • 特にプロキシ認証が関係する場合は、PowerShell コマンドを使用して資格情報を処理します。
  • 利便性のために、お気に入りの設定を PowerShell プロファイルに保持します。
  • 接続を確認するには、次のようなテスト コマンドを使用しますTest-NetConnection

これで、Webリクエストをスムーズに動作させようとしている人にとって、数時間の節約になることを願っています。ただし、システム全体のプロキシ設定を変更した後は、再起動やセッションの再起動が必要になる場合があることを覚えておいてください。頑張ってください!