【Windows 検証環境構築】(ほぼ) コマンドのみで AD DS の検証環境を準備する方法

# はじめに

マイクロソフト社の製品の動作検証や不具合の調査などのため、Active Directory ドメインサービス (AD DS) の検証環境を用意する場合があります。
そのような場合は、下記の公開情報に紹介されているようなウィザードによる GUI 操作で、設定などを指定しながら構築することが (多分) 比較的一般的な方法です。

https://learn.microsoft.com/ja-jp/windows-server/identity/ad-ds/deploy/ad-ds-installation-and-removal-wizard-page-descriptions

上記のような GUI 操作による構築は視覚的にはわかりやすいですが、操作を画一化しにくいといった欠点もあります。
そこで本記事では可能な限り以下の Hyper-V モジュールなどの PowerShell コマンドレットを使用し、Hyper-V ホスト上に AD DS の検証環境を構築する方法についてまとめてみました。

https://learn.microsoft.com/ja-jp/powershell/module/hyper-v/?view=windowsserver2022-ps

:::note alert
本記事は、検証に使用する環境の構築手順をまとめたものです。
実際の運用システム上での利用を想定していませんので、検証環境上での参考情報としてご活用ください。
:::

本記事の手順を順番に実行することで、下記のような環境を構築できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561718/419af8bf-4ad2-96cf-f873-6f22a816b2af.png)

VMSwitch に NAT を設定することで、インターネット接続が必要な Entra ID Connect などの動作検証も可能です。
また、DHCP サーバーの役割をインストールすれば IP アドレスを配布できますが、検証環境への影響を考慮し任意手順としています。(後述)

# 事前準備

Windows OS インストールのためのメディアおよび Hyper-V 環境を準備します。
* Windows をインストール可能な ISO メディアファイル
    * Windows Server (Windows Server 2019/2022)
    * Windows Client (Windows 10/11)
* Hyper-V の役割がインストールされたホスト用の Windows

:::note
以降の手順は上記各 ISO メディアファイルを "ISO格納フォルダ" に格納している前提でのコマンド例です。
また、"VHDXファイル格納フォルダ" に指定したフォルダパスに仮想マシンのファイルが作成されます。
実行する環境上で、ISO メディアファイル名やメディアを格納しているフォルダ名、仮想マシンの保存先のフォルダ名に読み替えて実行してください。
:::

Hyper-V の役割インストールに必要な要件や、具体的なインストール方法については本記事では触れませんので、下記を参考に Hyper-V の役割をインストールしてみてください。

https://learn.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/get-started/install-the-hyper-v-role-on-windows-server

# 仮想スイッチの作成、NAT アドレス変換の設定

Hyper-V ホスト上で、管理者権限の Powershell を起動して実行します。

```powershell
New-VMSwitch -SwitchName "vSwitch ADDS env" -SwitchType Internal
```

## [任意] 仮想スイッチ経由でゲストの Windows OS からインターネット接続したい場合 (NAT アドレス変換の構成)

:::note info
検証環境からインターネットに接続する必要がなければ、本手順の実施は不要です。
:::

NAT アドレス変換の設定を構成します。

```powershell
Get-NetAdapter
New-NetIPAddress -IPAddress 192.168.1.1 -PrefixLength 24 -InterfaceIndex 28
New-NetNat -Name WinNAT -InternalIPInterfaceAddressPrefix 192.168.1.0/24
```

https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/setup-nat-network

## [TIPS] 仮想スイッチの作成、NAT アドレス変換の設定を削除するときの手順

検証の終了後、設定したネットワーク環境を削除したいときは通常の仮想スイッチの手順に加えて作成した NAT インタフェースの削除が必要となります。
下記のコマンドで、仮想スイッチおよび NAT インタフェースの削除が可能です。

```powershell
## 作成した NAT 変換の名称確認 (未作成の場合は実行不要)
Get-NetNat | Select-Object -ExpandProperty Name
Remove-NetNat "WinNAT"

## 内部スイッチの削除
Remove-VMSwitch "vSwitch ADDS env"
```

# Windows Server (ADDS) の仮想マシンを作成する

Hyper-V ホスト上で、管理者権限の Powershell を起動して実行します。

```powershell
# Hyper-V ホスト上で設定する VM 名などの変数宣言
$VMName = 'ADDS'
$Switch = 'vSwitch ADDS env'
$InstallMedia = '<ISO 格納フォルダ フルパス>\ja_windows_server_2016_vl_x64_dvd_11645964.iso'
$Path = '<VHDX ファイル格納フォルダ フルパス>\'
$VHDPath = $Path+$VMName+'.vhdx'
$VHDSize = '64424509440'
# 60 GB 固定の場合

# 仮想マシンの作成
New-VM -Name $VMName -MemoryStartupBytes 16GB -BootDevice VHD -Path $Path -NewVHDPath $VHDPath -NewVHDSizeBytes $VHDSize  -Generation 2 -Switch $Switch  

# OS インストール時の要件を満足するため、動的メモリは無効化する
Set-VMMemory $VMName -DynamicMemoryEnabled $false

# インストールする OS は DVD から起動するため、ドライブを追加
Add-VMDvdDrive -VMName $VMName -ControllerNumber 0 -ControllerLocation 1 -Path $InstallMedia

# 前述のドライブにインストールメディアを挿入
$DVDDrive = Get-VMDvdDrive -VMName $VMName

# OS の起動順を DVD からに設定する
Set-VMFirmware -VMName $VMName -FirstBootDevice $DVDDrive
```

https://learn.microsoft.com/ja-jp/windows-server/identity/ad-ds/deploy/install-a-new-windows-server-2012-active-directory-forest--level-200-#BKMK_PS

仮想マシンが作成されたことを確認し、管理コンソールで起動します。
インストール時のウィザードに従ってインストールし、管理者のパスワードの設定などを実施します。
管理者ユーザーでサインイン可能になったら以降の手順を実施します。

# Windows Server (ADDS) のホスト名, IPアドレス更新

Windows Server (ADDS) に管理者ユーザーでサインインし、Powershell (あるいは Powershell ISE) で以下のコマンドを実行します。

```powershell
# IP アドレス、設定するホスト名の宣言
$ipaddress = "192.168.1.101" 
$ipprefix = "24" 
$ipgw = "192.168.1.1" 

## ipdns は任意の DNS サーバー
## NAT アドレス変換を構成し、ipdns にGoogle Public DNS (8.8.8.8) を構成するとインターネット接続可能
## ドメインに昇格すると ipdns に設定された IP アドレスが DNS フォワーダーとして構成される
## (優先 DNS サーバーは 127.0.0.1 になる)
$ipdns = "8.8.8.8"

## ipdns2 は未設定で問題ない
$ipdns2 = ""

$ipif = (Get-NetAdapter).ifIndex 
$featureLogPath = "c:\poshlog\featurelog.txt" 
$newname = "ADDS"
$addsTools = "RSAT-AD-Tools" 

# インターフェースに前述の IP アドレスを設定
New-NetIPAddress `
-IPAddress $ipaddress `
-PrefixLength $ipprefix `
-InterfaceIndex $ipif `
-DefaultGateway $ipgw 

# DNS サーバーとして自身 (ADDS) と外部の DNS を設定
Set-DnsClientServerAddress `
-InterfaceIndex $ipif `
-ServerAddresses ($ipdns, $ipdns2)

# ホスト名を更新 (ここでは "ADDS" に) 
Rename-Computer -NewName $newname -force 

# RSAT のインストール
New-Item $featureLogPath -ItemType file -Force 
Add-WindowsFeature $addsTools 
Get-WindowsFeature | Where installed >>$featureLogPath 

#Restart the computer 
Restart-Computer
```

再起動が完了するまで待機し、後続の手順を実施します。

# Windows Server (ADDS) に Active Directory の役割をインストールする

Windows Server (ADDS) に管理者ユーザーでサインインし、Powershell (あるいは Powershell ISE) で以下のコマンドを実行します。

```powershell
#Declare variables
$DatabasePath = "c:\windows\NTDS"
$DomainMode = "WinThreshold"
$DomainName = "contoso.com"
$DomainNetBIOSName = "CONTOSO"
$ForestMode = "WinThreshold"
$LogPath = "c:\windows\NTDS"
$SysVolPath = "c:\windows\SYSVOL"
$featureLogPath = "c:\poshlog\featurelog.txt" 
$Password = ConvertTo-SecureString "Passw0rd" -AsPlainText -Force

#Install Active Directory Domain Services, DNS, and Group Policy Management Console 
start-job -Name addFeature -ScriptBlock { 
Add-WindowsFeature -Name "ad-domain-services" -IncludeAllSubFeature -IncludeManagementTools 
Add-WindowsFeature -Name "dns" -IncludeAllSubFeature -IncludeManagementTools 
Add-WindowsFeature -Name "gpmc" -IncludeAllSubFeature -IncludeManagementTools } 
Wait-Job -Name addFeature 
Get-WindowsFeature | Where installed >>$featureLogPath

#Create a new Windows Server AD forest
Install-ADDSForest `
-CreateDnsDelegation:$false `
-DatabasePath $DatabasePath `
-DomainMode $DomainMode `
-DomainName $DomainName `
-SafeModeAdministratorPassword $Password `
-DomainNetbiosName $DomainNetBIOSName `
-ForestMode $ForestMode `
-InstallDns:$true `
-LogPath $LogPath `
-NoRebootOnCompletion:$false `
-SysvolPath $SysVolPath `
-Force:$true
```

再起動を要求されるため、ポップアップに従い再起動します。

:::note
ドメイン機能レベルを表す "-DomainMode $DomainMode" ですが、WIndows Server R2 の場合は対応する "Win2012R2" の指定が必要です。

```
$DomainMode = "Win2012R2"
```

:::

Set-ADDomainMode (ActiveDirectory) | Microsoft Learn 
https://learn.microsoft.com/en-us/powershell/module/activedirectory/set-addomainmode?view=windowsserver2022-ps#-domainmode

## (任意) 検証用のユーザーを作成する

検証用の一般ユーザー "amccray" を作成します。
パスワードが期限切れにならず、リモートデスクトップ接続を許可する設定とします。

```powershell
#Declare variables
$Givenname = "Allie"
$Surname = "McCray"
$Displayname = "Allie McCray"
$Name = "amccray"
$Password = "*******"
$SecureString = ConvertTo-SecureString $Password -AsPlainText -Force

#Create the user
New-ADUser `
-Name $Name `
-GivenName $Givenname `
-Surname $Surname `
-DisplayName $Displayname `
-AccountPassword $SecureString

#Set the password to never expire
Set-ADUser `
-Identity $Name `
-PasswordNeverExpires $true `
-ChangePasswordAtLogon $false `
-Enabled $true

#Enable user to Remote Desktop
Add-ADGroupMember `
-Members $Name `
-Identity "Remote Desktop Users"
```

## (任意) DHCP サーバーの役割をインストール,スコープを有効化する

:::note alert
本手順により DHCP サーバーと同一ネットワークに接続されているコンピュータに対し IP アドレスが配布されます。 
サーバーの接続先が外部スイッチであるなど外部に IP アドレスが配布される構成となっていた場合は、意図しないコンピューターに IP アドレスが配布されることにより Hyper-V ホストが接続されているネットワーク環境の動作の不具合につながる可能性があります。
記事内で作成している "vSwitch ADDS env" は内部スイッチ設定のため配布範囲は Hyper-V ホスト上の仮想マシンに限られますが、それ以外の構成で DHCP サーバーを構成する場合は前述の内容について十分ご理解いただいた上で設定は自己責任にてお願いします。
:::

:::note warn
Microsoft としては、AD DS と DHCP を同一サーバーに導入することは推奨していません。(下記公開情報 参照) 
それぞれの機能に問題が発生した際の対処が難しくなるので、実際に運用する環境では AD DS とは別サーバーにインストールするのが望ましいです。
:::

ドメイン コントローラーの構築時に言われないと気付かないこと | Microsoft Japan Windows Technology Support Blog
https://jpwinsup.github.io/blog/2023/10/23/ActiveDirectory/Authentication/design-consideration/#DHCP-との同居も非推奨！

DHCP クライアントが有効な仮想マシンに対して、以下の設定が配布されるようにします。

* 192.168.1.151 から 254 の IP アドレスを設定
* DNS サーバーとして、AD DS の IP アドレス 192.168.1.101 を設定
* ゲートウェイアドレスとして、仮想スイッチに指定した 192.168.1.1 を設定

上記の設定により、同じ仮想スイッチに接続している仮想マシンからドメイン参加が可能になります。
また、ドメイン非参加の状態でもインターネットに疎通ができるようになります。

Windows Server (ADDS) に管理者ユーザーでサインインし、Powershell (あるいは Powershell ISE) で以下のコマンドを実行します。

```powershell
Install-WindowsFeature DHCP -IncludeManagementTools
netsh dhcp add securitygroups
Restart-Service dhcpserver

Add-DhcpServerInDC `
-DnsName DHCP1.contoso.com `
-IPAddress 192.168.1.101

Get-DhcpServerInDC 
Set-ItemProperty –Path registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ServerManager\Roles\12 –Name ConfigurationState –Value 2

Set-DhcpServerv4DnsSetting -ComputerName "ADDS.contoso.com" -DynamicUpdates "Always" -DeleteDnsRRonLeaseExpiry $True
# ドメインの管理者の認証情報入力 (ドメイン名\ユーザー名)
$Credential = Get-Credential
Set-DhcpServerDnsCredential -Credential $Credential -ComputerName "ADDS.contoso.com"

Add-DhcpServerv4Scope `
-name "151-254" `
-StartRange 192.168.1.151 `
-EndRange 192.168.1.254 `
-SubnetMask 255.255.255.0 `
-State Active

Set-DhcpServerv4OptionValue `
-OptionID 3 `
-Value 192.168.1.1 `
-ScopeID 192.168.1.0 `
-ComputerName ADDS.contoso.com

Set-DhcpServerv4OptionValue `
-DnsDomain contoso.com `
-Router 192.168.1.1 `
-DnsServer 192.168.1.101
```

DHCP サーバーを再起動します。

```powershell
net stop dhcpserver
net start dhcpserver
```

https://learn.microsoft.com/ja-jp/windows-server/networking/technologies/dhcp/dhcp-deploy-wps

#### [TIPS] Set-DhcpServerv4OptionValue の -OptionID 3 について

"Set-DhcpServerv4OptionValue" のコマンドの説明文には言及がありませんが、内部的には "3" はルーターに設定された ID のようです。

https://learn.microsoft.com/en-us/powershell/module/dhcpserver/set-dhcpserverv4optionvalue?view=windowsserver2022-ps

表示上のオプション名と、ID の対応は DHCP の管理画面で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561718/20843755-9d60-6157-708d-8b7cf6245613.png)

### Windows Client (ADmenber) の仮想マシンを作成する

Hyper-V ホスト上で、管理者権限の Powershell を起動して実行します。

```powershell
#Declare variables
$VMName = 'ADmember'
$Switch = 'vSwitch ADDS env'
$InstallMedia = '<ISO 格納フォルダ>\ja-jp_windows_11_business_editions_version_22h2_updated_nov_2023_x64_dvd_ba7f1c52.iso'
$Path = '<VHDX ファイル格納フォルダ>'
$VHDPath = $Path + '\' + $VMName + '.vhdx'
$VHDSize = '64424509440'
# 固定 60 GB。要件により変更

#Create a new virtual machine
New-VM -Name $VMName -MemoryStartupBytes 4GB -BootDevice VHD -Path $Path -NewVHDPath $VHDPath -NewVHDSizeBytes $VHDSize  -Generation 2 -Switch $Switch  

#Set the memory to be non-dynamic
Set-VMMemory $VMName -DynamicMemoryEnabled $false

#Add a DVD drive to the virtual machine
Add-VMDvdDrive -VMName $VMName -ControllerNumber 0 -ControllerLocation 1 -Path $InstallMedia

#Mount installation media
$DVDDrive = Get-VMDvdDrive -VMName $VMName

#Configure the virtual machine to boot from the DVD
Set-VMFirmware -VMName $VMName -FirstBootDevice $DVDDrive
```

## [TIPS] Windows 11 をインストールする場合の追加手順

必要要件を満足するために、以下のコマンドの実行が追加で必要になります。

```powershell
# Windows 11 のときのみ必要
Set-VMKeyProtector -VMName $VMName -NewLocalKeyProtector
Enable-VMTPM -VMName $VMName
Set-VMProcessor $VMName -Count 2
```

https://jpwinsup.github.io/blog/2022/12/22/Hyper-V/ConfigurationAndManagement/Setting-vTPM/

# Windows Client (ADmenber) のホスト名を設定する

Windows Client (ADmenber) に管理者ユーザーでサインインし、Powershell (あるいは Powershell ISE) で以下のコマンドを実行します。

```powershell
#Declare variables
$newname = "ADmember"
$addsTools = "RSAT-AD-Tools"
$featureLogPath = "c:\poshlog\featurelog.txt" 

#Rename the computer 
Rename-Computer -NewName $newname -force 

#Install features (Windows Server の場合のみ実行)
#New-Item $featureLogPath -ItemType file -Force 
#Add-WindowsFeature $addsTools 
#Get-WindowsFeature | Where installed >>$featureLogPath 

#Restart the computer 
Restart-Computer
```

実行後、再起動されることを確認します。

# Windows Client (ADmenber) をドメインに参加させる

Windows Client (ADmenber) に管理者ユーザーでサインインし、Powershell (あるいは Powershell ISE) で以下のコマンドを実行します。

```powershell
Add-Computer -DomainName contoso.com -Credential contoso\Administrator -Restart
```

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.localaccounts/set-localuser?view=powershell-5.1

## おわりに

今回は、検証用によく使用している環境構築のコマンドをまとめてみました。
GUI による検証環境の構築は意外と時間がかかりがちでオペレーションミスが発生しやすい作業のため、本記事の内容が調査の効率化や自動化などに少しでも役に立てばうれしいです。

また、Azure 環境が使用できる場合は以下の情報も参考になるかもしれません。
機会があれば、同様の環境を Azure 上に構築する方法も調査してみたいと思います。

https://learn.microsoft.com/ja-jp/windows-server/identity/ad-ds/deploy/virtual-dc/adds-on-azure-vm

なお、本情報は検証環境の構築を目的としたものですが、例えば仮想環境上で本番向けの環境を構築したい場合は、下記のような公式の公開情報も参考にしてください。

仮想 Active Directory Domain Services ドメイン コントローラー Hyper-V |Microsoft Learn 
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd363553(v=ws.10)