1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PowerShellでMicrosoft Graph APIを実行し、Azure ADのユーザー情報を更新する

Posted at

使用するAPI

前提条件

Azure ADにアプリケーションの登録が必要です。
詳細は以下の記事をご確認ください。
https://qiita.com/Yosuke_Sakaue/items/cb8a3cc2e2705ad52e62

PowerShell全体

$clientid = "クライアントID"
$tenantName = "AADのテナント名"
$clientSecret = "クライアントシークレット"

$ReqTokenBody = @{
    Grant_Type    = "client_credentials"
    Scope         = "https://graph.microsoft.com/.default"
    client_Id     = $clientID
    Client_Secret = $clientSecret
} 

# トークンを取得
$TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody

$apiUrl = 'https://graph.microsoft.com/v1.0/users/<更新対象ユーザーのオブジェクトID>'
$headers = @{
    "Content-Type"  = "application/json"
    "Authorization" = "Bearer $($Tokenresponse.access_token)"
}

# ポイント1
$body = '{
    "displayName": "世存 二郎",
    "givenName": "二郎"
}'

# ポイント2
$body = [System.Text.Encoding]::UTF8.GetBytes($body)

try {
    Invoke-RestMethod -Headers $headers -Uri $apiUrl -Body $body -Method PATCH
}
catch {
    # エラー時のレスポンスを表示
    $r = $_.Exception.Response
    $rs = $r.GetResponseStream()
    $rs.Position = 0
    $sr = [System.IO.StreamReader]::new($rs)
    $res = $sr.ReadToEnd()
    $sr.Close()
    "StatusCode : {0}, Response : {1}" -f $r.StatusCode.Value__ , $res
}

ハマりポイント

ポイント1

次のプロパティを更新するには、上記の表に示した他のプロパティを含めずに、独自の PATCH 要求で指定する必要があります: aboutMe、birthday、interests、mySite、pastProjects、preferredName、responsibilities、schools、および skills
※公式の注意文より抜粋:https://docs.microsoft.com/ja-jp/graph/api/user-update?view=graph-rest-1.0&tabs=http#:~:text=%E3%80%81Guest%20%E3%81%AA%E3%81%A9)%E3%80%82-,%E6%B3%A8%E6%84%8F,-%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3

上記に該当するプロパティを更新するには単体でリクエストする必要があります。また、一部プロパティはSharePointOnlineのライセンスが必要なものもありました。

ポイント2

ボディに日本語(マルチバイト文字)を含む場合、JSONをUTF-8のバイト文字に変換してやる必要があります。
そのために[System.Text.Encoding]::UTF8.GetBytes($body)を実施しています。

また、実行環境によってはそもそもPowerShell自体がUTF-8を読み込めないことがありますので、psファイルをUTF-8(BOM付)に変換する必要があるので注意です。

以上、参考になれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?