🐙

【解決】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 検索順序」の問題なのです。

具体的にどう対処すれば良いかは、下の記事で紹介していますので、ここまでの解説で解決しなかった方は、ぜひ参考にしてみてください。

https://note.com/fancy_ixia4014/n/n2854528bd55b?sub_rt=share_pw

Discussion