仮想化した dc を powershell で複製する
TRANSCRIPT
![Page 1: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/1.jpg)
1
ドメインコントローラーの仮想化
![Page 2: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/2.jpg)
2
DC 仮想化のメリット
• スケーラビリティ• 物理 PC がなくても展開可能
• サーバーのロールバック(スナップショット)• 自動展開のしやすさ• パブリックウラウドへの移行
• 仮想 DC を IaaS に展開
![Page 3: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/3.jpg)
3
仮想 DC の展開
• サーバーマネージャーを使用して
• Windows PowerShell を使用して
• VHDファイルを所定の手続きでクローン
いずれの処理もリモートから行える
![Page 4: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/4.jpg)
4
Hyper-V
DC01
①クローン先情報を埋め込む
②エクスポート VHD DC02③インポート
Hyper-V
DCクローンの動作イメージ
![Page 5: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/5.jpg)
5
1. ソース DC で FSMO が起動していないことを確認。起動している場合には他の DC に移動。
2. ソース DC をクローン可能な DC として認可する3. 非互換アプリを調査し CustomDCCloneAllowList.xmlを生成4. 複製先情報を記載した DcCloneConfig.xmlファイルを作成5. ソース DC をシャットダウン6. ソース DC を Export
7. ソースを起動8. Exportしたイメージを新しい仮想マシンとして Import
9. 複製先マシンを起動( DC 間複製が開始される)
仮想 DC のクローン手順
![Page 6: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/6.jpg)
6
$SourceDC = "ITCAMP-DC02"
$DistDC = "ITCAMP-DC03"
$distPDCEmu = "ITCAMP-DC01"
$SourceHyperVHost = "ITCAMP-FS"
$DistHyperVHost = "ITCAMP-FS"
$VMStore = "¥¥$DistHyperVHost¥VMStore"
$ConfirmPreference = "none"
Move-ADDirectoryServerOperationMasterRole -Identity $distPDCEmu -OperationMasterRole PDCEmulator
Get-ADComputer $SourceDC | %{Add-ADGroupMember -Identity "Cloneable Domain Controllers" -Members $_.samAccountName}
Invoke-Command -ComputerName $SourceDC -ScriptBlock { Get-ADDCCloningExcludedApplicationList -GenerateXml -Force }
Invoke-Command -ComputerName $SourceDC -ScriptBlock { `
New-ADDCCloneConfigFile -Static -IPv4Address "192.168.210.52" `
-IPv4DNSResolver "192.168.210.50" `
-IPv4SubnetMask "255.255.255.0" `
-IPv4DefaultGateway "192.168.210.254" `
-CloneComputerName "$Args" `
-SiteName "Default-First-Site-Name" } `
-ArgumentList $DistDC
Stop-VM -ComputerName $SourceHyperVHost -Name $SourceDC
Get-VM -ComputerName $SourceHyperVHost -Name $SourceDC | %{ Export-VM $_ -Path $VMStore}
Start-VM -ComputerName $SourceHyperVHost -Name $SourceDC
$CFG = (Dir "$VMStore¥$SourceDC¥Virtual Machines¥*.xml").FullName
MD ¥¥$DistHyperVHost¥F$¥$DistDC
Import-VM -ComputerName $DistHyperVHost -Path $CFG -GenerateNewId -Copy-VhdDestinationPath F:¥$DistDC
Get-VM -ComputerName $DistHyperVHost -Name $SourceDC |Where-Object {$_.State -EQ "Off"} | Rename-VM -NewName $DistDC
Start-VM -ComputerName $DistHyperVHost -Name $DistDC
DCクローンを自動化するスクリプト例
step1
step2step3
step4
step5step6step7
step8
step9
ITCAMP-FS
DC01 DC02 DC03複製
ここからコマンドを実行
![Page 7: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/7.jpg)
7
Step 1: ソースDCでPDCエミュレーターが動作していないことを確認
PDCエミュレーターがインストールされているDCはクローンできない
$ConfirmPreference = "none"
Move-ADDirectoryServerOperationMasterRole -Identity $distPDCEmu `
-OperationMasterRole PDCEmulator
![Page 8: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/8.jpg)
8
Step 2: ソースDCをクローン可能なDCに設定する
Get-ADComputer $SourceDC | %{Add-ADGroupMember `
-Identity "Cloneable Domain Controllers" -Members $_.samAccountName}
複製元となるドメインコントローラーを CloneableDomain Controllers のメ
ンバーにする
![Page 9: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/9.jpg)
9
Step3.非互換アプリを調査し CustomDCCloneAllowList.xmlを生成
コマンドレットを実行することで、C:¥Windows¥NTDS¥CustomDCCloneAllowList.xml ファイルが作成される
Invoke-Command -ComputerName $SourceDC -ScriptBlock { Get-
ADDCCloningExcludedApplicationList -GenerateXml -Force }
<AllowList>
<Allow>
<Name>Active Directory Management Pack Helper
Object</Name>
<Type>Program</Type>
</Allow>
<Allow>
<Name>System Center Operations Manager 2012
Agent</Name>
<Type>Program</Type>
</Allow>
<Allow>
<Name>Microsoft Silverlight</Name>
<Type>WoW64Program</Type>
</Allow>
<Allow>
<Name>AdtAgent</Name>
<Type>Service</Type>
</Allow>
<Allow>
<Name>HealthService</Name>
<Type>Service</Type>
</Allow>
<Allow>
<Name>QWAVE</Name>
<Type>Service</Type>
</Allow>
<Allow>
<Name>System Center Management APM</Name>
<Type>Service</Type>
</Allow>
<Allow>
<Name>wlidsvc</Name>
<Type>Service</Type>
</Allow>
</AllowList>
![Page 10: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/10.jpg)
10
Step4.複製先情報を記載した DcCloneConfig.xmlファイルを作成
Invoke-Command -ComputerName $SourceDC -ScriptBlock { `
New-ADDCCloneConfigFile -Static -IPv4Address "192.168.210.52" `
-IPv4DNSResolver "192.168.210.50" `
-IPv4SubnetMask "255.255.255.0" `
-IPv4DefaultGateway "192.168.210.254" `
-CloneComputerName "$Args" `
-SiteName "Default-First-Site-Name" } `
-ArgumentList $DistDC
すでに作成されていると上書きでいないので注意
![Page 11: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/11.jpg)
11
DcCloneConfig.xml の例
<?xml version="1.0"?>
<d3c:DCCloneConfig
xmlns:d3c="uri:microsoft.com:schemas:DCCloneConfig">
<ComputerName>ITCAMP-DC03</ComputerName>
<SiteName>Default-First-Site-Name</SiteName>
<IPSettings>
<IPv4Settings>
<StaticSettings>
<Address>192.168.210.52</Address>
<SubnetMask>255.255.255.0</SubnetMask>
<DefaultGateway></DefaultGateway>
<DNSResolver>192.168.210.50</DNSResolver>
<DNSResolver>192.168.210.51</DNSResolver>
<DNSResolver></DNSResolver>
<DNSResolver></DNSResolver>
<PreferredWINSServer></PreferredWINSServer>
<AlternateWINSServer></AlternateWINSServer>
</StaticSettings>
</IPv4Settings>
<IPv6Settings>
<StaticSettings>
<DNSResolver></DNSResolver>
<DNSResolver></DNSResolver>
<DNSResolver></DNSResolver>
<DNSResolver></DNSResolver>
</StaticSettings>
</IPv6Settings>
</IPSettings>
</d3c:DCCloneConfig
![Page 12: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/12.jpg)
12
Step 5:ソース DC をシャットダウン
Stop-VM -ComputerName $SourceHyperVHost -Name $SourceDC
![Page 13: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/13.jpg)
13
Step 6:ソース DC を Export
Get-VM -ComputerName $SourceHyperVHost `
-Name $SourceDC | %{ Export-VM $_ -Path $VMStore}
![Page 14: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/14.jpg)
14
Start-VM -ComputerName $SourceHyperVHost -Name $SourceDC
Step7. ソースDCを起動
複製先のDCは複製元DCと複製を開始するので、事前に起動しておく必要がある。
![Page 15: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/15.jpg)
15
Step 8: Exportしたイメージを新しい仮想マシンとして Import
$CFG = (Dir "$VMStore¥$SourceDC¥Virtual Machines¥*.xml").FullName
MD ¥¥$DistHyperVHost¥F$¥$DistDC
Import-VM -ComputerName $DistHyperVHost `
-Path $CFG -GenerateNewId -Copy -VhdDestinationPath F:¥$DistDC
重要!!インプレースインポートはできない!重要!!インプレースインポートはできない!
![Page 16: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/16.jpg)
16
Step9.複製先マシンを起動
![Page 17: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/17.jpg)
17
仮想 DC 展開の留意点
• 単一障害点にならないこと 少なくとも2台のHyper-V サーバーに1台づつ展開
1つのハードウェアの障害が複数のDCに影響を与えないようにすること できるだけ物理的に異なるリージョンに配置すること 可能であれば、少なくとも1台は物理 DC を構築しておくこと
Hyper-V
V-DC V-DC
Hyper-V
V-DC
Hyper-V
V-DC
![Page 18: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/18.jpg)
18
• セキュリティ上の考慮点• できるだけ DC のみの単一機能のサーバーとし、ホスト、ゲストともに
Server Core を採用すること
• 必要に応じて RODC を検討すること• VHDファイルの安全性に考慮すること
• VHDファイルが含まれるドライブごと暗号化することをお勧め
Hyper-V(Server Core)
V-DC(Server Core)
![Page 19: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/19.jpg)
19
![Page 20: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/20.jpg)
20
![Page 21: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/21.jpg)
21
![Page 22: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/22.jpg)
22
![Page 23: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/23.jpg)
23
• セキュリティ上の考慮点(つづき)• ホストコンピューターは死守すること
• 可能であればホストコンピューターは管理用ネットワークのみと通信を行うように設定されていること
• ホストコンピューターはゲストであるDCのドメインに所属させない
Hyper-V(domain member)
V-DC V-DC
DC からスタートアップスクリプトを送り込む
1
2
3Sysvol 共有にアタック
![Page 24: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/24.jpg)
24
Measurement Test Physical Virtual Delta
Searches/sec Search for common name in base scope (L1) 11508 10276 -10.71%
Searches/sec Search for a set of attributes in base scope (L2) 10123 9005 -11.04%
Searches/sec Search for all attributes in base scope (L3) 1284 1242 -3.27%
Searches/sec Search for common name in subtree scope (L6) 8613 7904 -8.23%
Successful binds/sec Perform fast binds (B1) 1438 1374 -4.45%
Successful binds/sec Perform simple binds (B2) 611 550 -9.98%
Successful binds/sec Use NTLM to perform binds (B5) 1068 1056 -1.12%
Writes/sec Write multiple attributes (W2) 6467 5885 -9.00%
• パフォーマンスの考慮点
• Windows Server 2008 の場合約10%の性能減
Adtest.exe 使用 http://www.microsoft.com/en-us/download/details.aspx?id=15275
![Page 25: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/25.jpg)
25
• 展開に関する考慮点
• 差分ディスクは使わないこと
実使用領域
未使用領域
固定
可変
元の領域差分差分
差分
差分
指定領域に達するまで自動拡張
![Page 26: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/26.jpg)
26
• 展開に関する考慮点(続き)
• VHDファイルを”単純複製”しないこと
• SID の重複
(..かといって ドメインコントローラーでの Sysprep は未サポート)
• USN(Update Sequence Number)ロールバック問題
• 起動しているドメインコントローラーを Export しないこと
詳細:http://technet.microsoft.com/en-us/library/
virtual_active_directory_domain_controller_virtualization_hyperv(v=ws.10).aspx
![Page 27: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/27.jpg)
27
重要な 4 つの ID
• USN(Update Sequence Number)• オブジェクトが追加、変更、削除されるたびに+1• ドメインコントローラー個々に管理されている
• RID (Relative Identifier)• DC 内オブジェクトの通番.• SID の構成要素• RID Master の RID Pool によって集中管理されている
• Invocation(発動,召喚) ID• DIT のバージョン管理に使用される• Get-ADDomainController で参照可能
• GUID(Globally Unique IDentifier)• サーバー内オブジェクトのID• 恒久的
![Page 28: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/28.jpg)
28
USN とは• Update Sequence Number• オブジェクトを変更、作成、するごとに +1 • ドメインコントローラーごとに管理されている• ドメインコントローラー間でどこまで複製が完了したかを確認するための番号• ドメインコントローラーに変更が加えられるたびに加算される
DC1 DC2
USN_DC2 = 100 USN_DC1 = 200
My USN=200 My USN=100複製
DIT DITDC1からはUSN=200まで複製完了したということ
HighWatermark
![Page 29: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/29.jpg)
29
複製の基本動作:High Watermark をベースにした差分複製
DC1 DC2
USN_DC1 = 200My USN=200
DIT DIT
複製リクエスト
複製無し
DC1 DC2
USN_DC1 = 200My USN=250
DIT DIT
複製リクエスト
USN=201~250
ユーザー追加50人
250
HWM
![Page 30: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/30.jpg)
30
USN ロールバック問題
DC1 DC2
USN_DC1 = 250My USN=250
DIT DIT
DC1
My USN=200
DIT
DC2
USN_DC1 = 250
DIT
複製リクエスト
複製無し
なんらかの原因でロールバック
![Page 31: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/31.jpg)
31
DC1
My USN=250
DIT
DC2
USN_DC1 = 250
DIT
複製リクエスト
複製無し
ユーザー追加50人
DC1
My USN=260
DIT
DC2
USN_DC1 = 250
DIT
複製リクエスト
USN=251~260
ユーザー追加10人
260
![Page 32: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/32.jpg)
32
USN ロールバックの検知
• 「USN がロールバック」だけが発生すると、複製は停止する• Windows Server Backup から古い DIT をリストアした場合• 古い VHD ファイルをリストアした場合• 古い Export ファイルをインポートした場合
Event ID 2103:Active Directory データベースがサポートされていない方法で復元されました。Active Directory はこの状態が継続している間、ユーザーのログオンを処理できません。
![Page 33: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/33.jpg)
33
Invocation ID
• Invocation ID:ディレクトリデータベース(NTDS.DIT)のID• DITのバージョン識別子として扱われる
DITInvocation ID
![Page 34: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/34.jpg)
34
USN ロールバック問題を回避するにはInvocation ID をリセット(変更)する必要がある
USN = 1000InvocationID = A
DC1 が把握している DC1(自分自身)の状態
DC2 が把握しているDC1 の状態
DC1(A)@USN1000
USN = 500InvocationID = B
DC1(A)@USN1000DC1(B)@USN500
頭から複製
USN = 600InvocationID = B
DIT変更(USN変更)
DC1(A)@USN1000DC1(B)@USN600
差分複製
USNロールバック
![Page 35: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/35.jpg)
35
旧バージョンでのスナップショットによるUSNロールバック
TIME: T2
TIME: T4
Create
Snapshot
T1 Snapshot
Applied!
USN: 100
+150 more users created
DC2 receives updates: USNs >200
USN: 200
ID: A RID Pool: 600- 1000
+100 users added
DC2 receives updates: USNs >100
• USN rollback はDC2に反映されない→50ユーザーが複製されてしまう
• All others are either on one or the other DC
• 100 ユーザー(RID = 500 - 599)は SID競合
スナップショットをリストアした場合にはロールバックが検知されない
![Page 36: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/36.jpg)
36
Windows Server 2012 では
Hyper-V ホストで VM-Generation ID を管理している
• ユニークな 128 ビットの ID
• 専用ドライバーによりゲストOSに通知できるようになっている
WS 2012 仮想 DC は VM-Generation ID をトラックする
• Active Directory database (DIT) に保存
• DIT への変更をコミットする前に、
• “DIT内部の VM-Generation ID” と “ホストが認識している VM-Generation ID” を比較
• 異なれば DCの invocation ID と RID pool をリセットしてから、コミット
同じ操作を、起動時に実行する
![Page 37: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/37.jpg)
37
仮想 Domain Controller
Invocation ID
VM-Gen ID
DIT
Hyper-V ホスト
VM-Gen ID
比較
![Page 38: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/38.jpg)
38
Windows Server 2012 ではこうなっている
Tim
eli
ne o
f even
ts
TIME: T2
TIME: T3
TIME: T4
Create
Snapshot
T1 Snapshot
Applied!
USN: 100
ID: A savedVMGID: G1
USN: 100
ID: A
USN: 101-250
ID: B
+150 users created: VM generation ID の差異が発生
DC1(A)@USN = 200
USN: 200
ID: A
+100 users added
DC2 receives updates: USNs >100
DC
1
DC
2
TIME: T1VMGID: G1
savedVMGID: G1 VMGID: G1
savedVMGID: G1 VMGID: G2
savedVMGID: G2 VMGID: G2
DC2 again accepts updates: USNs >100
USN re-use avoided and USN rollback PREVENTED : all 250 users converge correctly across both DCs
DC1(A)@USN = 200
DC1(B)@USN = 250
… missing users replicate
back to DC1
![Page 39: 仮想化した DC を PowerShell で複製する](https://reader035.vdocuments.site/reader035/viewer/2022081718/556608a4d8b42a06318b4654/html5/thumbnails/39.jpg)
39
結局のところ...
以下の用途には使えないので注意「作成したユーザーを削除したい」「変更したユーザーの属性を元に戻したい」
• Authoritative Restore を使用しましょう• または Forefront Identity Manager を使用し、メタデータで管理しましょう
消してしまったユーザーを復元するには「ゴミ箱」を使いましょう