PowerShellでAD構築のハンズオン

## はじめに
以前のブログでは[EC2(Windows)でADサーバ構築のハンズオン](https://cloud5.jp/setting_ec2_activedirectory/)として、手打ちでADサーバを構築しましたが、最近学んでいるPowerShellを利用して構築していこうと思います。

<br>

 ### ざっくりActiveDirectory(アクティブディレクトリ)
ActiveDirectory(以下、AD)とはWindowsServerの機能の一つです。
ネットワーク上のコンピュータや周辺機器、ユーザーアカウントなどの情報を一元管理する機能で、管理者はネットワーク上の資源や利用者を効率的に管理できます。資源や利用者をグループで管理し、それぞれのグループをを組み合わせて大規模な組織やネットワークを管理することも可能です。

【参考】
・[IT用語辞典](https://e-words.jp/w/Active_Directory.html)
<br>

------------

## 構成図
![](https://cloud5.jp/wp-content/uploads/2023/05/スクリーンショット-2023-05-05-11.43.45-640x289.png)

------------

## ハンズオン
### 構築のながれ
#### 1.EC2(AD)インスタンス構築（マネジメントコンソール）
#### 2.EC2(AD)インスタンスの設定（リモートデスクトップ接続）

-----------

### 1. EC2(AD)インスタンス構築（マネジメントコンソール）
#### 1.1.EC2(AD)インスタンスをセットアップ
Amazon Web Services (AWS) アカウントにログインし、下記設定値のEC2インスタンスを作成。

|項目|設定値|
|---|---|
|インスタンスタイプ|t3.micro|
|AMI ID|ami-0f6816cbdffbdde6c(Windows)|
|サブネット|パブリックサブネット|
|パブリック IP の自動割り当て|◯|

<br>

#### 1.2. セキュリティグループの設定
インスタンス作成時にセキュリティグループを設定し、プライベートサブネットからのアクセスのみを開放。

【インバウンド】

|タイプ|プロトコル|ポート範囲|ソース|CIDR|
|---|---|---|---|---|
|RDP|3389|TCP|マイIP|【自身のアクセスIP】|


【アウトバウンド】

|タイプ|プロトコル|ポート範囲|ソース|CIDR|
|---|---|---|---|---|
|すべてのトラフィック|すべて|すべて|カスタム|0.0.0.0/0|


<br>

#### 1.3. インスタンスを起動
上記設定後、『インスタンスを起動』を押下
<br>

------------


### 2.EC2(AD)インスタンスの設定（リモートデスクトップ接続）
#### 2.1.デスクトップにADフォルダを作成し config.txtの配置
テキストの内容は今回設定するADに必要な情報を記載します

|パラメータ変数名|値|備考|
|---|---|---|
|DomainName|tetutetu.com|ADのDNS名|
|DomainNetbiosName|tetutetu|NetBIOS名|
|Password|P@ssw0rd|管理者・ユーザパスワード|

<br>

【「config.txt」の中身】
```shell
DomainDNSName=tetutetu.com
DomainNetbiosName=tetutetu
Password=P@ssw0rd
```
<br>

#### 2.2.『1-ADDeployment.ps1』』　作成
##### 2.2.1.下記スクリプトをコピー&ペーストして、PowerShellで実行
ActiveDirectoryドメインサービス（AD DS）をインストールして、新規ADフォレストを作成するスクリプト

【「1-ADDeployment.ps1」の中身】
```shell
$config = Get-Content -Path "config.txt" | ConvertFrom-StringData

Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools
Import-Module ADDSDeployment

$params = @{
    DomainName        = $config.DomainDNSName;
    DomainNetbiosName = $config.DomainNetbiosName;
    ForestMode        = 'WinThreshold';
    DomainMode        = 'WinThreshold';
    DatabasePath      = 'C:\Windows\NTDS';
    LogPath           = 'C:\Windows\NTDS';
    SysvolPath        = 'C:\Windows\SYSVOL';
    SafeModeAdministratorPassword = (ConvertTo-SecureString $config.Password -AsPlainText -Force);
    InstallDns           = $true;
    CreateDnsDelegation  = $false;
    NoRebootOnCompletion = $false;
    Confirm = $false;
    }
Install-ADDSForest @params
```
<br>

##### 2.2.2.再起動
問題なく処理が終わると、再起動を問われるので再起動する

##### 2.2.3.ActiveDirectoryドメインサービス（AD DS）をインストール、新規ADフォレストが構築されていることを確認する
・[Windows] + [R]　で　「ファイル名を指定して実行」を起動する
・[dsa.msc]を入力して 「Active Directory ユーザーとコンピューター」を起動する
![](https://cloud5.jp/wp-content/uploads/2023/05/スクリーンショット-2023-05-05-11.13.20-640x452.png)

<br>

#### 2.3.『2-AddADConectorUser.ps1』作成
##### 2.3.1.下記スクリプトをコピー&ペーストして、PowerShellで実行
新しいActive Directoryユーザーを作成し、そのユーザーをドメイン管理者グループに追加するスクリプト

```shell
$config = Get-Content -Path "config.txt" | ConvertFrom-StringData

$params = @{
    Name                 = 'adconnector';
    UserPrincipalName    = "adconnector@$($config.DomainDNSName)";
    Description          = 'AWS AD Connector service user';
    AccountPassword      = ConvertTo-SecureString -AsPlainText $config.Password -Force;
    Enabled              = $true;
    PasswordNeverExpires = $true;
    }
New-ADUser @params
Add-ADGroupMember -Identity 'Domain Admins' -Members 'adconnector'
```
<br>

##### 2.3.2.`adconnector`が作成されていることを確認する
・[Windows] + [R]　で　「ファイル名を指定して実行」を起動する
・[dsa.msc]を入力して 「Active Directory ユーザーとコンピューター」を起動する
・手順 2.2.3.で画面を開きっぱなしにして、切り替えても表示されないため、一度画面を閉じて再度開くと反映される

![](https://cloud5.jp/wp-content/uploads/2023/05/スクリーンショット-2023-05-05-11.17.36-640x430.png)

<br>


#### 2.4.『3-AddTestUsers.ps1』作成
##### 2.4.1.下記スクリプトをコピー&ペーストして、PowerShellで実行
Active Directoryの組織単位（OU）を作成し、そのOUにテストユーザー(5人)を追加するスクリプト
```shell
$config = Get-Content -Path "config.txt" | ConvertFrom-StringData

New-ADOrganizationalUnit -Name 'TestUsers'
$ou = Get-ADOrganizationalUnit -Filter 'Name -eq "TestUsers"'
@(
    [PSCustomObject]@{ Name='user01'; PlainPassword = $config.Password; },
    [PSCustomObject]@{ Name='user02'; PlainPassword = $config.Password; },
    [PSCustomObject]@{ Name='user03'; PlainPassword = $config.Password; },
    [PSCustomObject]@{ Name='user04'; PlainPassword = $config.Password; },
    [PSCustomObject]@{ Name='user05'; PlainPassword = $config.Password; }
) | ForEach-Object {
    $params = @{
        Name                 = $_.Name;
        UserPrincipalName    = ("{0}@$($config.DomainDNSName)" -f $_.Name);
        Description          = ("Test user {0}" -f $_.Name);
        AccountPassword      = ConvertTo-SecureString $_.PlainPassword -AsPlainText -Force;
        PasswordNeverExpires = $true;
        Path = $ou.DistinguishedName;
        Enabled = $true;
     }
     New-ADUser @Params
}
```
<br>

##### 2.4.2.`adconnector`が作成されていることを確認する
・[Windows] + [R]　で　「ファイル名を指定して実行」を起動する
・[dsa.msc]を入力して 「Active Directory ユーザーとコンピューター」を起動する
・手順 2.3.3.で画面を開きっぱなしにして、切り替えても表示されないため、一度画面を閉じて再度開くと反映される

![](https://cloud5.jp/wp-content/uploads/2023/05/スクリーンショット-2023-05-05-11.26.18-640x432.png)

<br>

------------

## さいごに
毎回手打ちは、しんどかったので少し楽になりました。
CFnを構築した際に自動化までできればよいのですが、そういった大きな改善にむけての第一歩目という位置付けの構築でした。