使用する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付)に変換する必要があるので注意です。
以上、参考になれば幸いです。