ずんだもん「ギャルも安心！Active Directoryを一発インストールするスクリプトなのだ（WS2025 ARM対応）」

<table>
  <tr>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c0f938e8-bc8c-40c7-8ba6-db76fe6fe150.png" alt="Image 1" width="150"></td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d5f0b006-6a2c-4ffe-a214-860b9b842d84.png" alt="Image 2" width="160"></td>
  </tr>
</table> 

**ずんだもん**「つむぎ、今日はWindows Server 2025 ARMでActive Directoryドメインサービス（AD DS）とDNSサーバーを一発インストールできるスクリプトを解説するのだ！」

**つむぎ**「あれってポチポチしてくの地味にめんどいんだよね～。一発でADとDNS入るとか、あーし爆上がりなんだけど！でも、ギャルでもできるかな？」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/b3f3155c-ad8a-44f0-b35c-79cef43d2ac8.png)


**ずんだもん**「大丈夫なのだ！順番にポイントを見ていけば、ギャルでも理解できるのだ！」

# スクリプトの流れと要点

**ずんだもん**「まず、スクリプトを起動するのだ！」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/475551b3-f96f-4d50-af42-a6048bf36dc0.png)


## 1. **コンピュータ名の確認・変更**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/99042a14-dbf9-406c-8c6b-3f73f836d3fc.png)

- 現在のコンピュータ名を表示して、必要なら新しい名前に変更できるのだ。
    
- 変更した場合は再起動が必要なので、ここで案内が出るのだ。
    

**つむぎ**「名前変えるときは再起動しないとダメなんだ～。ギャル的には“GAL-SERVER”とか名付けたいわ！」

---

## 2. **ネットワーク設定の事前チェック**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/651b0bab-e524-47d0-8122-657811897bc3.png)

- 有効なネットワークアダプタを自動検出して選択できるのだ。
    
- 現在のIPアドレスやサブネット、ゲートウェイ、IPレンジを表示してくれるのだ。
    
- DHCPだったら警告が出て、ここで静的IPに変えることもできるのだ。
    

**つむぎ**「DHCPのままだとADインストールできないのね！静的IPにしないとマジ詰むやつ！」

---

## 3. **DNSサーバーアドレスの確認・設定**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/8e189d17-961e-4ecb-9635-f286594b589b.png)


- DNSが自分自身（127.0.0.1や自IP）になってなかったら警告＆設定変更できるのだ。
    

**つむぎ**「DNSが自分に向いてないとAD動かないとか、初心者にはエグすぎ！ちゃんとチェックしてくれるの助かる～！」

---

## 4. **AD DSインストールパラメータの入力**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/7dcac724-8f45-48d4-8cdf-7df6c73da34d.png)

- ドメイン名、NetBIOS名、フォレスト/ドメイン機能レベル、DNS同時インストール有無、DSRMパスワードなどを対話式で入力するのだ。
    
- 入力内容をまとめて確認、OKならインストール開始なのだ。
    

**つむぎ**「ドメイン名とか聞かれるけど、間違えたらやり直しだから慎重にね！Parallelsで構築するといつでも戻れるのはチルいわ～。」

---

## 5. **役割のインストールとAD DSフォレスト作成**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/83bd307c-efc1-4b83-891f-c894bda55034.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/f8740a1a-9100-4aff-9a7f-fb32a2aea799.png)

- 必要なWindows機能（AD DSと管理ツール）をインストールして、AD DSフォレストを新規作成するのだ。
    
- インストール後は自動再起動せず、ユーザーに再起動を促す設計なのだ。

**つむぎ**「勝手に再起動されないの超ありがたい！作業中にいきなり落ちたらギャル泣いちゃうもん！」

# スクリプト

<table>
  <tr>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c0f938e8-bc8c-40c7-8ba6-db76fe6fe150.png" alt="Image 1" width="150"></td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d5f0b006-6a2c-4ffe-a214-860b9b842d84.png" alt="Image 2" width="160"></td>
  </tr>
</table> 


**ずんだもん**「これがスクリプトなのだ！Windows Server 2022以降での動作を想定しているので、2019以前だとエラーになるので注意なのだ！」

```Install-ADDS-DNS-Interactive.ps1
<#
    対話式でパラメータを入力し、Windows Server 2025 ARM上に
    Active Directoryドメインサービス（AD DS）とDNSサーバーを一括インストールします。
    事前にコンピュータ名・ネットワーク構成（静的IP・DNS）をチェックし、不備があれば案内します。
    現在のIPレンジ・サブネット情報も表示します。
    デフォルトゲートウェイは「現在のものを使うか」選択でき、Nの場合は新規入力できます。
    インストール後は自動再起動せず、ユーザーへ再起動を促します。
    ※管理者権限で実行してください。
#>

Write-Host "==== Active Directory + DNS 一括インストールスクリプト（WS2025 ARM対応） ====" -ForegroundColor Cyan

# --- コンピュータ名の確認・変更 ---
$currentName = (Get-ComputerInfo).CsName
Write-Host "`n【現在のコンピュータ名】"
Write-Host "  $currentName"
$changeName = Read-Host "コンピュータ名を変更しますか？ (Y/N)"
if ($changeName -eq "Y" -or $changeName -eq "y") {
    $newName = Read-Host "新しいコンピュータ名を入力してください（15文字以内、英数字とハイフンのみ）"
    if ($newName -and $newName -ne $currentName) {
        try {
            Rename-Computer -NewName $newName -Force
            Write-Host "コンピュータ名を [$newName] に変更しました。再起動後に有効になります。" -ForegroundColor Green
            $rebootNow = Read-Host "今すぐ再起動しますか？ (Y/N)"
            if ($rebootNow -eq "Y" -or $rebootNow -eq "y") {
                Restart-Computer
                exit
            } else {
                Write-Host "再起動後、再度このスクリプトを実行してください。" -ForegroundColor Yellow
                exit
            }
        } catch {
            Write-Host "コンピュータ名の変更に失敗しました: $_" -ForegroundColor Red
            exit
        }
    } else {
        Write-Host "無効な名前、または同じ名前が指定されました。変更をスキップします。" -ForegroundColor Yellow
    }
}

# --- ネットワーク設定チェック ---
Write-Host "`n[ネットワーク設定の事前チェック]"

# 有効なアダプター取得
$adapters = Get-NetAdapter | Where-Object { $_.Status -eq "Up" }
if (!$adapters -or $adapters.Count -eq 0) {
    Write-Host "有効なネットワークアダプターが見つかりません。ネットワーク接続を確認してください。" -ForegroundColor Red
    exit
}

# アダプター選択
if ($adapters.Count -gt 1) {
    Write-Host "複数の有効なネットワークアダプターが見つかりました。"
    $adapters | ForEach-Object { Write-Host "$($_.ifIndex): $($_.Name)" }
    $ifIndex = Read-Host "AD DS用に使用するアダプターの ifIndex を入力してください"
} else {
    $ifIndex = $adapters[0].ifIndex
    Write-Host "使用するアダプター: $($adapters[0].Name)"
}

# 現在のIP設定取得
$ipConfig = Get-NetIPAddress -InterfaceIndex $ifIndex -AddressFamily IPv4 | Where-Object { $_.IPAddress -notlike "169.*" }
$ipConfig = $ipConfig | Select-Object -First 1
$gateway = (Get-NetIPConfiguration -InterfaceIndex $ifIndex).Ipv4DefaultGateway.NextHop

# サブネットマスク計算
function Get-SubnetMaskFromPrefix($prefix) {
    $mask = [uint32]0
    for ($i = 0; $i -lt 32; $i++) {
        if ($i -lt $prefix) { $mask = $mask -bor (1 -shl (31 - $i)) }
    }
    return [IPAddress]::new($mask).ToString()
}

$subnetMask = Get-SubnetMaskFromPrefix $ipConfig.PrefixLength

# IPレンジ推定（/24のみ簡易対応）
if ($ipConfig.PrefixLength -eq 24) {
    $octets = $ipConfig.IPAddress.Split('.')
    $rangeStart = "$($octets[0]).$($octets[1]).$($octets[2]).1"
    $rangeEnd   = "$($octets[0]).$($octets[1]).$($octets[2]).254"
    $subnetAddr = "$($octets[0]).$($octets[1]).$($octets[2]).0"
} else {
    # 簡易表示（詳細な範囲計算は省略）
    $rangeStart = "（このサブネットの範囲で設定してください）"
    $rangeEnd   = ""
    $subnetAddr = "（$ipConfig.IPAddress/$($ipConfig.PrefixLength)）"
}

Write-Host "`n【現在のネットワーク設定】"
Write-Host "  現在のIPアドレス    : $($ipConfig.IPAddress)"
Write-Host "  サブネットマスク    : $subnetMask （/$($ipConfig.PrefixLength)）"
Write-Host "  デフォルトゲートウェイ: $gateway"
Write-Host "  推定IPレンジ        : $rangeStart ～ $rangeEnd"
Write-Host ""

# 静的IP判定
if ($ipConfig.PrefixOrigin -ne "Manual") {
    Write-Host "警告: このサーバーのIPv4アドレスはDHCPで設定されています。" -ForegroundColor Yellow
    Write-Host "AD DSインストール前に静的IPアドレスに設定する必要があります。"
    $setStatic = Read-Host "静的IPアドレスをこの場で設定しますか？ (Y/N)"
    if ($setStatic -eq "Y" -or $setStatic -eq "y") {
        $newIP = Read-Host "設定するIPv4アドレスを入力してください（例: $rangeStart ～ $rangeEnd）"
        $prefix = $ipConfig.PrefixLength

        # デフォルトゲートウェイの選択
        $useCurrentGateway = Read-Host "現在のデフォルトゲートウェイ [$gateway] を使用しますか？ (Y/N)"
        if ($useCurrentGateway -eq "Y" -or $useCurrentGateway -eq "y") {
            $gatewayInput = $gateway
        } else {
            $gatewayInput = Read-Host "新しいデフォルトゲートウェイを入力してください（空欄で未設定）"
            if ([string]::IsNullOrWhiteSpace($gatewayInput)) { $gatewayInput = $null }
        }

        # 既存IPがある場合は削除（エラー回避のため）
        $existingIP = Get-NetIPAddress -InterfaceIndex $ifIndex -AddressFamily IPv4 | Where-Object { $_.IPAddress -notlike "169.*" }
        if ($existingIP) {
            foreach ($ip in $existingIP) {
                Remove-NetIPAddress -InterfaceIndex $ifIndex -IPAddress $ip.IPAddress -Confirm:$false -ErrorAction SilentlyContinue
            }
        }

        # 静的IP設定
        if ($gatewayInput) {
            New-NetIPAddress -InterfaceIndex $ifIndex -IPAddress $newIP -PrefixLength $prefix -DefaultGateway $gatewayInput -ErrorAction Stop
        } else {
            New-NetIPAddress -InterfaceIndex $ifIndex -IPAddress $newIP -PrefixLength $prefix -ErrorAction Stop
        }
        $ipConfig = Get-NetIPAddress -InterfaceIndex $ifIndex -AddressFamily IPv4 | Where-Object { $_.IPAddress -eq $newIP }
    } else {
        Write-Host "スクリプトを終了します。静的IP設定後に再度実行してください。" -ForegroundColor Red
        exit
    }
}

# DNSサーバーアドレス判定
$myIP = $ipConfig.IPAddress
$dnsConfig = Get-DnsClientServerAddress -InterfaceIndex $ifIndex -AddressFamily IPv4
$dnsOK = $false
foreach ($addr in $dnsConfig.ServerAddresses) {
    if ($addr -eq $myIP -or $addr -eq "127.0.0.1") { $dnsOK = $true }
}
if (-not $dnsOK) {
    Write-Host "警告: DNSサーバーアドレスが自分自身（$myIP または 127.0.0.1）に設定されていません。" -ForegroundColor Yellow
    $setDns = Read-Host "DNSサーバーアドレスを自分自身に設定しますか？ (Y/N)"
    if ($setDns -eq "Y" -or $setDns -eq "y") {
        Set-DnsClientServerAddress -InterfaceIndex $ifIndex -ServerAddresses @($myIP)
    } else {
        Write-Host "スクリプトを終了します。DNS設定後に再度実行してください。" -ForegroundColor Red
        exit
    }
}

Write-Host "ネットワーク設定はOKです。" -ForegroundColor Green

# --- AD DSインストールパラメータ入力 ---
$domainName = Read-Host "`n新しいドメイン名（例: example.local）を入力してください"
$defaultNetbios = $domainName.Split(".")[0].ToUpper()
$netbiosName = Read-Host "NetBIOS名を入力してください（省略時: $defaultNetbios）"
if ([string]::IsNullOrWhiteSpace($netbiosName)) { $netbiosName = $defaultNetbios }
$forestMode = "Win2025"
$domainMode = "Win2025"
$installDns = Read-Host "DNSサーバーも同時にインストールしますか？ (Y/N)"
$installDnsFlag = ($installDns -eq "Y" -or $installDns -eq "y")
$dsrmPwd = Read-Host "ディレクトリサービス復元モード（DSRM）パスワードを入力してください" -AsSecureString

Write-Host "`n--- 入力内容確認 ---"
Write-Host "ドメイン名: $domainName"
Write-Host "NetBIOS名: $netbiosName"
Write-Host "フォレスト機能レベル: $forestMode"
Write-Host "DNSサーバー: $installDnsFlag"
$confirm = Read-Host "この内容でインストールを開始しますか？ (Y/N)"
if ($confirm -ne "Y" -and $confirm -ne "y") {
    Write-Host "インストールを中止しました。" -ForegroundColor Yellow
    exit
}

# --- 必要な役割のインストール ---
Write-Host "`nAD DS と管理ツールをインストール中..."
Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools

# --- AD DS フォレストの作成（再起動は自動で行わない） ---
Write-Host "AD DS フォレストを作成中..."
Import-Module ADDSDeployment

Install-ADDSForest `
    -DomainName $domainName `
    -DomainNetbiosName $netbiosName `
    -ForestMode $forestMode `
    -DomainMode $domainMode `
    -InstallDns:$installDnsFlag `
    -DatabasePath "C:\Windows\NTDS" `
    -LogPath "C:\Windows\NTDS" `
    -SysvolPath "C:\Windows\SYSVOL" `
    -SafeModeAdministratorPassword $dsrmPwd `
    -NoRebootOnCompletion:$true `
    -Force:$true

Write-Host "`nインストールが完了しました。" -ForegroundColor Green
Write-Host "サーバーを再起動して設定を反映してください。" -ForegroundColor Yellow
Write-Host "再起動後、Active Directoryの管理ツール等が利用可能になります。"

```

# 便利ポイントまとめ

| ポイント           | ずんだもんの解説                | つむぎのギャル語                  |
| -------------- | ----------------------- | ------------------------- |
| 対話式でパラメータ入力    | 初心者でも迷わず進めるのだ！          | 「質問に答えるだけでOKとか、チョー親切じゃん！」 |
| 静的IP/DNS自動チェック | ADに必須な設定を自動で確認・修正できるのだ！ | 「設定ミスで詰むパターン防げるの、マジ助かる～！」 |
| 再起動は手動         | 作業タイミングを自分で決められるのだ！     | 「勝手に再起動とか、ギャルの予定狂うからNG！」  |
| エラー時は即案内       | 問題があればすぐ中断＆理由を表示なのだ！    | 「何がダメか教えてくれるから、あーしでも安心！」  |

# 確認スクリプト

<table>
  <tr>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c0f938e8-bc8c-40c7-8ba6-db76fe6fe150.png" alt="Image 1" width="150"></td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d5f0b006-6a2c-4ffe-a214-860b9b842d84.png" alt="Image 2" width="160"></td>
  </tr>
</table> 

**つむぎ**「だいたい10分くらいで終わったね！ギャルにも簡単だったわ～。」

**ずんだもん**「再起動したら確認スクリプトの実行なのだ！」

**ずんだもん**「ドメインやフォレストの情報、ドメインコントローラーの一覧、ADやDNSのインストール状況、ネットワーク設定まで、AD関連のパラメータを一気に確認できるのだ！」



```Check-ADDS-CurrentStatus.ps1
Write-Host "==== AD DS & DNS サーバー情報まとめ ====" -ForegroundColor Cyan

Write-Host "`n【ドメイン情報】"
Get-ADDomain | Format-List

Write-Host "`n【フォレスト情報】"
Get-ADForest | Format-List

Write-Host "`n【ドメインコントローラー情報】"
Get-ADDomainController | Format-Table Name, IPv4Address, Site, IsGlobalCatalog

Write-Host "`n【インストール済み役割】"
Get-WindowsFeature | Where-Object {$_.Installed -eq $true} | Where-Object {$_.Name -match "AD|DNS"} | Format-Table DisplayName, Name

Write-Host "`n【ネットワーク設定】"
Get-NetIPAddress -AddressFamily IPv4 | Where-Object {$_.IPAddress -notlike "169.*"} | Format-Table InterfaceAlias, IPAddress, PrefixLength
Get-DnsClientServerAddress -AddressFamily IPv4 | Format-Table InterfaceAlias, ServerAddresses

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/9f43a9f1-5fda-4306-b250-aa31aa419a65.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c8028bbb-9413-4f33-930c-436b9153b8c7.png)


**つむぎ**「どのサーバーがドメコン（DC）になってるとか一覧で出る！ギャル的にも管理しやすい！」

# まとめ
<table>
  <tr>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c0f938e8-bc8c-40c7-8ba6-db76fe6fe150.png" alt="Image 1" width="150"></td>
    <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d5f0b006-6a2c-4ffe-a214-860b9b842d84.png" alt="Image 2" width="160"></td>
  </tr>
</table> 

**ずんだもん**「このスクリプトを使えば、Windows Server 2025 ARMでもAD DSとDNSの一発構築が安全・確実にできるのだ！」

**つむぎ**「ギャルでもノリで進めるくらい簡単！でも、管理者権限で実行するの忘れずにね！あと、ネットワーク設定とかドメイン名は慎重に～！」

**ずんだもん**「Qiitaでみんなも試してみてほしいのだ！困ったことがあればコメントで聞いてほしいのだ！」

**つむぎ**「AD構築もギャルの爪くらいバチバチにキメてこ！☆」

## 利用キャラクター
- ずんだもん：[VOICEVOX:ずんだもん](https://voicevox.hiroshiba.jp/)
- つむぎ：[PIXIV:りょうごさん](https://www.pixiv.net/artworks/113943183/)
本記事で使用しているキャラクター画像の著作権は、それぞれの権利者に帰属します。
非商用目的での利用に基づき掲載しています。