System.DirectoryServices.ActiveDirectoryでレプリケーションを実行

 
先日、ある用事があって韓国に行ってきました。
韓国のIT事情を知りたいと思い、韓国最大の電気街である、
龍山(Yongsan)という街をのぞいてみました。
そこでは、秋葉原のように小さなお店がぎっしりと埋まっていて
賑わっていたのですが、商品説明などのPOPがすべてハングル文字!
ハングルのわからない私にとって、何を売っているのか、さっぱりわかりません。
おまけに道に迷ってしまい、途方に暮れていると
屋台のお兄さんが日本語で道案内をしてくれました。
同じく欧米人っぽい人も道に迷っていて、その人には英語で道案内をしていました。
韓国のサービス業に携わる人は自国語(ハングル)、日本語、英語と
いくつもの言語を操る人が多く、とても感銘を受けました。
 
私など、英語どころか、プログラム言語もおぼつかない感じです。
でも、PowerShellなら!
ということで、今日はPowerShellを使って、
Active Directoryのレプリケーションを行ってみたいと思います。
(おいおい、前置き長いよ!)
 
 
Windows Server 2008 R2からActive Directory管理のための
PowerShellモジュールがサポートされ、ユーザー作成やグループ作成などの
Active Directoryオブジェクト管理が非常に便利になった、という話は
色々なところで見聞きされていると思いますし、実際に試した・使っている、
という方もいるかと思います。
 
しかし、ドメインコントローラー間のレプリケーションなど、
サポートされていない一部の操作があります。
そこで、ここでは.NET Framework 2.0からサポートされている名前空間
System.DirectoryServices.ActiveDirectoryを使って、
Active Directory用PowerShellモジュールではできない操作を補ってみたいと思います。
 
■Step1
ドメインコントローラー名の取得とアセンブリのロード
.NETの名前空間をPowerShellで利用するときは、アセンブリのロードをしなければなりません。
[名前空間名.クラス名]::を使えば、アセンブリのロードができますから、
これを利用して、ドメインコントローラー名の取得を行います。
 

PS C:> $oDom=[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
PS C:> $oDom.DomainControllers
 
この2行を実行した結果がこちら。
 
GetCurrentDomain()で得られる情報については、
The PowerShell Guyの中でも紹介されていますので、
参考にしてみてください。
・AD Infrastructure management with PowerShell
 
■Step2
レプリケーションを実行するドメインコントローラー名の指定
Step1でドメイン内のドメインコントローラーを既に取得しましたので、
その中から、実際にレプリケーションを行うドメインコントローラーを指定します。
色々やり方はあるでしょうが、ここでは、こんなやり方で。
 

PS C:> $oDC=$oDom.DomainControllers | Where-Object {$_.name -like “dc01.example.com“}
※ 赤字部分のドメインコントローラー名は環境に合わせて変えてください。 
 
これで、DC01というドメインコントローラーを指定することができました。
ここでは、次のステップのために$oDCという変数に格納しておきます。
 
■Step3
レプリケーションの実行
レプリケーションの実行には、実行するディレクトリパーティションを指定しなければなりません。
ここで、Step2で指定したドメインコントローラーのところで、Get-Memberコマンドレットを実行してみると、
 
 
 
ちょっと見にくくて申し訳ないのですが、
よく見ると、「TriggerSyncReplicaFromNeighbors」というメソッドがあるのがわかります。
これこそがActive Directoryのレプリケーションを実行するためのメソッドなのです。
これをディレクトリパーティションごとに実行するときは、次のようになります。
 

PS C:> $oDC.Partitions | foreach {$oDC.TriggerSyncReplicaFromNeighbors($_)}
 
 
ここまでのステップをまとめて、スクリプトにするときはこんな感じ。
 

PS C:> $dcName= “dc01.example.com
PS C:> $oDom=[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
PS C:>  $oDC=$oDom.DomainControllers | Where-Object {$_.name -like $dcName}
PS C:> $oDC.Partitions | foreach {$oDC.TriggerSyncReplicaFromNeighbors($_)}
 
 
そのほか、System.DirectoryServices.ActiveDirectory名前空間を利用した、
Active Directoryの管理についてはスキーマ管理や信頼関係の管理など、色々あります。
MSサイトにある、クラスライブラリを参考にご自身で色々と試してみるとよいと思います。
そのほか、ソフトバンククリエイティブさんから出版されている書籍
「PowerShellによるWindowsサーバ管理術」に有益なスクリプトをいくつか掲載しておきました。
ご興味のある方は書店で手に取って見てもらえれば、と思います。