アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

1. システムエンジニアリング Azure PowerShell 基盤技術 実装技術

AzureAD B2Cユーザアカウントの操作方法(PowerShell)

投稿日:

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-AzureADUser
    Get-AzureADUser -All $true
  • 表示名でユーザアカウントを検索
    Get-AzureADUser -SearchString "佐藤"
  • 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,ObjectId
    Get-AzureADUser | Sort DisplayName,ObjectId -Descending
    • 既定は昇順ですが、-Descendingで降順にできます。
      -Descendingを使用する場合、指定した全ての項目を降順でソートします。
  • リスト形式で出力 ※”属性名: 値”のように1行1属性値を出力
    Get-AzureADUser | Format-List
    Get-AzureADUser | Select ObjectId, DisplayName | Format-List
  • ユーザアカウントの属性をJSONで出力
    (Get-AzureADUser -ObjectId $ObjectId).ToJson()
  • ユーザアカウントの属性をCSVに出力
    Get-AzureADUser | Select * | Export-Csv result.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で使用できるオプションはコマンドリファレンスを参照のこと。

ユーザアカウントの更新

ポータルで更新可能な項目を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 ExtensionProperty
    Get-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 1234
    Set-AzureADUserExtension -ObjectId $ObjectId -ExtensionName extension_93a0a2af1918411486f7a58f77cdb054_customInt -ExtensionValue 987654321

    なお、次のような更新はできませんでした。

    (Get-AzureADUserExtension -ObjectId $ObjectId)[“employeeId”] = “77777”
  • ユーザアカウントの拡張属性を削除
    Remove-AzureADUserExtension -ObjectId $ObjectId -ExtensionName employeeId
    Remove-AzureADUserExtension -ObjectId $ObjectId -ExtensionName extension_93a0a2af1918411486f7a58f77cdb054_customInt
  • ユーザアカウント作成時にカスタム属性を指定
    ※ユーザアカウントの作成の「単純なユーザアカウントの作成」をベースにしています。
    $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
  • その他のカスタム属性の操作


(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

-1. システムエンジニアリング, Azure, PowerShell, 基盤技術, 実装技術

執筆者:

関連記事

.NET Core: Azure AD B2Cユーザアカウント操作のサンプル

概要 管理者がAzure AD B2Cのユーザアカウントの管理が行えるASP.NET Coreのアプリの開発を想定している。Azure AD B2Cユーザアカウントの作成や更新等の操作はMicroso …

Javaによるzipファイルの安全な解凍方法

以前、業務アプリ(Java)でzipファイルの操作が必要となったため、Javaにおけるzip圧縮解凍について調査しました。また、zip4jを使った圧縮・解凍についても説明しました。 ここでは、もう少し …

Windows10のインストール場所を選べない

DELLのノートPCであるVostro 5370を購入しました。 既定ではWindows 10 Homeがインストールされていましたが、会社用のボリュームライセンスのWindows10 Enterpr …

Javaでのパスワード付きzipファイルの圧縮/解凍方法(ZipCrypto/AES)

先日、JavaでのZIP暗号化の考察という記事を書きましたが、zip4jのメンテナンスが再開されており、バージョン2系が公開されていましたので、これを使って通常のzip圧縮/解凍、パスワード付きzip …

ASP.NET Coreを使った独自フレームワーク開発の考察

ASP.NET CoreをベースとしたWebアプリ用フレームワークを開発するためのナレッジ置き場です。 ASP.NET Core3系のMVC + Razorを使用する前提の情報です。 まだ思い付きで書 …