Intune関連のコマンドレットを叩くために使うモジュール「Microsoft.Graph.Intune」ですが、利用する際にはまずは「Connect-MSGraph」を用いて認証します。
Windows 10までは特に何も気にせずモジュールをインポートした上で、「Connect-MSGraph」を実行すれば認証されていました。
PowerShellを書く上で、エラーハンドリングが便利になったのでWindows 10を使っていた頃にPowerShell 7.2をインストールしていました。
それからしばらくして、Windows 11にアップグレードした後久し振りにAutoPilotデバイスの情報をPowerShellで引っ張ってくるために「Connect-MSGraph」を実行したところ、下記の様なエラーが発生しました。
PS C:\Users\syobon> Connect-MSGraph
Connect-MSGraph: Could not load type 'System.Security.Cryptography.SHA256Cng' from assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
いろいろと調べていると下記のGitHub Issueが見つかりました。
PowerShellには.NET Frameworkで実行されているDesktopと、.NET Coreで実行されているCoreの2つが存在しています。
Windows 10/11に搭載されているPowerShell 5系はDesktopエディションで、PowerShell 6以降ではCoreエディションのみが用意されています。
どうもこのエディション差が原因なようで、「Microsoft.Graph.Intune」の互換性を下記コマンドで確認してみました。
PS C:\Users\syobon> Get-Module -list Microsoft.Graph.Intune
Directory: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version PreRelease Name PSEdition ExportedCommands
---------- ------- ---------- ---- --------- ----------------
Binary 6.1907.1.0 Microsoft.Graph.Intune Desk {Set-MSGraphAlias, Get-MSGraphDebugInfo…
よく見てみると、PSEditionの値がDeskのみになっていることが確認できます。
これがCoreエディションにも対応していれば下記の様にPSEditionの値がCore,Deskになります。
PS C:\Users\syobon> Get-Module -list ActiveDirectory
Directory: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
ModuleType Version PreRelease Name PSEdition ExportedCommands
---------- ------- ---------- ---- --------- ----------------
Manifest 1.0.1.0 ActiveDirectory Core,Desk {Add-ADCentralAccessPolicyMember, Add-A…
なので、「Connect-MSGraph」コマンドレットが含まれている「Microsoft.Graph.Intune」を利用する場合はPowerShell 5系を使う必要があることが分かりました。
PowerShell 5系を立ち上げる
今のままでは下記の通り「$PSVersionTable」を実行すると、PSVersionが「7.2.1」で、PSEditionが「Core」であることが分かります。
PS C:\Users\syobon> $PSVersionTable
Name Value
---- -----
PSVersion 7.2.1
PSEdition Core
GitCommitId 7.2.1
OS Microsoft Windows 10.0.22000
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
そこで下記のコマンドを実行して、PowerShell 5系を立ち上げます。
PS C:\Users\syobon> powershell -v 5
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows
PS C:\Users\syobon> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.22000.282
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.22000.282
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
これで、PowerShell 5系(例では5.1.22000.282)が動作しており、PSEditionの値が「Desktop」に変わっていることが分かります。
この状態で再度「Connect-MSGraph」を実行してみます。
PS C:\Users\syobon> import-module Microsoft.Graph.Intune
PS C:\Users\syobon> Connect-MSGraph
上図の通り「アカウントにサインイン」ウィンドウが表示されるので、ログインします。
PS C:\Users\syobon> Connect-MSGraph
UPN TenantId
--- --------
syobon@hoge.com z9999999-z999-9999-9999-9999z9z99z99
PS C:\Users\syobon>
すると無事に「Connect-MSGraph」の認証が成功します。
Windows Terminalのデフォルトシェルを変更する
たまに使うくらいであれば、都度「powershell -v 5」でシェルの切替を行えば良いのですが、頻繁に使う場合は結構面倒くさいところ。
Windows Terminalを立ち上げ、タブ追加ボタン右隣の「∨」をクリックし、「設定」をクリックします。
「既定のプロファイル」をクリックし、「Windows PowerShell」を選択し、「保存」をクリックします。
これでWindows Terminalを立ち上げると、PowerShell 5系で立ち上がってくるようになります。
久し振りにどハマりしたポイントだったので、スクリプト例ではないですが記事にしてみました。