SharePoint Online Client Components SDK を利用している PowerShell が 2021 年 3月末ごろから時々接続不良を起こす事象が発生しました。
頻度がだんだんと高くなってきたため、調査し対処できたので書き留めておきたいと思います。
まず、原因は Windows Server 2016 を利用し PowerShell から .NET Framework を呼び出していたことで、 TLS 1.1で接続しに行っていたのです。
2020 年 10 月から TLS 1.1 以前の EOS に向けて Microsoft 365 の仕組みに手が入り始めているため、その影響を受けた。というのが顛末でした。
具体的には以下のようなコードを書いた場合に発生します。
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
中略
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $pwd);
$context = New-Object Microsoft.SharePoint.Client.ClientContext($url)
$context.Credentials = $credentials
$lists = $context.Web.Lists
$context.Load($lists)
$context.ExecuteQuery()
疑似的に状況を作り出したのですが、以下のエラーが発生する形となります。
接続が切断されました:受信時に予期しないエラーが発生しました
以下のコマンドを打つとわかるのですが、 TLS 1.2 のアクセスに対応していない結果となっています。
[Net.ServicePointManager]::SecurityProtocol
以下のコマンドを打つことで、 TLS 1.2 への対応がなされます。(ただし .NET Framework 4.6 に対する Windows Update が行われている必要があります)
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
この対応を行った後に ExecuteQuery を行うことで正常にデータを取得することができました。
Microsoft 365 関連の PowerShell コマンドレット群は TLS 1.2 への対処が進んでいるのですが Client Components SDK は見落としていた。というのが原因でした。
皆さんも不安定な接続状況となったときは TLS 1.2 対応を見直してみましょう。
音楽:Fly up in the air