【解決】Connect-MgGraphやGet-MgUserがうまく実行できないときに確認すべきポイント-情シス向けPowerShell入門
「さあ、Microsoft365やOffice365のユーザー管理を自動化しよう!」
そう意気込んでMicrosoft Graph PowerShellを触り始めたのに、最初の一歩でつまずいていませんか?
Connect-MgGraph を実行するとエラーになる、
なんとか接続はできたものの、今度はGet-MgUser を打つとエラー、
ネットの記事通りにやっているはずなのに、なぜか動かない……
実は、これらは技術力不足ではなく、Microsoft Graph特有の非常に「よくある」トラブルです。
この記事では、システム管理の初心者や非エンジニアの方でも、最短ルートでエラーを解消し、Connect-MgGraphやGet-MgUserなどのMgGraphのコマンドを実行できる状態にするための手順をまとめました。
この記事で解決できること
この記事では、次のようなエラーが発生した時の対処方法について説明していきます。
Connect-MgGraphやGet-MgUserなどのMgGraphのコマンドを実行した時、次のようなエラーが発生してうまく実行できないことがよくあります。
例えば Get-MgUserを実行した時、次のようなエラーが出ることがあります。
Get-MgUser_Get: Could not load type 'Microsoft.Graph.Authentication.AzureIdentityAccessTokenProvider' from assembly 'Microsoft.Graph.Core, Version=1.25.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
あるいは Connect-MgGraphを実行した時、次のようなエラーが出ることがあります。
WARNING: Note: Sign in by Web Account Manager (WAM) is enabled by default on Windows. If using an embedded terminal, the interactive browser window may be hidden behind other windows. Connect-MgGraph: InteractiveBrowserCredential authentication failed: Could not load type 'Microsoft.Identity.Client.IMsalSFHttpClientFactory' from assembly 'Microsoft.Identity.Client, Version=4.70.2.0, Culture=neutral, PublicKeyToken=0a613f4dd989e8ae'.
これらのエラーの解決方法について、本記事で説明していきます。
私の環境のように、Microsoft.Graph / PnP.PowerShell / MicrosoftTeams といった複数のモジュールを併用していると、特にこの問題が起きやすいようなのですが、情報システム部門の人は、これらのモジュールを併用しているのが一般的だと思いますので、同じ問題に悩んでいる方が、多くいるのではないかと思い、この記事を書きました。
はじめに
上記のエラーの解決方法について調べると、
・Microsoft.Graphモジュールをいったんアンインストールし、再インストールする。
・複数のモジュールと併用している場合、例えば Microsoft.Graph / PnP.PowerShell / MicrosoftTeams といった複数のモジュールを併用している場合、Install-ModuleやImport-Module、あるいはConnectコマンドの順番を変える(MgGraphを最初にする)、
といった解決法が見つかります。
それらを行なうといったんは解決したように見えます。しかし、後日再び実行するとまた同じエラーが再発してしまうのです。
実際、私もそのドツボにハマり、Microsoft.Graph恐怖症になりかけました。Microsoft.Graphモジュールを使わずに、MicrosoftTeamsモジュールとPnP.PowerShellモジュールだけでなんとか必要な情報を得られないか、あがいてみましたが、やはりどうしてもMicrosoft.Graphモジュールでないと得られない情報があります。
仕方がないのでこの問題に真正面から向き合い、四苦八苦しながら、なんとか解決するに至りました。
まずは、この問題の定石の対処法から説明していきます。
エラーメッセージの核心部分
エラーメッセージの核心部分この部分です。
Could not load type
'Microsoft.Graph.Authentication.AzureIdentityAccessTokenProvider'
from assembly 'Microsoft.Graph.Core, Version=1.25.1.0'
これはつまり、Microsoft.Graph モジュール群のバージョンが食い違っていることを示唆しています。
特に、
- Microsoft.Graph
- Microsoft.Graph.Authentication
- Microsoft.Graph.Core
のバージョンが 混在した状態 になっていることが疑われます。PowerShell ではよくある状況で、新しい MgGraph を上書きインストールしたなどが原因で、以前入れた MgGraph の一部だけが残っているという状態です。
そこで、まず今入っている Graph 関連モジュールの現在の状況を確認をする必要があります。
Get-InstalledModule Microsoft.Graph* | Select Name, Version |Sort Name
もしこの結果、表示されるバージョンにばらつきがあるなら、モジュールの再インストールを試してみて、改善するかどうか確認してみる必要があります。
MgGraph は 複数モジュールの集合体であること、また、PowerShellGet は「部分的な更新」を平気で残すことがあるようで、このような問題が起きるようです。特にTeams、PnP、MgGraphなどの複数のモジュールを同一端末で使っていると起きやすいようです。
対策その1:Graph モジュールを一度「完全に入れ直す」
①すべての Graph 関連モジュールを削除
Get-InstalledModule Microsoft.Graph* | Uninstall-Module -AllVersions -Force
※ エラーが出ても気にせず、消えるだけ消してください
※ ファイル数が多いので1〜2時間くらいかかります。環境によってはそれ以上かかるかもしれません。
※ 管理者権限でやった方が安全です。
② PowerShell を 一度完全に終了
PowerShellだけでなく、VS Code、ISE、その他コンソールすべて一旦閉じてください。
③ 最新版を入れ直す
Install-Module Microsoft.Graph -Scope CurrentUser -Force
ほとんどの環境では、以上の対策で解決すると思われます。
解決しなかった場合は、次の対策に進んでください。
対策その2:Import-Module を明示的に順番を固定して実行する
Import-Moduleを、明示的に順番を固定して実行します。
① Graph を先に固定
Import-Module Microsoft.Graph.Authentication -Force
② Teams
Import-Module MicrosoftTeams -Force
③ 最後に PnP
Import-Module PnP.PowerShell -Force
この順序が良い理由は以下のとおりです。
- Graph: 最新の Microsoft.Graph.Core.dll を先にロックさせる
- Teams: Graph 依存は軽微
- PnP: 古い DLL を持っていても「後勝ちできない」
つまり、DLLは最初にロードされたものが勝つ、ということです。
Import-Moduleを明示しない場合、自動ロードに任せることになります。PowerShell には Module Auto-Loading という仕組みがあります。Connect-MgGraphと打つだけで、
- Microsoft.Graph.Authentication
- 依存DLL(Microsoft.Graph.Core.dll など)
が 勝手に・最初に見つかったものからロードされます。
すると次のような問題が出てきます。
- PnP.PowerShell 側の古い DLL を先につかむことがある
- どの順でロードされたか分かりにくい
- 再現性がない(環境差が出る)
そのため、「Import-Module Microsoft.Graph」を真っ先に実行すれば良い、という理屈です。
さらに、接続コマンドも、順番を固定して実行します。Graphが一番うるさく、 PnPは後でも比較的素直なんだそうです。
Connect-MgGraph
Connect-MicrosoftTeams
Connect-PnPOnline
※実際には適宜オプションを付与してください。
ここまでのまとめ
ここまでの話を整理すると、以下のような構成になります。
# 初回セットアップ
===== クリーンアップ =====
Get-Module Microsoft.Graph* -ListAvailable | Uninstall-Module -AllVersions -Force -ErrorAction SilentlyContinue
Get-Module Microsoft.Identity.Client -ListAvailable | Uninstall-Module -AllVersions -Force -ErrorAction SilentlyContinue
===== インストール =====
Install-Module Microsoft.Graph -Scope CurrentUser –Force
Install-Module MicrosoftTeams -Scope CurrentUser –Force
Install-Module PnP.PowerShell -Scope CurrentUser –Force
# 実行前スクリプト
===== モジュール読み込み =====
Import-Module Microsoft.Graph
Import-Module MicrosoftTeams
Import-Module PnP.PowerShell
===== 接続 =====
Connect-MgGraph -Scopes "User.Read.All"
Connect-MicrosoftTeams
Connect-PnPOnline -Url $SiteUrl -Interactive
Microsoft.Graphモジュールのアンインストールはものすごく時間がかかる(1〜2時間)のでご注意ください。また、Microsoft.Graphモジュールのインポートも、他のモジュールのインポートに比べると時間がかかります(2分程度)。
以上の対策で、大体の場合は解決すると思われます。
解決しなかった場合は、次の対策に進みます。
対策その3:Microsoft Graphモジュールの不整合を直す
この記事の上の方で、Microsoft.Graphモジュールのバージョンを確認することについて触れました。確認コマンドは次のものでしたね。
Get-InstalledModule Microsoft.Graph* | Select Name, Version |Sort Name
このコマンドの結果、示されるバージョンがすべて揃っている(たとえば2.34.0)のに、エラーになることがあります。Import-Moduleの順序もConnectの順序も固定したのに、エラーが出続けるという状況です。
いろいろと調べた結果、「バージョンが全部 2.34.0 で揃っているのにエラーが出る」というのはDLLのロードの順序の問題であることがわかってきました。
表示上は「2.34.0で揃っている」ように見えても、PowerShell のどこかのモジュールに、古いバージョンのDLL が残っているようなのです。
Microsoft.Graph.Core.dll
AssemblyVersion : 1.25.1.0
がどこかに残っているがために、Microsoft.Graphモジュールが 2.34.0で揃っている(ように見える)のに、 Microsoft.Graph.Core.dll は1.25.1.0という 不整合状態 になってしまっているのです。その結果、
Could not load type ...from assembly 'Microsoft.Graph.Core, Version=1.25.1.0'
というエラーが出てしまうのです。
つまり、
- PowerShell が 2.34.0 を使う前に
- どこかに残っている 1.25.1.0 の DLL を先に読んでしまっている
という状態です。
「インストール状態」ではなく「DLL 検索順序」の問題なのです。
具体的にどう対処すれば良いかは、下の記事で紹介していますので、ここまでの解説で解決しなかった方は、ぜひ参考にしてみてください。
Discussion