Microsoft Graph を使用して PowerShell スクリプトをビルドする
このチュートリアルでは、Microsoft Graph APIを使用してユーザーの代わりにデータにアクセスする PowerShell スクリプトを構築する方法について説明します。
注:
Microsoft Graph を使用してアプリ専用認証を使用してデータにアクセスする方法については、この アプリ専用認証チュートリアルを参照してください。
このチュートリアルの内容:
ヒント
このチュートリアルに従う代わりに、アプリの登録と構成を自動化する クイック スタート ツールを使用して、完成したコードをダウンロードできます。 ダウンロードしたコードは、変更を加えずに機能します。
GitHub リポジトリをダウンロードまたは複製し、README の指示に従ってアプリケーションを登録し、プロジェクトを構成することもできます。
前提条件
このチュートリアルを開始する前に、開発用コンピューターに PowerShell がインストールされている必要があります。 PowerShell 5.1 が最小要件ですが、PowerShell 7 をお勧めします。
また、Outlook.com のメールボックスを持つ個人の Microsoft アカウント、または Microsoft の職場または学校アカウントが必要です。 Microsoft アカウントをお持ちでない場合は、無料アカウントを取得するためのオプションがいくつかあります。
- 新しい個人用 Microsoft アカウントにサインアップできます。
- Microsoft 365 開発者プログラムにサインアップして、無料の Microsoft 365 サブスクリプションを入手できます。
注:
このチュートリアルは、PowerShell 7.2.2 および Microsoft Graph PowerShell SDK バージョン 1.9.5 で作成されました。 このガイドの手順は、他のバージョンで動作する可能性がありますが、テストされていません。
ポータルでアプリを登録する
この演習では、 ユーザー認証を有効にするために、Azure Active Directory に新しいアプリケーションを登録します。 アプリケーションは、Azure Active Directory 管理センターを使用するか、 Microsoft Graph PowerShell SDK を使用して登録できます。
ユーザー認証用にアプリケーションを登録する
このセクションでは、 デバイス コード フローを使用してユーザー認証をサポートするアプリケーションを登録します。
注:
Microsoft Graph PowerShell SDK のユーザー認証用のアプリケーションの登録は省略可能です。 SDK には、独自のアプリケーション登録と対応するクライアント ID があります。 ただし、独自のアプリケーション ID を使用すると、特定の PowerShell スクリプトのアクセス許可スコープをより詳細に制御できます。
ブラウザーを開き、Azure Active Directory 管理センターへ移動して、個人用アカウント (別名: Microsoft アカウント)、または職場/学校アカウントを使用してログインします。
左側のナビゲーションで [Azure Active Directory] を選択し、それから [管理] で [アプリの登録] を選択します。
[新規登録] を選択します。 アプリケーションの名前を入力します (例:
PowerShell Graph 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
設定し、your-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 は API エンドポイントを GET /me
サポートしていません。 エンドポイントを使用 GEt /users/{user-id}
するには、 パラメーターの値を指定する {user-id}
必要があります。 上記の例では、値が $context.Account
使用されています。 この値には、認証されたユーザーのユーザー プリンシパル名 (UPN) が含まれます。
特定のプロパティの要求
関数は、 コマンドの パラメーターを -Select
使用して、必要なプロパティのセットを指定します。 これにより、 $select クエリ パラメーター が API 呼び出しに追加されます。
厳密に型指定された戻り値の型
関数は、 MicrosoftGraphUser
API からの JSON 応答から逆シリアル化されたオブジェクトを返します。 コマンドでは を使用 -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
、特にエンドポイントを使用して、 List メッセージ API への要求を GET /users/{user-id}/mailFolders/{folder-id}/messages
作成します。 このエンドポイントを使用すると、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
再接続します。
ヒント
コマンドで パラメーターを-ForceRefresh
Connect-MgGraph
使用すると、新しく構成されたアクセス許可が確実に適用されます。
コマンドを実行する
必要なアクセス許可に接続したら、選択したコマンドを実行します。
おめでとうございます。
PowerShell Microsoft Graph チュートリアルを完了しました。 Microsoft Graph を呼び出す作業アプリが作成されたので、新しい機能を試して追加できます。
- Microsoft Graph PowerShell SDK で アプリのみの認証 を使用する方法について説明します。
- Microsoft Graph でアクセスできるすべてのデータについては、 Microsoft Graph の概要 に関するページを参照してください。
このセクションに問題がある場合 このセクションを改善できるよう、フィードバックをお送りください。