Azure AD PowerShell v2チートシート

皆さんこんにちは。国井です。
Azure ADのPowerShellもVersion 2が出てきており、
そろそろ実務でも使う機会が出てきているので、このあたりで一度、主なコマンドレットをまとめておきたいと思います。(というか、自分用?)

■まずはAzure AD PowerShell v2の実装
以下のサイトでも紹介されているように、Install-ModuleコマンドレットでAzure AD PowerShell v2はインストールできます。
びっくりするくらい面倒な操作は一切不要。便利な世の中になったものですね。
https://www.powershellgallery.com/packages/AzureAD/2.0.0.115

Install-Module -Name AzureAD

ちなみにAzure AD PowerShell v1も「Install-Module MSOnline」って入力すればインストールできるようになってます。

■Azure AD に接続
ここからはAzure AD PowerShell v1と比較しながら見ていきましょう。
まずAzure ADをPowerShellから操作するときは接続操作が必要です。
(上段がv1の操作、下段がv2の操作です)

$cred = Get-Credential
Connect-MsolService -Credential $cred
$cred = Get-Credential
Connect-AzureAD -Credential $cred

■ユーザー一覧の確認
こちらはAzure ADのユーザー一覧を参照するときのコマンドレットです。

Get-MsolUser
Get-AzureADUser

Get-AzureADUserの場合、ユーザーの数が多いと一部ユーザーが表示されない場合があります。その場合は-Allというオプションをつけると間違いないです。

Get-AzureADUser -All $true

■一部のユーザーのみ表示
特定の属性を持つユーザーだけが結果として表示されるようにしたい場合、Whereコマンドレットを使います。例えば、部署属性がSalesだったらという条件の場合、次のように書きます。

Get-MsolUser | Where {$_.Department -eq "Sales"}
Get-AzureADUser | Where {$_.Department -eq "Sales"}

ただ、Whereコマンドレットではxxから始まる文字列、という指定はできないんですよね。そういうときはFilterオプションを使います。部署属性がSalesという文字列で始まる場合という条件の場合、次のように書きます。

Get-AzureADUser -Filter "startswith(department,'Sales')"

■ユーザー属性の確認
この間、お客さんにAzure AD Connectで同期されたユーザーが誰か知りたいと質問されたので、載せておきます。同期されたユーザーの場合、ImmutableID属性に値を持ちます。

Get-MsolUser |ft DisplayName,ImmutableId
Get-AzureADUser |ft DisplayName,ImmutableId

■CSVファイルに基づくユーザーの作成
ユーザーを作成するときは、v1だとNew-MsolUser、v2だとNew-AzureADUserコマンドレットを使うのですが、CSVファイルで作成しておいたユーザー一覧を流し込んで作成するときは以下のとおりになります。ちなみに、v1とv2では必須パラメーターが異なるので、用意しておくべきCSVファイルも異なってきます。
例えば、v1だとCSVで指定したパスワードをそのまま流し込むことができたり、ライセンスの割り当てができたりするのですが、v2だとパスワードは事前にMicrosoft.Open.AzureAD.Model.PasswordProfileというオブジェクトを呼び出して、パスワードを登録しなければならないなど、v1に比べると面倒なことが増えてます(必須パラメーターも増えてますし)。
・1つ目のかこみ:v1用CSVファイル
・2つ目のかこみ:v1用PowerShellコマンドレット
・3つ目のかこみ:v2用CSVファイル
・4つ目のかこみ:v2用PowerShellコマンドレット

username,displayname,location,password,AccountSkuId
kunii@adfs.jp,国井傑,JP,P@ssw0rd,contoso:ENTERPRISEPACK
Import-Csv -Path <CSVファイルのパス> | foreach {New-MsolUser -DisplayName $_.displayname -UserPrincipalName $_.username -UsageLocation $_.location -LicenseAssignment $_.AccountSkuId -Password $_.Password}
username,displayname,location,mailnickname
kunii@adfs.jp,国井傑,JP,kunii
$PasswordProfile=New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile
$PasswordProfile.Password="P@ssw0rd"
Import-Csv -Path <CSVファイルのパス> | foreach {New-AzureADUser -DisplayName $_.displayname -UserPrincipalName $_.username -UsageLocation $_.location -MailNickName $_.mailnickname -PasswordProfile $PasswordProfile -AccountEnabled $true}

■ユーザーの無効化
こちらはAzure ADのユーザーを無効化するときのコマンドレットです。

Set-MsolUser -UserPrincipalName <UPN> -BlockCredential $true
Set-AzureADUser -ObjectID <UPN> -AccountEnabled $false

■グループ一覧の確認
こちらはAzure ADのユーザー一覧を参照するときのコマンドレットです。

Get-MsolGroup
Get-AzureADGroup

■新しいグループの作成
v1ではグループを作成するときにグループ名だけ指定すれば出来上がりですが、v2ではメールが有効なグループ(Office 365のグループ)にするか?、セキュリティが有効なグループにするか?など指定しなければならないパラメーターが増えています。

New-MsolGroup -Displayname <グループ名>
New-AzureADGroup -DisplayName <グループ名> -MailEnabled $false -SecurityEnabled $true -MailNickName <メールニックネーム>

■グループにメンバーを追加
グループにメンバーを追加するときには、ユーザーの属性をベースに自動的にメンバーを追加・削除できるようにしたいですよね?Azure AD Premiumを買えば、そんな問題はすぐに解決できるのですが、地道にPowerShellでやりたい人はこちらからどうぞ(グループ名の代わりにグループのオブジェクトIDを指定するのですが、オブジェクトIDはGet-MsolGroupで確認できます)。
ちなみに、例文では[利用場所]属性がJPだったら、、という条件の時にグループのメンバーになるように設定しています。

Get-MsolUser | Where-Object {$_.usageLocation -match "JP"} | Add-MsolGroupMember -objectid <グループのオブジェクトID>
$group=Get-AzureADGroup |Where-Object {$_.Displayname -match <グループ名>}
Get-AzureADUser | Where-Object {$_.usageLocation -match "JP"} | foreach{Add-AzureADGroupMember -ObjectID $group.ObjectID -RefObjectID $_.ObjectID}

■ライセンスの確認
ライセンス割り当てをするときは、ライセンス名を確認しておかないといけません。なので、こちらのコマンドレットでどうぞ。

Get-MsolAccountSku
Get-AzureADSubscribedSku

■ユーザーにライセンスを割り当て
確認したらライセンスを割り当てるときは、v1だとSet-MsolUserLicense、v2だとSet-AzureADUserLicenseコマンドレットを使います。ただ、v2の場合、Get-AzureADSubscribedSkuコマンドレットで確認したライセンス名をそのまま指定することはできず、型の変換をする必要があります。

Set-MsolUserLicense -userprincipalname "<ユーザー名>" -addlicenses test:ENTERPRISEPACK
# 型の定義
$license = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$licenses = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses

# $licenseに追加するライセンスのSKU IDを登録
$license.SkuId = '<SKU ID>'
$licenses.AddLicenses = $license

# $licensesに削除するライセンスのSKU IDを登録
$licenses.RemoveLicenses = '<SKU ID>'

# ライセンスを割り当て
Set-AzureADUserLicense -ObjectId "<ユーザー名>" -AssignedLicenses $licenses

■パスワードのリセット
おひとり様のパスワードリセットだったらブラウザーから操作したほうが簡単だと思いますが、念のため。

Set-MsolUserPassword -UserPrincipalName "<ユーザー名>" -NewPassword "P@ssw0rd" -ForceChangePassword $false
$password=ConvertTo-SecureString -AsPlainText -String "P@ssw0rd" -Force
Set-AzureADUserPassword -ObjectId "<ユーザー名>" -Password $password -ForceChangePasswordNextLogin $false

■パスワードの無期限化
無期限パスワードを設定する場合も微妙にコマンドレットが異なります。

Set-MsolUser -UserPrincipalName "<ユーザー名>" -PasswordNeverExpires $true
Set-AzureADUser -UserPrincipalName "<ユーザー名>" -PasswordPolicies DisablePasswordExpiration

■ユーザー一律のパスワードを再設定
ユーザー全員のパスワードを一律で設定する場面というのは、Office 365の管理画面からCSVファイル経由でユーザーをまとめて作成した時なんかが考えられます。Office 365の管理画面からCSVファイル経由でユーザーを作成すると、パスワードはランダムなものが割り当てられてしまうので、それをしたくない時なんかに使うことになります。
v2の場合、Set-AzureADUserPasswordコマンドレットから平文のパスワードを指定できないので、事前にConvertTo-SecureStringコマンドレットを使ってパスワードを暗号化(変換)しています。

Get-MsolUser | Set-MsolUserPassword -NewPassword "P@ssw0rd" -ForceChangePassword $false
$password=ConvertTo-SecureString -AsPlainText -String "P@ssw0rd" -Force
Get-AzureADUser | Set-AzureADUserPassword -Password $password -ForceChangePasswordNextLogin $false

■Azure ADのポリシー作成
Azure ADのポリシーとは何か?という話は別の機会にすることにして、具体的に利用する場面はADFSサーバーから発行されるトークンのライフタイムを短くしたいときなどに使います。詳しくは以下のサイトでご覧ください。(このコマンドレットはv2限定です)
https://docs.microsoft.com/ja-jp/azure/active-directory/active-directory-configurable-token-lifetimes

New-AzureADPolicy -Definition @('{"TokenLifetimePolicy":{"Version":1, "MaxAgeSingleFactor":"until-revoked"}}') -DisplayName "OrganizationDefaultPolicyScenario" -IsOrganizationDefault $true -Type "TokenLifetimePolicy"

■Azure ADのポリシーに値を設定
作成したポリシーに値を設定していくコマンドレットです。

Set-AzureADPolicy -Id <ObjectId FROM GET COMMAND> -DisplayName "OrganizationDefaultPolicyUpdatedScenario" -Definition @('{"TokenLifetimePolicy":{"Version":1,"MaxAgeSingleFactor":"2.00:00:00"}}')

■Azure ADから切断
v1にはなかった、Azure ADの切断もv2なら用意されています。今までだったらコンソール自体を終了することでしか切断できなかったので、なにげにうれしい。

Disconnect-AzureAD

v2のコマンドレットを使ってオブジェクトを指定するときはユーザー名やグループ名ではなく、オブジェクトIDで指定します。ところが、オブジェクトIDの代わりにユーザー名やグループ名を指定しても問題ないコマンドレットもあるんですよね。ですので、今回のチートシートにはオブジェクトIDを使わなくて良いものに関しては、できるだけユーザー名やグループ名を指定するようにしました。

アプリケーション管理系のものとかが含まれていませんが、順次増やしていけたらと思います。

■参考資料 (今日、紹介できなかったアプリケーション管理系のものが掲載されています)
https://vincentlauzon.com/2017/02/02/automating-azure-ad/
https://blogs.msdn.microsoft.com/edutech/administration/script-bulk-assign-users-to-saas-application-using-graph-api-adal/