本サイトはサイト運営費捻出のため、アフィリエイト広告を利用しています。*詳細
PowerShell 7をインストールしたWindows 11でConnect-MSGraphが使えない状態を何とかする

PowerShell 7をインストールしたWindows 11でConnect-MSGraphが使えない状態を何とかする

スポンサーリンク

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が見つかりました。

Steps to reproduce after importing AzureAd module and Calling the Connect-AzureA…
github.com

PowerShellには.NET Frameworkで実行されているDesktopと、.NET Coreで実行されているCoreの2つが存在しています。

Windows 10/11に搭載されているPowerShell 5系はDesktopエディションで、PowerShell 6以降ではCoreエディションのみが用意されています。

PowerShell のエディションが異なると、基になるランタイムが異なります。
docs.microsoft.com

どうもこのエディション差が原因なようで、「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系で立ち上がってくるようになります。

久し振りにどハマりしたポイントだったので、スクリプト例ではないですが記事にしてみました。

モバイルバージョンを終了