🐾

PnP PowerShell を利用するための Microsoft Entra ID アプリケーションを登録する方法

2024/09/04に公開

この記事の目的

PnP Community から、PnP PowerShell で既定で利用している PnP Managment Shell アプリケーションが 2024/9/9 にテナントから削除されることがアナウンスされました。
今後は、PnP PowerShell で接続を行う際は、任意の Microsoft Entra ID アプリケーションを用意して、それを利用することが前提であることが説明されています。背景などの詳細は、以下の記事を参照してください。

https://pnp.github.io/blog/post/changes-pnp-management-shell-registration/

直近で PnP PowerShell で、Connect-PnPOnline を -Interactive オプションで実行すると以下のようなメッセージが表示されている場合はこの影響です。(古いバージョンのPnP PowerShellは表示されないかもしれませんが同様に影響を受けるはずです。)

また、9/9 以降で Connect-PnPOnline コマンドを -Interactive オプションで使用する場合に 以下のエラーが発生する場合は、本更新の影響を受けている可能性があります。

AADSTS700016: Application with identifier '31359c7f-bd7e-475c-86db-fdb8c937548e' was not found in the directory '<テナント名>'.
('31359c7f-bd7e-475c-86db-fdb8c937548e'は、PnP Managment Shell アプリケーションの共通の ID)

上記の変更を受けて、Microsoft Entra ID アプリケーションを作成して、 PnP PowerShell を接続する手順が解説されています。
https://youtu.be/ecRZrHOucz4?si=jdog_6hHZdeWqvId

解説の動画上では、Register-PnPEntraIDAppと Register-PnPEntraIDAppForInteractiveLogin を使用したアプリケーションの登録方法を解説していますが、PnP PowerShell のバージョンによっては利用できない可能性があるので、本記事では Register-PnPAzureADApp コマンドを使用した手順を解説します。

それぞれのコマンドの違いは以下の通りです。
Register-PnPAzureADApp : Microsoft Entra ID アプリケーションの登録するコマンド。アプリケーションのアクセス許可で利用する証明書の作成や登録が行われる。
Register-PnPEntraIDApp : Register-PnPAzureADApp と同じ。Azure AD が Microsoft Entra ID にブランド変更されたことで追加されたコマンド。
Register-PnPEntraIDAppForInteractiveLogin : ユーザー委任のアクセス許可の利用を前提とした
Microsoft Entra ID アプリケーションを登録するコマンド。証明書は作成されない。PnP PowerShell バージョン 2.10.0 から利用できる。

PnP PowerShell の動作について

(設定手順を確認したい場合は、次の セクション に進んでください)
PnP PowerShell から、SharePoint Online などの Microsoft 365 のリソースにアクセスするためには、Microsoft Entra ID アプリケーションを利用してアクセスします。
Microsoft Entra ID アプリケーションに対して付与された API のアクセス許可の範囲で、PnP PowerShell のコマンドが動作します。
PnP PowerShell で、以下のように接続する場合は、既定の "PnP Management Shell" というアプリケーションを利用してリソースにアクセスします。

Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/Site001 -Interactive

"PnP Management Shell" アプリケーションは画像の通り、API アクセス許可に複数の "委任されたアクセス許可" (Delegated) が設定されており、各コマンドの実行を可能にしています。

今回は、このアプリケーションが削除されるというアナウンスであるため、このアプリケーションを利用している場合は、同様に API アクセス許可が付与された Microsoft Entra ID アプリケーションを設定する必要があります。

PnP PowerShell のインストール

PnP PowerShell を端末にインストールしていない場合は、以下の記事を参考にインストールします。
https://pnp.github.io/powershell/articles/installation.html

こちらで日本語の記事をまとめています。
https://zenn.dev/maekawawawa/articles/032b79fffc7019

Microsoft Entra ID アプリケーションの登録

Register-PnPAzureADApp コマンドを利用して、Microsoft Entra ID アプリケーションを登録します。
登録には、テナントのグローバル管理者やアプリケーション管理者の権限が必要です。

Register-PnPAzureADApp -ApplicationName <アプリケーション名> -Tenant <テナント名>.onmicrosoft.com -Store CurrentUser -Interactive
#ex:
Register-PnPAzureADApp -ApplicationName PnPApp001 -Tenant contoso.onmicrosoft.com -Store CurrentUser -Interactive

Register-PnPAzureADApp コマンドを実行すると Microsoft Entra ID アプリケーションの登録が完了し、アプリケーションの ID やアプリケーションのアクセス許可での認証で利用するための証明書の生成が行われます。また、ユーザー認証時に利用されるリダイレクトURLの登録なども自動的に行われます。

登録したアプリケーションは、Microsoft Entra 管理センター > アプリケーション > アプリの登録 > すべてのアプリケーションから、コマンドで指定したアプリケーション名で登録されていることが確認できます。

アプリケーションの登録時に明示的にアクセス許可を指定せず登録した場合は、以下のアクセス許可が付与されます。
アプリケーションのアクセス許可
Microsoft Graph > User.ReadWrite.All
Microsoft Graph > Group.ReadWrite.All
SharePoint Online > User.ReadWrite.All
SharePoint Online > Sites.FullControl.All
委任のアクセス許可
SharePoint Online > AllSites.FullControl

アクセス許可を変更する場合は、アプリケーションの API のアクセス許可画面 (上記の画面) の [+アクセス許可の追加] から追加を、一覧の各アクセス許可の […] から削除を行うことができます。

または、Register-PnPAzureADApp コマンド実行時に API のアクセス許可を明示的に指定して登録することが可能です。
SharePoint サイトの操作を行うために ユーザー委任のアクセス許可の AllSites.FullControl、TermStore.ReadWrite.All 、User.ReadWrite.All を付与する場合は、以下のように -SharePointDelegatePermissions に各アクセス許可を指定します。

Register-PnPAzureADApp -ApplicationName <アプリケーション名> -Tenant <テナント名>.onmicrosoft.com -SharePointDelegatePermissions "AllSites.FullControl","TermStore.ReadWrite.All","User.ReadWrite.All" -Store CurrentUser -Interactive
#ex:
Register-PnPAzureADApp -ApplicationName PnPApp002 -Tenant contoso.onmicrosoft.com -SharePointDelegatePermissions "AllSites.FullControl","TermStore.ReadWrite.All","User.ReadWrite.All" -Store CurrentUser -Interactive

コマンドを実行すると指定したアクセス許可の付与の承諾画面が表示されます。この時、管理者の同意を付与するため [組織の代理として同意する] にチェックを入れて承諾します。

作成されたアプリケーションにおいて指定したアクセス許可のみが付与された状態で作成されます。

作成したアプリケーションで接続する

Connect-PnPOnline コマンドの、-ClientID に作成したアプリケーションのクライアント ID (アプリケーション ID) を指定して、接続します。

Connect-PnPOnline -Url <サイト URL> -ClientId <アプリケーションのクライアント ID> -Interactive
#ex:
Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/Sites001 -ClientId XXXXXXX-XXXX-XXXX-XXXX-XXXXX -Interactive

接続後コマンドが実行できるか確認します。

なお、既に PnP PowerShell を使用した作りこまれたスクリプトが存在し、ClientId の指定する変更も難しい場合は、環境変数に ClientId を設定することで、変更を回避できる可能性があります。
環境変数設定については、以下のコミュニティの記事や最初に紹介している YouTube の動画でも説明があるので、それらを参考にしてください。

https://github.com/pnp/powershell/discussions/4249

おまけ PnP Managment Shell に付与されているアクセス許可

既定で用意される PnP Managment Shell では、PnP PowerShell で提供される様々なコマンドを実行するための委任されたアクセス許可が付与されています。PnP PowerShell では、SharePoint Online の操作の他に Teams の操作や Microsoft 365 の管理に関するコマンドも含まれているため、多数のアクセス許可が付与されています。本記事で作成するアプリケーションには、これらすべてのアクセス許可を付与する必要はなく、SharePoint の操作の用途であれば SharePoint 関するものだけを付与すればいいと考えていますが、参考情報として以下に付与されているアクセス許可の一覧を記載します。

Discussion