そのため、古い Windows セットアップ(Windows 8.1 や Server 2012 R2 など)で PowerShell ギャラリーからモジュールをインストールしようとすると、「URI からダウンロードできません」という厄介なエラーに遭遇したことがあるかもしれません。これは実のところかなりよくあることです。古いバージョンの PowerShell では、これらのリポジトリでは Microsoft がサポートしていない古いプロトコル(SSL 3.0 または TLS 1.0)がデフォルトで設定されているためです。また、NuGet が見つからないというエラーや、イベント ビューアーに暗号スイートの問題を示す TLS エラー(イベント ID 36874)が表示されることもあります。基本的に、PowerShell は従来のプロトコルを使用して接続しようとしますが、サーバーが拒否します。スムーズに接続できないのも当然です。
この混乱を回避するには、PowerShell で現在の標準である TLS 1.2 を使用するように強制する必要があります。その方法は比較的簡単です。PowerShell のバージョンがかなり古い場合 (5.1.14xx 未満) は、まずアップデートしてください。古いバージョンではこれらの手順がうまく処理されない可能性があります。それでも問題が解決しない場合は、以下の手順に従ってください。正しく実行すれば、少なくとも PowerShell が TLS 1.2 を使用するようになり、モジュールのインストールが面倒な手間なく行えるようになります。
TLS 1.2 を適用して「URI からダウンロードできません」エラーを修正する方法
PowerShellのバージョンを確認する
- PowerShell を開いて実行します:
host | select-object Version - バージョンが 5.1.14xx より古い場合は、PowerShell の更新を検討してください。この修正には、新しいバージョンの方が確実に適しています。
古い PowerShell では SSL 3.0 または TLS 1.0 がデフォルトで使用される傾向があり、これらは Microsoft のリポジトリによって非推奨およびブロックされているため、バージョンを知っておくと役立ちます。
PowerShell が使用しているプロトコルを確認する
- 走る:
[Net. ServicePointManager]::SecurityProtocol - これにより、 のようなプロトコルが一覧表示されます
Ssl3, Tls。Tls または Tls11 が表示される場合は、問題があります。
一部の設定では、TLS 1.0 や SSL3 が表示される場合がありますが、これらは現在サポートされていません。接続に失敗するのもう無理はありません。
PowerShell で TLS 1.2 を使用するように設定する
- 次のコマンドを実行します。
[Net. ServicePointManager]::SecurityProtocol = [Net. SecurityProtocolType]::Tls12 - これにより、PowerShell は以降のすべての HTTPS リクエストで TLS 1.2 をネゴシエートするようになります。ほとんどの環境で魔法のように機能します。
- ヒント: 場合によっては、これをプロファイル スクリプトに組み込まない限り、新しいセッションを開くたびに実行する必要がある場合があります。
.NET Framework で TLS 1.2 をデフォルトにする (オプションですが推奨)
- この手順により、PowerShell 自体を含むすべての. NET アプリで、PowerShell がデフォルトで TLS 1.2 を使用するようになります。これはレジストリの調整です。
- PowerShell で次のコマンドを実行します (管理者として実行)。
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
PowerShellを再起動します
- 変更を適用するには、PowerShell を閉じて再度開きます。その後、プロトコルを再度確認します。
[Net. ServicePointManager]::SecurityProtocol - と表示される場合は
Tls, Tls11, Tls12、TLS 1.2 が有効になっていて、準備ができていることを意味します。
次に、 などのモジュールを再度インストールしてみてくださいInstall-Module -Name ExchangeOnlineManagement -Force -Scope AllUsers。すべてが正しく設定されていれば、エラーは消え、モジュールがスムーズにダウンロードされるはずです。
正直言って、Windowsは古いプロトコルを廃止するのに必要以上に苦労させているのがちょっと変ですね。一部のマシンでは、これらのコマンドを実行するために再起動やPowerShellの再起動が必要になることもありますが、一度設定してしまえば、その後はそのまま維持されることが多いです。肝心なのは、PowerShellに旧式のプロトコルの使用をやめさせ、安全でサポートされているTLS 1.2を使い続けるように指示することです。シンプルですよね?
まとめ
- PowerShellのバージョンを確認し、必要に応じて更新してください
[Net. ServicePointManager]::SecurityProtocolアクティブなものを確認するために使用します- PowerShellでTLS 1.2を使用するように強制する
[Net. ServicePointManager]::SecurityProtocol = [Net. SecurityProtocolType]::Tls12 - 将来の問題を回避するためにレジストリに強力な暗号化を設定する
- PowerShellを再起動してモジュールのインストールを再試行してください
まとめ
このTLSの問題は、特に古いバージョンのWindowsが関係する場合は面倒です。しかし、プロトコルが適切に設定されれば、PowerShellギャラリーからモジュールをインストールするのは簡単です。Microsoftが古いデフォルト設定をそのまま提供しているのは少し面倒ですが、少なくとも頭を悩ませることなく、うまくやり遂げる方法を学んだのは良いことです。この情報が、誰かのストレス解消に役立つことを願っています。