Microsoft Graph を使用して PowerShell スクリプトをビルドする
このチュートリアルでは、Microsoft Graph API を使用してユーザーの代わりにデータにアクセスする PowerShell スクリプトを構築する方法について説明します。
注:
Microsoft Graph を使用してアプリ専用認証を使用してデータにアクセスする方法については、この アプリ専用認証チュートリアルを参照してください。
このチュートリアルの内容:
ヒント
このチュートリアルに従う代わりに、アプリの登録と構成を自動化する クイック スタート ツールを使用して、完成したコードをダウンロードできます。 ダウンロードしたコードは、変更を加えずに機能します。
GitHub リポジトリをダウンロードまたは複製し、README の指示に従ってアプリケーションを登録し、プロジェクトを構成することもできます。
前提条件
このチュートリアルを開始する前に、開発用コンピューターに PowerShell がインストールされている必要があります。 PowerShell 5.1 が最小要件ですが、PowerShell 7 をお勧めします。
また、Exchange Online メールボックスを持つ Microsoft の職場または学校アカウントも必要です。 Microsoft 365 テナントをお持ちでない場合は、 Microsoft 365 開発者プログラムを通じてテナントの資格を得る可能性があります。詳細については、 FAQ を参照してください。 または、 1 か月間の無料試用版にサインアップするか、Microsoft 365 プランを購入することもできます。
注:
このチュートリアルは、PowerShell 7.2.2 および Microsoft Graph PowerShell SDK バージョン 1.9.5 で記述されています。 このガイドの手順は、他のバージョンで動作する可能性がありますが、テストされていません。
ポータルでアプリを登録する
この演習では、 ユーザー認証を有効にするために、Azure Active Directory に新しいアプリケーションを登録します。 アプリケーションは、Microsoft Entra 管理センターを使用するか、 Microsoft Graph PowerShell SDK を使用して登録できます。
ユーザー認証用にアプリケーションを登録する
このセクションでは、 デバイス コード フローを使用したユーザー認証をサポートするアプリケーションを登録します。
注:
Microsoft Graph PowerShell SDK のユーザー認証用のアプリケーションの登録は省略可能です。 SDK には、独自のアプリケーション登録と対応するクライアント ID があります。 ただし、独自のアプリケーション ID を使用すると、特定の PowerShell スクリプトのアクセス許可スコープをより詳細に制御できます。
ブラウザーを開き、 Microsoft Entra 管理センター に移動し、グローバル管理者アカウントを使用してログインします。
左側のナビゲーションで [Microsoft Entra ID] を 選択し、[ ID] を展開し、[ アプリケーション] を展開して、[ アプリの登録] を選択します。
[新規登録] を選択します。 アプリケーションの名前 (例:
Graph User Auth Tutorial
) を入力します。必要に応じて、[サポートされているアカウントの種類] を設定します。 以下のオプションがあります:
オプション サインインできるユーザー この組織のディレクトリ内のアカウントのみ Microsoft 365 組織内のユーザーのみ 組織のディレクトリ内のアカウント Microsoft 365 組織内のユーザー (職場または学校アカウント) 任意の組織ディレクトリ ... のアカウント。個人の Microsoft アカウント Microsoft 365 組織内のユーザー (職場または学校アカウント) と個人の Microsoft アカウント [リダイレクト URI]を空のままにします。
[登録] を選択します。 アプリケーションの [概要 ] ページで、 アプリケーション (クライアント) ID の値をコピーして保存します。次の手順で必要になります。 [サポートされているアカウントの種類] に対してのみこの組織ディレクトリの [アカウント] を選択した場合は、ディレクトリ (テナント) ID もコピーして保存します。
[管理] の下の [認証] を選択します。 [ 詳細設定 ] セクションを見つけて、[ パブリック クライアント フローを許可する] トグルを [はい] に変更し、[保存] を選択 します。
注:
アプリの登録に対して Microsoft Graph のアクセス許可を構成していないことに注意してください。 これは、サンプルで 動的同意 を使用して、ユーザー認証の特定のアクセス許可を要求するためです。
ユーザー認証を追加する
このセクションでは、Microsoft Graph のユーザーとして PowerShell セッションを認証します。 これは、Microsoft Graph を呼び出すために必要な OAuth アクセス トークンを取得するために必要です。
Microsoft Graph PowerShell SDK には、対話型ブラウザーとデバイス コード認証の 2 つの認証方法が用意されています。 対話型ブラウザー認証では、デバイスの既定のブラウザーを使用して、ユーザーがサインインできるようにします。 デバイス コード認証では、既定のブラウザーがない環境での認証が許可されます。 この演習では、デバイス コード認証を使用します。
重要
Microsoft Graph PowerShell SDK がまだインストールされていない場合は、先に進む前 に今すぐインストール してください。
ユーザーの認証
PowerShell を開き、次のコマンドを使用して
$clientID
セッション変数を設定し、 <our-client-id> をアプリ登録のクライアント ID に置き換えます。$clientId = <your-client-id>
$tenantId
セッション変数を設定します。 アプリケーションの登録時に組織内のユーザーのみがサインインできるようにするオプションを選択した場合は、 <tenant-id> を組織のテナント ID に置き換えます。 それ以外の場合は、 をcommon
に置き換えます。$tenantId = <tenant-id>
$graphScopes
セッション変数を設定します。$graphScopes = "user.read mail.read mail.send"
現在の PowerShell セッション内でユーザーを認証するには、次のコマンドを使用します。
# Authenticate the user Connect-MgGraph -ClientId $clientId -TenantId $tenantId -Scopes $graphScopes -UseDeviceAuthentication
ヒント
対話型ブラウザー認証を使用する場合は、
-UseDeviceAuthentication
パラメーターを省略します。ブラウザーを開き、表示された URL を参照します。 指定したコードを入力し、サインインします。
重要
https://microsoft.com/devicelogin
を参照するときにブラウザーにログインしている既存の Microsoft 365 アカウントに注意してください。 プロファイル、ゲスト モード、プライベート モードなどのブラウザー機能を使用して、テストに使用するアカウントとして認証することを確認します。完了したら、PowerShell ウィンドウに戻ります。 次のコマンドを実行して、認証されたコンテキストを確認します。
# Get the Graph context Get-MgContext
ClientId : 2fb1652f-a9a0-4db9-b220-b224b8d9d38b TenantId : 601faea3-be45-4960-898f-92b379b17cd9 CertificateThumbprint : Scopes : {Mail.Read, Mail.Send, openid, profile…} AuthType : Delegated AuthProviderType : DeviceCodeProvider CertificateName : Account : MeganB@contoso.com AppName : PowerShell Graph Tutorial ContextScope : CurrentUser Certificate : PSHostVersion : 2022.4.1 ClientTimeout : 00:05:00
ユーザーを取得する
このセクションでは、認証されたユーザーを取得します。
認証された PowerShell セッションで、次のコマンドを実行して現在のコンテキストを取得します。 コンテキストは、認証されたユーザーを識別するための情報を提供します。
$context = Get-MgContext
次のコマンドを実行して、Microsoft Graph からユーザーを取得します。
# Get the authenticated user by UPN $user = Get-MgUser -UserId $context.Account -Select 'displayName, id, mail, userPrincipalName'
ヒント
前のコマンドに切り替
-Debug
を追加して、API の要求と応答を確認できます。次のコマンドを実行して、ユーザー情報を出力します。
Write-Host "Hello," $user.DisplayName # For Work/school accounts, email is in Mail property # Personal accounts, email is in UserPrincipalName Write-Host "Email:", ($user.Mail ?? $user.UserPrincipalName)
Hello, Megan Bowen! Email: MeganB@contoso.com
コードの説明
認証されたユーザーを取得するために使用されるコマンドを検討してください。 これは一見単純なコマンドですが、注意する必要がある重要な詳細がいくつかあります。
'me' へのアクセス
Get-MgUser
コマンドは、Get user API に対する要求を作成します。 この API には、次の 2 つの方法でアクセスできます。
GET /me
GET /users/{user-id}
Microsoft Graph PowerShell SDK では、 GET /me
API エンドポイントはサポートされていません。
GEt /users/{user-id}
エンドポイントを使用するには、{user-id}
パラメーターの値を指定する必要があります。 上の例では、 $context.Account
値が使用されています。 この値には、認証されたユーザーのユーザー プリンシパル名 (UPN) が含まれます。
特定のプロパティの要求
関数は、コマンドの -Select
パラメーターを使用して、必要なプロパティのセットを指定します。 これにより、 $select クエリ パラメーター が API 呼び出しに追加されます。
厳密に型指定された戻り値の型
関数は、API からの JSON 応答から逆シリアル化された MicrosoftGraphUser
オブジェクトを返します。 コマンドは -Select
を使用するため、返されるオブジェクトには要求されたプロパティのみが値を持ちます。 その他のすべてのプロパティには既定値が設定されます。
受信トレイを一覧表示する
このセクションでは、ユーザーのメール 受信トレイにメッセージを一覧表示します。
認証された PowerShell セッションで、
$user
変数が設定されていることを確認します。PS > $user.DisplayName Megan Bowen
次のコマンドを実行して、ユーザーの受信トレイを一覧表示します。
Get-MgUserMailFolderMessage -UserId $user.Id -MailFolderId Inbox -Select ` "from,isRead,receivedDateTime,subject" -OrderBy "receivedDateTime DESC" ` -Top 25 | Format-Table Subject,@{n='From';e={$_.From.EmailAddress.Name}}, ` IsRead,ReceivedDateTime
出力を確認します。
Subject From IsRead ReceivedDateTime ------- ---- ------ ---------------- Updates from Ask HR and other communities Contoso Demo on Yammer False 4/19/2022 10:19:02 PM Employee Initiative Thoughts Patti Fernandez False 4/19/2022 3:15:56 PM Voice Mail (11 seconds) Alex Wilber False 4/18/2022 2:24:16 PM Our Spring Blog Update Alex Wilber True 4/18/2022 1:52:03 PM Atlanta Flight Reservation Alex Wilber False 4/13/2022 2:30:27 AM Atlanta Trip Itinerary - down time Alex Wilber False 4/12/2022 4:46:01 PM
コードの説明
ユーザーの受信トレイを一覧表示するために使用されるコマンドを検討してください
既知のメール フォルダーへのアクセス
Get-MgUserMailFolderMessage
コマンドは、特に GET /users/{user-id}/mailFolders/{folder-id}/messages
エンドポイントを使用して、List messages API への要求を作成します。 このエンドポイントを使用すると、API は要求されたメール フォルダー内のメッセージのみを返します。 この場合、受信トレイはユーザーのメールボックス内の既定の既知のフォルダーであるため、既知の名前である -MailFolderId Inbox
を使用してアクセスできます。 既知の名前をメール フォルダーの ID プロパティに置き換えることで、既定以外のフォルダーにも同じ方法でアクセスします。 使用可能な既知のフォルダー名の詳細については、「 mailFolder リソースの種類」を参照してください。
コレクションへのアクセス
1 つのオブジェクトを返す前のセクションの Get-MgUser
コマンドとは異なり、このメソッドはメッセージのコレクションを返します。 コレクションを返す Microsoft Graph のほとんどの API では、使用可能なすべての結果が 1 つの応答で返されるわけではありません。 代わりに、 ページングを 使用して結果の一部を返しながら、クライアントが次の "ページ" を要求するメソッドを提供します。
既定のページ サイズ
ページングを使用する API では、既定のページ サイズが実装されます。 メッセージの場合、既定値は 10 です。 クライアントは、 $top クエリ パラメーターを使用して、より多く (またはそれ以下) を要求できます。 Microsoft Graph PowerShell SDK では、これは -Top 25
パラメーターを使用して実現されます。
注:
-Top
経由で渡される値は、明示的な数値ではなく、上限です。 API は、指定した値までのメッセージ数 を 返します。
コレクションを並べ替える
関数は、要求で -OrderBy
パラメーターを使用して、メッセージの受信時刻 (receivedDateTime
プロパティ) で並べ替えられた結果を要求します。
DESC
キーワードが含まれているため、最近受信したメッセージが最初に一覧表示されます。 これにより、 $orderby クエリ パラメーター が API 呼び出しに追加されます。
メールを送信する
このセクションでは、認証されたユーザーとして電子メール メッセージを送信します。
認証された PowerShell セッションで、
$user
変数が設定されていることを確認します。PS > $user.DisplayName Megan Bowen
次のコマンドを使用して、 メール送信 API の要求本文を表すオブジェクトを定義します。
$sendMailParams = @{ Message = @{ Subject = "Testing Microsoft Graph" Body = @{ ContentType = "text" Content = "Hello world!" } ToRecipients = @( @{ EmailAddress = @{ Address = ($user.Mail ?? $user.UserPrincipalName) } } ) } }
メッセージを送信するには、次のコマンドを使用します。
Send-MgUserMail -UserId $user.Id -BodyParameter $sendMailParams
注:
Microsoft 365 開発者プログラムの開発者テナントでテストしている場合は、送信したメールが配信されず、配信不能レポートが届く場合があります。 このような場合は、 Microsoft 365 管理センターからサポートにお問い合わせください。
メッセージが受信されたことを確認するには、前の手順の
Get-MgUserMailFolderMessage
コマンドを繰り返します。
コードの説明
メッセージの送信に使用するコマンドを検討してください。
メールの送信
Send-MgUserMail
コマンドは、メール送信 API への要求を作成します。
オブジェクトの作成
データのみを読み取る Microsoft Graph の以前の呼び出しとは異なり、この呼び出しではデータが作成されます。 これを SDK で行うには、要求本文を表すオブジェクトを作成し、目的のプロパティを設定してから、 BodyParameter
パラメーターに渡します。
省略可能: 独自のコードを追加する
このセクションでは、独自の Microsoft Graph PowerShell SDK コマンドを使用します。 これは、Microsoft Graph ドキュメント または Graph エクスプローラーのコード スニペット、または作成したコードです。 このセクションは省略可能です。
API を選択する
試したい API を Microsoft Graph で見つけます。 たとえば、 Create イベント API です。 API ドキュメントの例のいずれかを使用するか、Graph Explorer で API 要求をカスタマイズし、生成されたスニペットを使用するか、 Find-MgGraphCommand
コマンドを使用して対応するコマンドを見つけることができます。
たとえば、イベントを作成する API エンドポイントの 1 つが POST /users/{id | userPrincipalName}/events
。 これを使用して、対応する PowerShell コマンドを見つけることができます。
PS > Find-MgGraphCommand -Uri "/users/{id | userPrincipalName}/events" -Method "POST"
APIVersion: v1.0
Command Module Method URI OutputType Permissions Variants
------- ------ ------ --- ---------- ----------- --------
New-MgUserEvent Calendar POST /users/{user-id}/events IMicrosoftGraphEvent {Calendars.ReadWrite} {Create1, CreateExp…
APIVersion: beta
Command Module Method URI OutputType Permissions Variants
------- ------ ------ --- ---------- ----------- --------
New-MgUserEvent Calendar POST /users/{user-id}/events IMicrosoftGraphEvent1 {Calendars.ReadWrite} {Create, CreateExp…
出力は、 New-MgUserEvent
コマンドが対応するコマンドであることを示します。
アクセス許可を構成する
選択した API のリファレンス ドキュメントの [アクセス許可] セクションを確認して、サポートされている認証方法を確認します。 たとえば、一部の API では、ユーザー (委任された) 認証や個人の Microsoft アカウントがサポートされていません。
現在のセッション (Disconnect-MgGraph
) を切断し、 -Scopes
パラメーターで必要なアクセス許可に再接続します。
ヒント
Connect-MgGraph
コマンドで -ForceRefresh
パラメーターを使用すると、新しく構成されたアクセス許可が確実に適用されます。
コマンドを実行する
必要なアクセス許可に接続したら、選択したコマンドを実行します。
おめでとうございます。
PowerShell Microsoft Graph チュートリアルを完了しました。 Microsoft Graph を呼び出す作業アプリが作成されたので、新しい機能を試して追加できます。
- Microsoft Graph PowerShell SDK で アプリのみの認証 を使用する方法について説明します。
- Microsoft Graph でアクセスできるすべてのデータについては、 Microsoft Graph の概要 に関するページを参照してください。
このセクションに問題がある場合 このセクションを改善できるよう、フィードバックをお送りください。