Active Directory: FSMO 役割を転送する方法（CLI編)

[1. FSMOとは](#1-FSMOとは)
[2. FSMOの役割の転送](2-FSMOの役割の転送)
    [(1) 構成](#1-構成)
    [(2) 現在の役割の構成の確認](#2-現在の役割の構成の確認)
    [(3) 通常転送](#3-通常転送)
    [(4) 強制転送](#4-強制転送)
# 1. FSMOとは
FSMOはFlexible Single Master Operationの略で、特定の役割を与えられたドメインコントローラは、フォレストもしくはドメインで一台だけで、以下のような役割があります。

| FSMO役割 | 処理内容 |  |
|:-----------|:------------|:------------|
| Schema master| Active Directoryデータベースのスキーマの変更処理 |フォレストに一台 |
Naming Master |	フォレストに対するドメインの追加や削除 | フォレストに一台
RID Master | ユーザーアカウントなどで利用されるSIDの一部である、RID（Relative ID）の生成 |	ドメインに一台
PDC Master | NTドメインのPDCの役割のエミュレーション	| ドメインに一台
Infrastructure Master | グループアカウントにおけるメンバーの割り当て | ドメインに一台
# 2. FSMOの役割の転送
## (1) 構成
以下の構成を前提で説明します。
- ドメイン: example.com
- ドメインコントローラ:
    - dc1.example.com(全てのFSMO役割を持っている）
    - dc2.example.com(役割の転送先）
## (2) 現在の役割の構成の確認
いずれかのドメインコントローラにドメインの管理者ユーザ(Enterprise Admins, schema adminsのメンバー)でログインし、cmd.exeもしくはpowershellから以下のコマンドを実行します。
cmd.exeの場合は管理者モードで実行して下さい。
```shell:
# netdom /query fsmo

スキーマ マスター                dc1.example.com
ドメイン名前付けマスター        dc1.example.com
PDC                         dc1.example.com
RID プール マネージャー        dc1.example.com
インフラストラクチャ マスター    dc1.example.com
コマンドは正しく完了しました。
```
## (3) 通常転送
`ntdsutil`コマンドを実行し役割を転送するドメインコントローラに接続します。

:::note warn
ntdsutilで役割りを転送する場合(`transfer`コマンド使用時）、GUIの確認画面が表示されます。sshでntdsutilを実行する場合GUIの確認画面を抑制しないと、`操作を取り消しました `というメッセージで`transfer`が失敗します。GUIの確認画面を抑制するためには`C:\WINDOWS\system32\ntdsutil.exe:`プロンプトで、`popups off`を実行します。
:::

```ruby:
# ntdsutil
C:\WINDOWS\system32\ntdsutil.exe: popups off　　　　 <- sshでntdsutilを実行する場合にGUIの確認画面を抑制するためにはこのコマンドを実行します。
対話型のポップアップが無効になります
C:\WINDOWS\system32\ntdsutil.exe: roles    <- NTDS の役割所有者トークンの管理モードに変更
fsmo maintenance: connections　　　　　　　　<- 接続モードに変更
server connections: connect to server dc2.example.com　　  <- 役割の転送先ドメインコントローラに接続
dc2.snwltac.com に結合しています...
ローカルでログオンしているユーザーの資格情報を使って dc2.example.com に接続しました。
server connections: quit　　　　<- 接続モードから抜けます
fsmo maintenance:        <- 役割の構成モードのプロンプトに戻ります。
```
`?`で可能なコマンドを表示可能です。
```
fsmo maintenance: ?                                                             
                                                                                
 ?                             - このヘルプを表示します                         
 Connections                   - 特定の AD DC/LDS インスタンスに接続します      
 Help                          - このヘルプを表示します                         
 Quit                          - 前のメニューに戻ります                         
 Seize infrastructure master   - 接続されたサーバーのインフラストラクチャ役割を 
                                 上書きします                                   
 Seize naming master           - 接続されたサーバーの名前付けマスター役割を     
                                 上書きします                                   
 Seize PDC                     - 接続されたサーバーの PDC 役割を上書きします    
 Seize RID master              - 接続されたサーバーの RID 役割を上書きします    
 Seize schema master           - 接続されたサーバーのスキーマ役割を上書きします 
 Select operation target       - サイト、サーバー、ドメイン、役割および名前付け 
                                 コンテキストを選びます                         
 Transfer infrastructure master - 接続されたサーバーをインフラストラクチャ マス 
                                 タにします                                     
 Transfer naming master        - 接続されたサーバーを名前付けマスターにします   
 Transfer PDC                  - 接続されたサーバーを PDC にします              
 Transfer RID master           - 接続されたサーバーを RID マスターにします      
 Transfer schema master        - 接続されたサーバーをスキーマ マスターにします  
```
`transfer schema master`でスキーママスターの役割を転送します。
```sh:
fsmo maintenance: transfer schema master
サーバー "dc2.example.com" は 5 個の役割を認識しています
スキーマ - CN=NTDS Settings,CN=DC2,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=example,DC=com
名前付けマスター - CN=NTDS Settings,CN=DC1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=example,DC=com
PDC - CN=NTDS Settings,CN=DC1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=example,DC=com
RID - CN=NTDS Settings,CN=DC1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=example,DC=com
インフラストラクチャ - CN=NTDS Settings,CN=DC1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=example,DC=com
fsmo maintenance:
```
`スキーマ`だけがDC2になり転送されたことがわかります。
同様に、`naming master`、`PDC`、`RID master`、`infrastructure master`も転送します。順番は特に関係ありません。
終わったら`quit`で終了します。
## (4) 強制転送
FSMO役割を割り当てられているサーバが故障などで動作しない場合、`transfer`での通常転送はできません。
```sh:
fsmo maintenance: transfer schema master
ldap_modify_sW エラー 0x34(52 (利用できません).
Ldap 拡張エラーメッセージ 000020AF: SvcErr: DSID-032108D4, problem 5002 (UNAVAILABLE), data 1722

Win32 エラー 0x20af(要求された FSMO の操作に失敗しました。現在の FSMO の所有者に接続できませんでした。)
)
エラー コードにより、接続、LDAP、または役割の転送エラー
を示すことがあります。
fsmo maintenance: 
```
こういう場合、`transfer`の代わりに、`seize`を使用します。`seize`コマンドの場合も、はじめに通常転送を試行してダメな場合は強制転送します。
例えばこの例では、dc1.example.com が故障で起動しなくなった場合に、`seize`で強制的に役割をdc2.example.com に転送しました。
```sh:
fsmo maintenance: seize PDC   <- PDC役割の強制転送を行います。
強制前に PDC FSMO の安全転送を試みています。    <- Transferを試行します。
ldap_modify_sW エラー 0x34(52 (利用できません).
Ldap 拡張エラーメッセージ 000020AF: SvcErr: DSID-032108D4, problem 5002 (UNAVAILABLE), data 1722

Win32 エラー 0x20af(要求された FSMO の操作に失敗しました。現在の FSMO の所有者に接続できませんでした。)
)
エラー コードにより、接続、LDAP、または役割の転送エラー
を示すことがあります。
PDC FSMO の転送に失敗しました。強制処理 (seize) 中です...　　<- 強制転送を実施します。
サーバー "dc2.example.com" は 5 個の役割を認識しています
スキーマ - CN=NTDS Settings,CN=DC1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=example,DC=com
名前付けマスター - CN=NTDS Settings,CN=DC1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=example,DC=com
PDC - CN=NTDS Settings,CN=DC2,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=example,DC=com
RID - CN=NTDS Settings,CN=DC1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=example,DC=com
インフラストラクチャ - CN=NTDS Settings,CN=DC1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=example,DC=com
fsmo maintenance: 
```
このあと、dc1.example.com　が電源故障で起動しなくなったため電源を交換して正常に起動するようになったとしましょう。この場合FSMO役割はどうなるのでしょうか？通常ドメインコントローラは起動時に他のドメインコントローラと情報を同期するので、更新日時の新しい、dc2.example.comから情報を持ってきて動作します。そのため、FSMOの役割は、dc2.example.comと同じになります。