Microsoft Graph APIを使ってAzureAD B2Cユーザアカウントを操作するようなアプリケーションを開発しています。
テストエビデンスの取得のために、Microsoft Graph Explorerの使用も考えたのですが、Client Credentialフローを使う場合の認証方法が分からなかったので、その代替としてPowerShellを使おうと考えました。
そんな感じで、PowerShellでAzure AD B2Cのユーザアカウントを操作する方法を説明します。
概要
- AzureAD B2CのユーザアカウントをPowerShellで操作する方法を説明します。
拡張属性・カスタム属性を操作する方法も併せて説明します。
なお、拡張属性とカスタム属性については、こちらに纏めてみました。 - PowerShellからAzureADを操作するためのモジュールはいくつかありますが、
ここではAzure AD for Graph (Azure AD v2)を使用します。 - TwitterやFacebook等の外部アカウント連携は想定しておらず、ローカルアカウントの使用を想定した例になっています。拡張属性・カスタム属性以外の操作はAzureADでも同様に使用できると思います。
- Windows 10環境で確認した結果を記載しています。
- 以降の説明の例では一部変数を指定しています。
お使いの環境や目的に応じて適宜変更してください。-
$TenantId
: 使用するテナント名$TenantId = "mytenant.onmicrosoft.com" -
$ObjectId
: 操作対象となるユーザアカウントのオブジェクトIDまたはUserPrincipalName$ObjectId = "5122ad78-1a91-4927-a521-12e59696fa6e"
-
モジュールのインストール方法
管理者用PowerShellを起動し、”Install-Module -Name AzureAD”を実行します。
(ローカルコンピュータの構成変更が必要になるので、管理者権限のPowerShellが必要です。)
> Install-Module -Name AzureAD 続行するには NuGet プロバイダーが必要です PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet プロバイダーが必要です。 ... 'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGetプロバイダーをインストールすることもできます。 今すぐ PowerShellGet で NuGetプロバイダーをインストールしてインポートしますか? [Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): Y 信頼されていないリポジトリ 信頼されていないリポジトリからモジュールをインストールしようとしています。 このリポジトリを信頼する場合は、Set-PSRepository コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。 'PSGallery'からモジュールをインストールしますか? [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y
Azureへの接続方法
PowerShellを起動し、Connect-AzureADを実行します。
Azureのサインイン画面が表示されるので、ユーザ名やパスワード等の認証情報を入力します。
> Connect-AzureAD -TenantId $TenantId Account Environment TenantId TenantDomain AccountType ------- ----------- -------- ------------ ----------- youraccount AzureCloud xxxxxxxx-...-xxxxxxxxxxxx mytenant.onmicrosoft.com User
ユーザアカウントの操作
ユーザアカウントの検索
- ユーザアカウントの一覧取得
Get-AzureADUserGet-AzureADUser -All $true
- 表示名でユーザアカウントを検索
Get-AzureADUser -SearchString "佐藤"
- Get-AzureADUserで使用できるオプションはコマンドリファレンスを参照のこと。
- IDでユーザアカウントを検索
Get-AzureADUser -ObjectId $ObjectId
- ユーザアカウントの特定属性の取得
Get-AzureADUser | Select ObjectId, DisplayName
- ユーザアカウントの属性一覧はこちらを参考のこと。
- ユーザアカウントのサインインユーザ名、サインインメールアドレスを取得
Get-AzureADUser -ObjectId $ObjectId | Select ObjectId, DisplayName -ExpandProperty SignInNames
- 任意の検索条件でユーザアカウントを検索
Get-AzureADUser -Filter "Surname eq '佐藤' and GivenName eq '一郎'"
Get-AzureADUser -Filter "startswith(displayName,'佐藤')"
- -Filterで指定できる条件はこちらを参考のこと。
- なお、そこに記載している全てのコマンドを使用できるわけではないようです。
例えば、endsWith()は使用できませんでした。
- ソート
Get-AzureADUser | Sort DisplayName,ObjectIdGet-AzureADUser | Sort DisplayName,ObjectId -Descending
- 既定は昇順ですが、-Descendingで降順にできます。
-Descendingを使用する場合、指定した全ての項目を降順でソートします。 - リスト形式で出力 ※”属性名: 値”のように1行1属性値を出力
Get-AzureADUser | Format-ListGet-AzureADUser | Select ObjectId, DisplayName | Format-List
- Format-Listで使用できるオプションはコマンドリファレンスを参照のこと。
- ユーザアカウントの属性をJSONで出力
(Get-AzureADUser -ObjectId $ObjectId).ToJson()
- ユーザアカウントの属性をCSVに出力
Get-AzureADUser | Select * | Export-Csv result.csv
- Export-Csvで使用できるオプションはコマンドリファレンスを参照のこと。
ユーザアカウントの作成
- 単純なユーザアカウントの作成
#
$PasswordProfile = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile
$PasswordProfile.Password = "VeryC0mp1ex"
$PasswordProfile.ForceChangePasswordNextLogin = $False
#
New-AzureADUser `
-DisplayName "佐藤 一郎" `
-PasswordProfile $PasswordProfile `
-UserPrincipalName "ichiro.sato@$TenantId" `
-AccountEnabled $true `
-MailNickName "ichiro.sato" - ポータルからと同様なユーザアカウントの作成
# サインインユーザ名、またはサインインメールアドレスを使用する場合に使用
$SignInNames = New-Object -TypeName System.Collections.Generic.List[Microsoft.Open.AzureAD.Model.SignInName]
$SignInName1 = New-Object -TypeName Microsoft.Open.AzureAD.Model.SignInName
$SignInName1.Type = "userName"
$SignInName1.Value = "ichiro.suzuki"
$SignInNames.Add($SignInName1)
$SignInName2 = New-Object -TypeName Microsoft.Open.AzureAD.Model.SignInName
$SignInName2.Type ="emailAddress"
$SignInName2.Value ="ichiro.suzuki@example.com"
$SignINNames.Add($SignINName2)
# パスワード
$PasswordProfile = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile
$PasswordProfile.Password = "password"
$PasswordProfile.ForceChangePasswordNextLogin = $False
# MailNickName/UserPrincipalName用
$Guid = New-Guid
# ユーザアカウントの作成
New-AzureADUser `
-DisplayName "鈴木 一郎" `
-Surname "鈴木" -GivenName "一郎" `
-AccountEnabled $True `
-SignInNames $SignInNames `
-MailNickName $Guid `
-UserPrincipalName "$Guid@$TenantId" `
-PasswordProfile $PasswordProfile `
-PasswordPolicies "DisablePasswordExpiration, DisableStrongPassword"- $SignInNamesは必須ではありません。
$SignInNamesには、ユーザ名($SignInName1)、メールアドレス($SignInName2)のいずれか、または両方の追加が可能です。 - ポータルからユーザアカウントを作成すると、PasswordPolicies, PasswordProfileが設定されるので、それに合わせています。
- ポータルからユーザアカウントを作成すると、MailNickName、UserPrincipalName(“@”の前)には、ユーザアカウントのObjectIdとは異なる何らかのGUIDが指定されています。この仕様は分かりませんが、ここでは新規に作成したGUIDを指定しています。
- New-AzureADUserで使用できるオプションはコマンドリファレンスを参照のこと。
- $SignInNamesは必須ではありません。
ユーザアカウントの更新
ポータルで更新可能な項目をPowerShellで更新する想定の例を説明します。
- ユーザアカウントの属性の変更
Set-AzureADUser `
-ObjectId $ObjectId `
-DisplayName "鈴木 一郎" `
-Surname "鈴木" -GivenName "一郎" `
-JobTitle "役職" -Department "部門" `
-CompanyName "会社名" `
-AccountEnabled $True -UsageLocation “JP” `
-StreetAddress "番地"-State "都道府県" -Country "国/リージョン" -PhysicalDeliveryOfficeName "会社" `
-City "市区町村" -PostalCode "郵便番号" -TelephoneNumber "会社電話" -Mobile "携帯電話" `
-OtherMails $OtherMails- 管理者の更新方法は後述します。
- 従業員ID(EmployeeId)は、後述の拡張属性として更新できます。
- 利用場所(UsageLocation)は、”JP”等の実在する国コード(2桁)を指定する必要があります。(例えば”ZZ”等の実在しないコードを指定するとエラーになります。)
- 電子メール(Mail)は、Microsoft Exchange用のものなので変更不可?
- 「サインインのブロック」はAccountEnabled属性に対応します。ポータルと属性の意味が逆転しており、サインインをブロックする場合はAccountEnabledに$Falseを指定する必要があることに注意。
- Set-AzureADUserで使用できるオプションはコマンドリファレンスを参照のこと。-CompanyName等、記載のないオプションがあります。
- 管理者の更新
Set-AzureADUserManager -ObjectId $ObjectId -RefObjectId $ManagerObjectId
- パスワードの変更 ※開発やテスト限定
$SecureString = ConvertTo-SecureString "password" -AsPlainText -Force
Set-AzureADUserPassword -ObjectId $ObjectId -Password $SecureString- 簡単にパスワードを変更できるようConvertTo-SecureStringでパスワードを直接指定しています。この方法はコマンドの履歴に残るので本番運用での使用は推奨しません。この警告を無視するために-Forceを指定しています。
- ConvertTo-SecureStringで使用できるオプションはコマンドリファレンスを参照のこと。
- Set-AzureADUserPasswordで使用できるオプションはコマンドリファレンスを参照のこと。
ユーザアカウントの削除
- ユーザアカウントの削除
Remove-AzureADUser -ObjectId $ObjectId
カスタム属性と拡張属性の操作
従業員IDやユーザアカウント作成日時等の非標準扱いの属性(以降では「既定の拡張属性」と呼ぶ)や、テナント独自に定義した属性(カスタム属性)は、ユーザアカウントの拡張属性(ExtensionProperty)にkey=value形式で格納されます。
ユーザアカウントの拡張属性に対する操作では、両者に大きな違いはないので「拡張属性に対する操作」として例を記載します。
- カスタム属性の一覧取得
Get-AzureADApplication | Get-AzureADApplicationExtensionProperty
- カスタム属性の名称は”extension_{guid}_属性名”となります。詳細はこちらをご覧ください。
- Get-AzureADApplicationで使用できるオプションはコマンドリファレンスを参照のこと。
- Get-AzureADApplicationExtensionPropertyで使用できるオプションはコマンドリファレンスを参照のこと。
- ユーザアカウントの拡張属性の一覧取得
Get-AzureADUser -ObjectId $ObjectId | Select -ExpandProperty ExtensionPropertyGet-AzureADUserExtension -ObjectId $ObjectId
- 拡張属性に含まれる既定の拡張属性やカスタム属性を取得できる。
- Get-AzureADUserExtensionで使用できるオプションはコマンドリファレンスを参照のこと。
- 既定の拡張属性は、値の有無に関わらず項目が表示される。カスタム属性の場合は値がないと項目自体が表示されないことに注意!
- ユーザアカウントの拡張属性の値を取得
(Get-AzureADUser -ObjectId $ObjectId).ExtensionProperty["employeeId"](Get-AzureADUser -ObjectId $ObjectId).ExtensionProperty["extension_93a0a2af1918411486f7a58f77cdb054_customInt"](Get-AzureADUserExtension -ObjectId $ObjectId)["employeeId"](Get-AzureADUserExtension -ObjectId $ObjectId)["extension_93a0a2af1918411486f7a58f77cdb054_customInt"]
- ユーザアカウントの拡張属性の更新
Set-AzureADUserExtension -ObjectId $ObjectId -ExtensionName employeeId -ExtensionValue 1234Set-AzureADUserExtension -ObjectId $ObjectId -ExtensionName extension_93a0a2af1918411486f7a58f77cdb054_customInt -ExtensionValue 987654321
- Set-AzureADUserExtensionで使用できるオプションはコマンドリファレンスを参照のこと。
なお、次のような更新はできませんでした。
(Get-AzureADUserExtension -ObjectId $ObjectId)[“employeeId”] = “77777” - ユーザアカウントの拡張属性を削除
Remove-AzureADUserExtension -ObjectId $ObjectId -ExtensionName employeeIdRemove-AzureADUserExtension -ObjectId $ObjectId -ExtensionName extension_93a0a2af1918411486f7a58f77cdb054_customInt
- Remove-AzureADUserExtensionで使用できるオプションはコマンドリファレンスを参照のこと。
- ユーザアカウント作成時にカスタム属性を指定
※ユーザアカウントの作成の「単純なユーザアカウントの作成」をベースにしています。$ExtensionProperty = New-Object -TypeName System.Collections.Generic.Dictionary[[String]`,[String]]
$ExtensionProperty["employeeId"] = 123456
$ExtensionProperty["extension_93a0a2af1918411486f7a58f77cdb054_customInt"] = 9876543
#
$PasswordProfile = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile
$PasswordProfile.Password = "VeryC0mp1ex"
$PasswordProfile.ForceChangePasswordNextLogin = $False
#
New-AzureADUser `
-DisplayName "佐藤 次郎" `
-PasswordProfile $PasswordProfile `
-UserPrincipalName "jiro.sato@$TenantId" `
-AccountEnabled $true `
-MailNickName "jiro.sato" `
-ExtensionProperty $ExtensionProperty - その他のカスタム属性の操作