PowerShellからMicrosoft Graphを一括実行する ― 429と資格情報を先に設計する

PowerShellカテゴリを表すパンダのイラスト PowerShell

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft EntraのClient CredentialsとMicrosoft Graphのスロットリング仕様を確認し、旧記事の固定初期パスワード、根拠のない「3〜5倍高速化」、無制御な並列書き込みを修正しました。

検証ステータス:✅ Microsoft公式認証・Graph throttling仕様確認済み

PowerShellからMicrosoft Graph REST APIを直接呼ぶ方法は、SDKを導入しにくい環境や小さな自動処理で有効です。ただし、大量処理では「速く並列化する」より先に、認証、再試行、ログ、重複防止を決めます。

Client Credentialsはバックグラウンド処理向け

ユーザー操作なしで動くサービスではOAuth 2.0 Client Credentials Flowを利用できます。Microsoftは、可能なら共有シークレットより証明書やFederated Credentialを使う方法も案内しています。資格情報をソースコードへ埋め込んではいけません。

429ではRetry-Afterを優先する

Microsoft Graphは負荷制御のためHTTP 429 Too Many Requestsを返します。レスポンスにRetry-Afterがある場合、その秒数を待って再試行するのが公式推奨です。

function Invoke-GraphWithRetry {
    param([string]$Uri, [hashtable]$Headers)

    for ($attempt = 1; $attempt -le 5; $attempt++) {
        try {
            return Invoke-RestMethod -Uri $Uri -Headers $Headers -Method Get
        }
        catch {
            $status = [int]$_.Exception.Response.StatusCode
            if ($status -ne 429 -or $attempt -eq 5) { throw }

            $retryAfter = $_.Exception.Response.Headers.RetryAfter.Delta.TotalSeconds
            if (-not $retryAfter) { $retryAfter = [math]::Pow(2, $attempt) }
            Start-Sleep -Seconds ([int][math]::Ceiling($retryAfter))
        }
    }
}

実際のPowerShell/.NET版によって例外オブジェクトの形は異なるため、運用環境でRetry-After取得部分をテストします。

大量更新で必要な設計

  • 入力行ごとに一意な処理IDを持たせ、再実行しても二重作成しない。
  • 成功・失敗・HTTPステータス・request-idをログへ残す。
  • ThrottleLimitを固定の高速化値として扱わず、429発生率を見て調整する。
  • ユーザー作成では固定の初期パスワードをコードに書かない。
  • 必要なGraph Application Permissionだけを管理者同意する。

公式情報

この記事の更新履歴

  • 2026-09-14 追加:Retry-After優先の再試行、再実行性、資格情報保護の設計を追加。
  • 2026-09-14 変更:速度優先の並列処理例から、Graphの制限に従う安全な一括処理へ変更。
  • 2026-09-14 削除:内部style_prompt、本文H1、固定TemporaryPassword、根拠のない3〜5倍高速化、単純な大量並列POST例を削除。

文書情報

記事タイトル
PowerShellからMicrosoft Graphを一括実行する ― 429と資格情報を先に設計する
作成日
更新日
Source URL
https://papanda925.com/?p=5686

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました