vm.gowatana.jp

NEOにほんごVMware(仮)

Horizon 検証むけの AD ユーザ作成の効率化。(PowerShell)

Horizon で仮想デスクトップの検証環境を構築する際に、多数のユーザが必要になることがあります。今回は、PowerShell を利用して AD ユーザを作成してみます。

今回の内容です。

 

利用する PowerShell モジュール

AD オブジェクトの操作には、「ActiveDirectory」モジュールを使用します。今回は、ドメイン コントローラの PowerShell プロンプトから実行しています。

Horizon のデスクトップ プールへのログイン資格の割り当てには、「VMware.Hv.Helper」モジュールを使用します。これは、下記のように用意した環境から実行しています。

 

1. 環境の構築

AD に、OU、セキュリティ グループ、ユーザを作成して、Horizon のデスクトップ プールへのログイン資格を割り当てます。OU は必須というわけではありませんが、AD でのオブジェクト管理や GPO 割り当てなどで利用しやすいので、あえて作成しています。

  • OU: demo-ou-01
  • セキュリティ グループ: demo-group-01
  • ユーザ: demo-user-001 ~ demo-user-010。demo-group-01 グループ メンバー

作成する AD オブジェクトは、「Active Directory コンピューターとユーザー」で確認すると下記のようになります。

 

1-1. OU の作成

最初に、検証用のユーザとグループを格納する OU「demo-ou-01」を作成しておきます。あとで削除しやすいように、OU の「誤って削除されないようにオブジェクトを保護する」は無効(-ProtectedFromAccidentalDeletion:$false)にしておきます。

PS C:\> New-ADOrganizationalUnit -Name "demo-ou-01" -Path "DC=euc,DC=go-lab,DC=jp" -ProtectedFromAccidentalDeletion:$false

 

OU が作成されました。

PS C:\> Get-ADOrganizationalUnit -Identity "OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp"

City                     :
Country                  :
DistinguishedName        : OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp
LinkedGroupPolicyObjects : {}
ManagedBy                :
Name                     : demo-ou-01
ObjectClass              : organizationalUnit
ObjectGUID               : 7353a007-e588-4d7b-8e3d-09a9ef44158a
PostalCode               :
State                    :
StreetAddress            :

 

1-2. AD グループの作成

作成した OU に、セキュリティ グループ「demo-group-01」を作成します。

PS C:\> New-ADGroup -Name "demo-group-01" -Path "OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" -GroupScope DomainLocal

 

グループが作成されました。

PS C:\> Get-ADGroup -Identity "demo-group-01"

DistinguishedName : CN=demo-group-01,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp
GroupCategory     : Security
GroupScope        : DomainLocal
Name              : demo-group-01
ObjectClass       : group
ObjectGUID        : 561bf46f-29e9-4c09-b114-5fd078e46b68
SamAccountName    : demo-group-01
SID               : S-1-5-21-292336108-2836314746-956363601-1131

 

1-3. AD ユーザの作成

ユーザの作成には New-ADUser、ユーザのグループへの追加は Add-ADGroupMember を使用します。

今回は、下記のようなスクリプトを用意しました。

create_ad_user.ps1 

  • ユーザ名は、demo-user-<数字3桁>
  • 10 ユーザ(demo-user-001 ~ demo-user-010)を作成。ユーザ数は6行目で指定。

gist.github.com

 

下記のようにスクリプトを実行するか、もしくは PowerShell のプロンプトでスクリプトの内容を1行ずつ実行します。

PS C:\> .\create_ad_user.ps1
User Name: demo-user-001
User Name: demo-user-002
User Name: demo-user-003
User Name: demo-user-004
User Name: demo-user-005
User Name: demo-user-006
User Name: demo-user-007
User Name: demo-user-008
User Name: demo-user-009
User Name: demo-user-010

 

ユーザが作成され、demo-group-01 グループのメンバーになりました。

PS C:\> Get-ADGroupMember -Identity "demo-group-01" | Select-Object objectClass,name | Sort-Object name

objectClass name
----------- ----
user        demo-user-001
user        demo-user-002
user        demo-user-003
user        demo-user-004
user        demo-user-005
user        demo-user-006
user        demo-user-007
user        demo-user-008
user        demo-user-009
user        demo-user-010

 

1-4. Horizon デスクトップ プールへの資格の割り当て

PowerCLI で、デスクトップ プールにログイン資格を割り当てます。

これは、PowerCLI と Hv.Helper が利用できる環境で実行します。

 

デスクトップ プールは、下記のように用意しておきます。

 

今回は、「test-win2019-pool-02」というデスクトップ プールに資格を割り当てます。事前に、Connct-HvServer で Connection Server にログインしておきます。

PS C:\Users\user01> Get-HVPoolSummary -PoolName "test-win2019-pool-02" | Format-List

Name            : test-win2019-pool-02
DisplayName     : Test Win2019 Pool 02
Type            : AUTOMATED
Source          : INSTANT_CLONE_ENGINE
User Assignment : FLOATING
Entitled        : 3
Enabled         : True
Sessions        : 3

 

デスクトップ プールに、セキュリティ グループを指定して資格(Entitlement)を割り当てます。

New-HVEntitlement でグループを指定する場合は、グループ名は「-User」に指定して、一緒に「-Type Group」を指定します。

PS C:\Users\user01> New-HVEntitlement -ResourceName "test-win2019-pool-02" -User "demo-group-01@euc.go-lab.jp" -Type Group
1  resource(s) will be entitled with UserOrGroup:  demo-group-01@euc.go-lab.jp

 

資格が割り当てれられました。

PS C:\Users\user01> Get-HVEntitlement -ResourceName "test-win2019-pool-02" -User "demo-group-01@euc.go-lab.jp" | Format-List

Id          : VMware.Hv.UserOrGroupId
Base        : VMware.Hv.ADUserOrGroupBase
LocalData   : VMware.Hv.EntitledUserOrGroupLocallyEntitledData
SessionData : VMware.Hv.EntitledUserOrGroupUserSessionData

 

割り当てた資格の情報は、JSON などに変換すると確認しやすくなります。

PS C:\Users\user01> Get-HVEntitlement -ResourceName "test-win2019-pool-02" -User "demo-group-01@euc.go-lab.jp" | ConvertTo-Json
{
    "Id":  {
               "Id":  "UserOrGroup/Uy0xLTUtMjEtMjkyMzM2MTA4LTI4MzYzMTQ3NDYtOTU2MzYzNjAxLTExMzE"
           },
    "Base":  {
                 "Sid":  "S-1-5-21-292336108-2836314746-956363601-1131",
                 "Group":  true,
                 "Domain":  "euc.go-lab.jp",
                 "DomainNetbiosName":  "EUC",
                 "AdDistinguishedName":  "CN=demo-group-01,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp",
                 "Name":  "demo-group-01",
                 "FirstName":  null,
                 "LastName":  null,
                 "LoginName":  "demo-group-01",
                 "DisplayName":  "euc.go-lab.jp\\demo-group-01",
                 "LongDisplayName":  "demo-group-01/euc.go-lab.jp",
                 "UserDisplayName":  null,
                 "Email":  null,
                 "KioskUser":  false,
                 "UnauthenticatedAccessUser":  false,
                 "Phone":  null,
                 "Description":  null,
                 "InFolder":  null,
                 "UserPrincipalName":  null,
                 "Guid":  "6FF41B56E929094CB1145FD078E46B68",
                 "FormattedGuid":  "561BF46F-29E9-4C09-B114-5FD078E46B68"
             },
    "LocalData":  {
                      "Machines":  null,
                      "PersistentDisks":  null,
                      "Desktops":  [
                                       "VMware.Hv.DesktopId"
                                   ],
                      "DesktopUserEntitlements":  [
                                                      "VMware.Hv.UserEntitlementId"
                                                  ],
                      "Applications":  null,
                      "ApplicationUserEntitlements":  null,
                      "UrlRedirectionSettings":  null,
                      "UrlRedirectionUserEntitlements":  null
                  },
    "SessionData":  {
                        "DesktopLocalSessionCount":  0,
                        "DesktopLocalSessions":  null,
                        "ApplicationLocalSessionCount":  0,
                        "ApplicationLocalSessions":  null
                    }
}
PS C:\Users\user01>

 

1-5. ログイン確認

Horizon Connection Server に Horizon HTML Access などでアクセスすると、demo-group-01 グループ メンバーのユーザでログインできるはずです。

今回のドメインは euc.go-lab.jp(NetBIOS 名は EUC)なので、「EUC\demo-user-001」~「EUC\demo-user-010」ユーザでログインできます。

 

資格を割り当てたデスクトップ プールが表示されます。

プールで仮想デスクトップが準備できていれば、ログインできるはずです。今回は 10ユーザほど作成したので、同時ログインできるようにするにはデスクトップ プールの「仮想マシンの最大数」も 10以上に設定しておきます。

 

2. 環境の削除

検証が終わったら、作成した AD オブジェクトを削除することになります。これは、作成とは逆順で実施します。

 

2-1. Horizon デスクトップ プールへの資格の削除

デスクトップ プールから資格を削除します。

PS C:\Users\user01> Remove-HVEntitlement -ResourceName "test-win2019-pool-02" -User "demo-group-01@euc.go-lab.jp" -Type Group
1  desktopUserEntitlement(s) will be removed for UserOrGroup  demo-group-01@euc.go-lab.jp

 

資格が削除されました。

PS C:\Users\user01> Get-HVEntitlement -ResourceName "test-win2019-pool-02" -User "demo-group-01@euc.go-lab.jp"
Get-HVEntitlement: No entitlements found with given search parameters

 

2-2. AD ユーザの削除

AD ユーザを削除します。念のため、-WhatIf で実行対象を確認しておきます。

PS C:\> Get-ADUser -SearchBase "OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" -Filter * | Sort-Object Name | Remove-ADUser -WhatIf
WhatIf: 対象 "CN=demo-user-001,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" に対して操作 "Remove" を実行しています。
WhatIf: 対象 "CN=demo-user-002,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" に対して操作 "Remove" を実行しています。
WhatIf: 対象 "CN=demo-user-003,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" に対して操作 "Remove" を実行しています。
WhatIf: 対象 "CN=demo-user-004,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" に対して操作 "Remove" を実行しています。
WhatIf: 対象 "CN=demo-user-005,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" に対して操作 "Remove" を実行しています。
WhatIf: 対象 "CN=demo-user-006,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" に対して操作 "Remove" を実行しています。
WhatIf: 対象 "CN=demo-user-007,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" に対して操作 "Remove" を実行しています。
WhatIf: 対象 "CN=demo-user-008,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" に対して操作 "Remove" を実行しています。
WhatIf: 対象 "CN=demo-user-009,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" に対して操作 "Remove" を実行しています。
WhatIf: 対象 "CN=demo-user-010,OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" に対して操作 "Remove" を実行しています。

 

実際にユーザを削除します。

PS C:\> Get-ADUser -SearchBase "OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" -Filter * | Sort-Object Name | Remove-ADUser -Confirm:$false

 

削除されました。

PS C:\> Get-ADUser -SearchBase "OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" -Filter *
PS C:\>

 

2-3. AD グループの削除

AD グループを削除します。

PS C:\> Get-ADGroup -Identity "demo-group-01" | Remove-ADGroup -Confirm:$false

 

2-4. OU の削除

最後に、OU を削除します。

PS C:\> Get-ADOrganizationalUnit -Identity "OU=demo-ou-01,DC=euc,DC=go-lab,DC=jp" | Remove-ADOrganizationalUnit -Confirm:$false

 

これで、検証開始時の状態に戻ったはずです。

以上、Horizon 検証むけに PowerShell で AD ユーザを作成してみる話でした。