ad1

2020年5月18日月曜日

PowerShell 5.1 環境で PowerCLI のインストールエラーが出た時の対処方法 ②(TLS バージョン問題での Install-Module や Register-PSRepository のエラー対応)

先日投稿した PowerShellGet と PackageManagement を新しいものに置き換えることで解決した PowerCLI のインストールできない問題、
調べていたら PowerShell Gallery が 4月から TLS 1.0 / TLS 1.1での接続が不可となり TLS 1.2 が必須となっていたことが原因だったようです。
詳細は以下の Microsoft の公式アナウンスを参照ください。


PowerShell Gallery TLS Support
https://devblogs.microsoft.com/powershell/powershell-gallery-tls-support/

ワークアラウンドとして適用した PowerShellGet 2.2.4.x から TLS 1.2 が強制されるようになっていたのでエラーが回避できた様です。

PowerShell で TLS 1.2 を強制することでの回避方法

先日の環境の PowerShellGet と PackageManagement をそれぞれ初期バージョンの 1.0.0.1 に戻して、TLS 1.2 を強制することで問題が回避できるか確認しました。

※ 公式手順が MS Blog にありましたのでリンクを追記します (2022/11/03)

# 最初に PowershellGet などのバージョンを確認
PS C:\> Get-Module PackageManagement,PowershellGet -list | Select-Object Name,Version,Path

Name              Version Path
----              ------- ----
PackageManagement 1.0.0.1 C:\Program Files\WindowsPowerShell\Modules\PackageManagement\1.0.0.1\PackageManagement.psd1
PowerShellGet     1.0.0.1 C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PowerShellGet.psd1


# この状態で PowerShell Gallery から PowerCLI を見つけることができるか確認

PS C:\> Find-Module -Name VMware.PowerCLI
警告: Unable to resolve package source 'https://www.powershellgallery.com/api/v2'.
PackageManagement\Find-Package : 指定された検索条件とパッケージ名 'VMware.PowerCLI' と一致するものが見つかりませんでした。
登録されている使用発生場所 C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1360 文字:3
+         PackageManagement\Find-Package @PSBoundParameters | Microsoft ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Microsoft.Power...ets.FindPackage:FindPackage) [Find-Package], Exception
    + FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.FindPackage

# エラーになったのでプロトコルを確認

PS C:\> [Net.ServicePointManager]::SecurityProtocol
Ssl3, Tls

# Microsoft の公式ブログにもある手順で TLS 1.2 を設定

PS C:\> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

# TLS 1.2 が指定されたことを確認

PS C:\> [Net.ServicePointManager]::SecurityProtocol
Tls12

# もう一度 Find-Module で PowerCLI が見つかるか確認

PS C:\> Find-Module -Name VMware.PowerCLI

Version    Name                                Repository           Description
-------    ----                                ----------           -----------
12.0.0.... VMware.PowerCLI                     PSGallery            This Windows PowerShell module contains VMware.PowerCLI
 


手順としては非常にシンプルで、

[Net.ServicePointManager]::SecurityProtocol

で現在のプロトロルバージョンを確認し、古いバージョンの指定のままならば

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

で TLS 1.2 の利用を強制設定すれば今まで通りデフォルトバージョンの PowerShellGet でも PowerCLI のインストール、メンテナンスができました。
セキュリティの観点からも既定値はあらかじめ変えておいたほうが良いかもしれませんね。

また、PowerShellGet 2.2.4.x から TLS 1.2 が強制されるようになっているので、TLS 1.2 を指定したついでにプリインストールされている PowerShellGet も更新してしまうと良いです。

プリインストールされている PowershellGet のアップデート方法


# 現在(プリインストール)の PowerShellGet,PackageManagement のバージョンを確認

PS C:\> Get-Module PowerShellGet,PackageManagement -ListAvailable
    ディレクトリ: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Binary     1.0.0.1    PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-Packa...
Script     1.0.0.1    PowerShellGet                       {Install-Module, Find-Module, Save-Module, Update-Module...}

# PowerShellGet を更新 (プリインストールのものは Update-Module ではなく Install-Module に -AllowClobber オプションを使う)

PS C:\> Install-Module PowerShellGet -AllowClobber -Force

# インストールされたバージョンを確認
# Update-Module ではないので更新さらたバージョンと旧バージョンが両方確認出来る

PS C:\> Get-Module PowerShellGet,PackageManagement -ListAvailable
    ディレクトリ: C:\\Documents\WindowsPowerShell\Modules
ModuleType Version    Name                                ExportedCommand
---------- -------    ----                                ----------------
Script     1.4.8.1    PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-Packa...
Script     2.2.5      PowerShellGet                       {Find-Command, Find-DSCResource, Find-Module, Find-RoleCap...

    ディレクトリ: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Binary     1.0.0.1    PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-Packa...
Script     1.0.0.1    PowerShellGet                       {Install-Module, Find-Module, Save-Module, Update-Module...}


PowerShellGet が更新できればその後は PowerShell Gallery などへの接続は TLS 1.2 を利用するようになります。


ご参考まで

1 件のコメント:

  1. お陰で問題を回避できました。ありがとうございます。

    返信削除

過去30日でアクセスの多い投稿