PowershellでActiveDirectoryを管理する(1)

# はじめに
Active Directoryの管理作業をPowershellから実施してみる。
定常的な作業を自動化するために調査。

今回はユーザ作成とロック解除（とユーザ属性の変更）にまつわるコマンドについて記載する。

# 環境

```powershell
PS> [System.Environment]::OSVersion

Platform ServicePack Version      VersionString
-------- ----------- -------      -------------
 Win32NT             6.3.9600.0   Microsoft Windows NT 6.3.9600.0

PS> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   6.3.9600.17400
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2
```

※WindowsServer 2012R2

# PowershellにActiveDirectoryモジュールを導入する。
 Windowsの機能追加を実施し、PowershellのActiveDirectory　モジュールを導入する。

## 機能名を確認する。
`RSAT-AD-PowerShell` がActiveDirectroy のPowershell版管理ツール。

```powershell
PS> Get-WindowsFeature

Display Name                                            Name                       Install State
------------                                            ----                       -------------
[X] Remote Server Administration Tools                  RSAT                           Installed
# ～　中略　～    
    [X] Role Administration Tools                       RSAT-Role-Tools                Installed
        [X] AD DS and AD LDS Tools                      RSAT-AD-Tools                  Installed
            [ ] Active Directory module for Windows ... RSAT-AD-PowerShell             Available
```

## 機能の導入

```powershell
PS> Install-WindowsFeature -Name RSAT-AD-PowerShell

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             Success        {Active Directory module for Windows Power...
```

# 使ってみる
## ユーザ作成
`New-ADUser` コマンドレットを使用する。
このコマンドレットは `AccountPassword` オプションを利用してユーザの初期パスワードを設定することができる。
しかし、パスワードポリシーに定める複雑性要件を満たせなかった時に「パスワード未設定且つ無効」のユーザが作成される。

このエラーハンドリングを行おうとすると、無効ユーザの削除が必要になる等煩雑だったので、
ユーザ作成処理とパスワード設定処理を分ける手順も記載する。

### ユーザ作成と同時にパスワード設定
パスワードポリシーに抵触しないことが確実ならば、こちらのほうがスマート。

```powershell
PS> New-ADUser ztest01 -Surname Test `
                       -GivenName User1 `
                       -Path "OU=TEST,OU=UNIT,OU=EXAMPLE,DC=example,DC=co,DC=jp" `
                       -UserPrincipalName "ztest01@example.co.jp" `
                       -AccountPassword (ConvertTo-SecureString -AsPlainText "password" -Force)
```


### ユーザ作成とパスワード設定を分ける
シェルスクリプトでエラーハンドリング、リランしやすいのはこちら。

```powershell
# ユーザ作成
PS> New-ADUser ztest01 -Surname Test `
                       -GivenName User1 `
                       -Path "OU=TEST,OU=UNIT,OU=EXAMPLE,DC=example,DC=co,DC=jp" `
                       -UserPrincipalName "ztest01@example.co.jp"
# ユーザ取得
PS> $user = Get-ADUser -Filter {SamAccountName -eq "ztest01"}

# パスワード設定
PS> $user | Set-ADAccountPassword -NewPassword (ConvertTo-SecureString -AsPlainText "password" -Force)

# 有効化
PS> $user | Set-ADUser -Enabled $true
```

### `New-ADUser` のよく使うオプション
| オプション             | 説明                                                               |
|:-----------------------|:-------------------------------------------------------------------|
|AccountPassword         |初期パスワードを指定(SecureStting)                                 |
|CannotChangePassword    |アカウントパスワードの変更を可能にするかどうかを指定                |
|ChangePasswordAtLogon   |次回ログオン時にパスワードを変更させるかどうかを指定                |
|DisplayName             |表示名を指定                                                        |
|EmailAddress            |メールアドレスを指定                                                |
|GivenName               |名を指定                                                            |
|PasswordNeverExpires    |アカウントパスワードの期限切れを無効にするかどうかを指定            |
|Path                    |オブジェクトを作成する組織単位(OU)またはコンテナのX.500パスを指定   |
|Surname                 |姓を指定                                                            |
|UserPrincipalName       |ユーザープリンシパル名を指定                                        |

## ユーザロック解除とよくある後処理
パスワード失念によるユーザロック解除を想定して記載。

```powershell
# ユーザ取得
PS> $user = Get-ADUser -Filter {SamAccountName -eq "ztest01"}

# ユーザロック解除
PS> $user | Unlock-ADAccount

# 新規パスワード設定
PS> $user | Set-ADAccountPassword -NewPassword (ConvertTo-SecureString -AsPlainText "password" -Force)

# 次回ログオン時にパスワード変更を強制
PS> $user | Set-ADUser -ChangePasswordAtLogon $true
```

# おわりに
次回はPowershellでGroup管理を予定。