none
[原創][分享]如何將基於 Windows Server 2008 R2 完整安裝的林根域通過不使用 System State 恢復來實施 Active Directory Disaster Recovery 到不同硬件配置的機器 RRS feed

  • 常规讨论

  • 本文將介紹一種儅基於 Windows Server 2008 R2 完整安裝的域所有 DC 崩潰後,通過之前手動建立的備份(介於 System State 和 ifm 之間的一種備份)在新機器(虛擬機)中恢復域核心功能的一種方法。
    由於實驗環境所致,實驗用環境基於單一林根域(只有一個站點, 沒有子域, 沒有同其他域之間信任關係),但應該對更複雜的域環境有效,至少是有幫助作用。

    1 總體說明

    本文介紹的 Disaster Recovery 方法有兩個點考慮,一是能夠將承載 FSMO 角色的系統還原到新機器上,而不是與崩潰機器硬件配置一致的機器。放置與 DC 機器配置相同的機器可能不是很現實,與其作爲備份,還不如做為額外 DC。
    二是盡可能縮小備份數據的大小,Windows Server 2008 R2 的 System State 備份實在是太大了,不方便備份和存儲。

    基於這兩點,我經過不斷嘗試,終于摸索出一種將 Active Directory 必要備份還原到不同硬件配置的機器上,不會發生 BSOD,能夠啓動 Active Directory,能夠進行後續提升 DC 的必要操作,以完成整個 Active Directory Disaster Recovery 過程。

    重要説明:

    此方法只適用於域所有 DC 均崩潰,且沒有其他方法可用的情況下,才應考慮這個方法。需自擔風險
    用於測試的 Active Directory 的林和域功能級別均為 Windows Server 2003,兩臺 DC01 和 DC02,IP 分別爲 192.168.10.10 和 192.168.10.11,域名 contoso.com。
    虛擬機爲 VMware Player。
     
    2 具體恢復步驟

    2.1 製作備份

    本地或遠程登錄到具有 PDC 角色的 DC 上。依據 Active Directory 最佳實踐的建議,一般將 Schema、 Naming、 PDC, RID Manager 四個 FSMO 角色都由一台 DC 持有。

    為了能夠方便存放備份所需文件,以及保留部分文件的權限設置信息,首先需要建立一個虛擬硬盤文件(VHD)。從方便描述考慮,此處通過 diskpart 創建一個基於 NTFS 文件系統的虛擬硬盤文件。

    在開始菜單的搜索框、運行框,或命令提示符運行 diskpart,並執行以下若干命令

    創建虛擬硬盤文件

    create vdisk file=D:\tmp\dc01.vhd maximum=512 type=expandable

    上述命令中的虛擬硬盤名稱,文件大小,以及是否為動態擴展,除了文件名稱盡量不用中文(方便輸入), 文件大小不建議小於 512 MB (依據實際情況而定)外,並無特別要求。

    attach vdisk

    附加虛擬硬盤

    list disk

    列出已有硬盤,確定虛擬硬盤已經附加了。選中的硬盤所在行最左側有一個半角星號。

    create partition extend
    create partition logical

    創建擴展和邏輯分區,其實也可以創建主分區,只是因為這個硬盤用於存放恢復用文件,並不引導系統,所以選用擴展和邏輯分區。

    list partition

    列分區,確定選中地是新建的分區。選中的分區所在行最左側有一個半角星號。

    format quick fs=ntfs

    格式化分區。

    list volume

    列卷。確定選中地是剛被格式的卷。選中的卷所在行最左側有一個半角星號

    assign

    為選擇的卷指派一個盤符

    list volume

    確定指派的盤符是什麼。

    detach vdisk

    可以去掉附加虛擬硬盤,也先可以不執行此操作,而是立即執行後續操作。

    如果執行了此操作, 則執行 

    exit

    退出 diskpart 實用工具.

    儅創建好 VHD 文件後,就可以創建備份文件了。

    在開始菜單的搜索框,運行框,或命令提示符運行 ntdsutil 實用工具,並執行如下命令:

    進入 snapshot 功能

    snapshot

    啟用默認實例 NTDS

    activate instance ntds

    製作快照

    create

    當快照製作完成後,記住生成的 {GUID} 字符串,後面會用到

    查看所有快照

    list all

    掛載之前創建的快照,可以通過 list all 列出的數字索引或之前生成的 {GUID}

    mount %s

    %s 表示數字索引或 {GUID}

    挂載快照後,不退出 ntdsutil。

    現在就可以開始製作備份了

    先在之前創建的虛擬硬盤創建一個目錄,這裡是 dc01。如果沒有挂載請先挂載。

    現在就可以執行命令備份數據了,假設卷為 F:。

    cd /d F:\dc01

    robocopy C:\$SNAP_????\Windows\NTDS NTDS -copyall -dcopy:t -s -e

    其中 C:\$SNAP_???? 為挂載的快照

    robocopy C:\$SNAP_????\Windows\SYSVOL SYSVOL -copyall -dcopy:t -s -e -xjd

    其中參數 -xjd 排除了交接點。

    如果不是特別熟悉 SYSVOL 兩個交接點的對應關係,可以在備份中放置一個文件 link.txt。

    "C:\Windows\SYSVOL\staging areas\DOMAINDNSNAME" "C:\Windows\SYSVOL\staging\domain"
    "C:\Windows\SYSVOL\sysvol\DOMAINDNSNAME" "C:\Windows\SYSVOL\domain"

    來輔助記憶。

    robocopy C:\$SNAP_????\Windows\sysem32\dns dns -copyall -dcopy:t -s -e
    robocopy C:\$SNAP_????\Windows\sysem32\config config -copyall -dcopy:t -s -e

    到現在主要文件就已經進行了備份。你可以額外執行命令

    dism -online -get-features -format:table > features.txt

    備份當前系統已經啓用的功能列表。

    這時可以卸載虛擬硬盤,並且在 ntdsutil 執行命令

    unmount %s

    卸載快照。至於是否需要刪除快照,依實際需求而定。如果要刪除,則執行

    delete %s

    2.2 新建用於 Disaster Recovery 的虛擬機

    接下來在虛擬機安裝 Windows Server 2008 R2,自然語言版本一致,必須選擇完全安裝,不得是 Server Core,至於具體版本可以與原系統不一樣,但不得低于 Standard。此外在網絡設置方面,虛擬機網段需要與原的系統一致。

    2.3 爲 Disaster Recovery 最後的準備工作

    設置與原來相同的計算機名

    netdom computername . -add:dc01.contoso.com
    netdom computername . -makeprimary:dc01.contoso.com

    確認輸入無誤後,然後重啓系統.

    重啓完成後,執行命令

    netdom computername . -enumerate

    獲得原始名稱,然後用

    netdom computername . -remove:OldName

    刪除原始名稱。

    接下來啓用重建域必須的功能

    dism -online -enable-feature -featurename:DirectoryServices-DomainController -featurename:DNS-Server-Full-Role -featurename:NetFx3

    其實默契情況下隨 AD 安裝的功能,還有 Microsoft-Windows-GroupPolicy-ServiceAdminTools-Update, 但從我的測試看,并啓用該功能并不影響恢復。

    接下來在係統盤建立一個目錄, 比如 C:\tmp

    mkdir C:\tmp

    建立完成後,開始備份該系統的驅動程序名稱列表, 以下爲備份步驟

    cd /d C:\tmp
    mkdir drv_list
    sc query type= driver state= all | find /i "service_name" > tmp.txt
    for /f "tokens=2 delims=:" %n in (tmp.txt) do @echo %n >> drv.txt
    del tmp.txt

    後續會用到這個 drv.txt 文件

    現在可以重啓電腦,并進入到 Windows Server 2008 R2 安裝盤的 Windows PE 環境了。

    2.4 開始進行 Disaster Recovery

    當進入到 "安裝 Windows" 向導窗體時,按 Shift+F10 鍵調出 cmd。

    通過 mountvol 或 diskpart,結合 dir 命令。找出系統所在盤符。

    通常來説,盤符 C: 是隱藏的 100M 啓動盤。經過查找本例的系統盤盤符是 E:

    先更改一下系統環境變量 PATH

    set path=%path%;E:\Windows\system32

    現在進入 E:,并備份原有協調配置目錄 config

    cd /d E:\Windows\system32
    robocopy config config.bak -copy:dat -dcopy:t -s -e

    以防止後續錯誤修改注冊表設置導致恢復失敗。

    確認備份完成後,刪除現有 config 目錄。

    rmdir config /s

    現在挂載存有恢復文件的 VHD 虛擬磁盤。本例該 VHD 文件所在盤符爲 D:

    以下爲挂載命令

    select vdisk file=d:\dc01.vhd
    attach vdisk

    可以

    list volume

    檢查是否存在盤符,如果沒有,則通過

    select volume
    assign

    命令指派盤符。

    本例虛擬硬盤的盤符爲 G:

    最後執行

    exit

    退出 diskpart。

    現在就可以進行恢復操作了。

    首先恢復 NTDS 和 SYSVOL 目錄。

    cd /d E:\Windows
    robocopy G:\dc01\NTDS NTDS -copyall -dcopy:t -s -e
    robocopy G:\dc01\SYSVOL SYSVOL -copyall -dcopy:t -s -e

    因爲 SYSVOL 目錄至少包含兩個目錄交接點,所以還需要創建它們。
    首先執行

    mkdir "C:\Windows\SYSVOL\staging\domain"
    mkdir "C:\Windows\SYSVOL\domain"

    然後

    cd /d "SYSVOL\staging areas"
    mklink /j contoso.com "C:\Windows\SYSVOL\staging\domain"
    cd /d "..\sysvol"
    mklink /j contoso.com "C:\Windows\SYSVOL\domain"

    現在就完成了 NTDS 和 SYSVOL 的恢復。如果對目錄關聯記不清的話,可以參考 G:\dc01\link.txt。

    接著恢復 dns 和 config

    cd /d E:\Windows\system32
    robocopy G:\dc01\dns dns -copyall -dcopy:t -s -e
    rmdir config /s
    robocopy G:\dc01\config config -copyall -dcopy:t -s -e

    因爲 config 目錄非常重要,所以沒有啓用 /q 參數, 需要交互式確認刪除。

    到目前爲止,重要目錄的恢復已經完成。現在開始進行部分注冊表設置的替換操作。

    以下注冊表操作,也可以通過 regedit 進行,使用 reg 命令處於描述方便考慮。

    首先需要替換 SideBySide

    cd /d E:\tmp

    挂載新系統 config.bak 目錄的 SOFTWARE 文件。

    reg load HKLM\soft \Windows\system32\config.bak\SOFTWARE

    備份 SideBySide 組件設置。

    reg export HKLM\soft\Microsoft\Windows\CurrentVersion\SideBySide SideBySide

    備份完成後,卸載。

    reg unload HKLM\soft

    接著挂載原系統的 SOFTWARE

    reg load HKLM\soft \Windows\system32\config\SOFTWARE

    查詢 SideBySide 路徑

    reg query HKLM\soft\Microsoft\Windows\CurrentVersion\SideBySide

    如果能查詢出結果來説明,路徑正確。

    然後按 F8 鍵,或者通過方向鍵調出剛才那個命令,並將 query 替換爲 delete 并執行刪除該項。

    最後導入新系統的 SideBySide

    reg import SideBySide

    替換設置。

    下面一個可選附加操作是刪除原系統用戶配置信息的操作。

    如果不刪除原有用戶配置信息,那麽當系統恢復後,以該用戶登錄,由於導致用戶配置信息中的用戶目錄不存在,而以祇能以 TEMP 賬戶登錄,不能保存更改。

    reg query "HKLM\soft\Microsoft\Windows NT\CurrentVersion\Profilelist" /s /d /f USERNAME | clip

    然後在記事本中粘貼結果,複製要刪除的用戶配置信息。 比如

    reg delete "HKEY_LOCAL_MACHINE\soft\Microsoft\Windows NT\CurrentVersion\Profilelist\SID"

    當此項操作完成後,就可以卸載 soft 項了。

    reg unload HKLM\soft

    先挂載原系統 config 目錄的 SYSTEM 注冊表文件

    reg load HKLM\sys \Windows\system32\config\SYSTEM

    查看系統當前正確配置。

    reg query HKLM\sys\Select /v Current

    記錄下該值的數據,然後卸載。

    reg unload HKLM\sys

    現在挂載之前備份 config.bak 目錄的 SYSTEM 注冊表文件

    挂載前,先爲 SYSEM 建立一個副本。

    cd /d \Windows\system32\config.bak
    copy SYSTEM SYSTEM.bak
    reg load HKLM\sys SYSTEM.bak
    cd /d \tmp

    然後查看系統當前正確配置。

    reg query HKLM\sys\Select /v Current

    這基本上可以肯定是 1,因爲是新安裝的系統。

    如果該值與原系統的不一致,則需要將其更改爲與原系統一致。

    方法爲:

    重命名其他 ControlSet 項,但由於權限緣故,所以需要先更改其權限,在 ControlSet00? 項讓其子項繼承父親項的權限。
    如果 Current 的值與原系統一致,那麽可以考慮不需要更改項的名稱。但因爲我沒有就此進行測試,所以這裡採用保守方法。

    這時就可以通過如下命令導出驅動程序設置了

    這裡假設值爲 2。

    for /f "tokens=1" %n in (drv.txt) do @reg export HKLM\sys\ControlSet002\services\%n .\drv_list\%n

    這樣就完成了驅動程序設置的備份。當然也可以考慮 reg save 命令來保存,但是用 reg export 命令更方便,如果需要修改,可以很方便的進行。

    接著備份 RPC 服務設置。

    reg export HKLM\sys\ControlSet002\services\RpcSs RpcSs

    備份完成後,卸載。

    reg unload HKLM\sys

    現在挂載原系統的 SYSTEM

    reg load HKLM\sys \Windows\system32\config\SYSTEM

    將之前記錄下的 ControlSet 數值代入,如果忘記執行命令

    reg query HKLM\sys\Select /v Current

    獲取。

    先導出一份原系統網絡適配器的配置信息

    reg query HKLM\sys\ControlSet002\services\tcpip\parameters\interfaces /s /d /e /f 192.168.10.10 | clip

    并在記事本中進行複製

    根據返回結果獲得其路徑

    reg export "HKLM\sys\ControlSet002\services\tcpip\parameters\interfaces\{GUID}" int

    現在開始準備刪除,原系統的驅動程序設置。

    首先爲了防止批量刪除因路徑指定錯誤而誤刪,先執行命令

    for /f "tokens=1" %n in (drv.txt) do @reg query HKLM\sys\ControlSet002\services\%n

    如果沒有問題,則按 F8 鍵或方向鍵,將上一條命令中改爲

    for /f "tokens=1" %n in (drv.txt) do @reg delete HKLM\sys\ControlSet002\services\%n /f

    待刪除完成後,再改爲

    for /f "tokens=1" %n in (drv.txt) do @reg import .\drv_list\%n

    現在對於原系統的 RPC 服務設置進行相同操作

    先確認路徑是否無誤

    reg query HKLM\sys\ControlSet002\services\RpcSs

    如果沒有問題,則

    reg delete HKLM\sys\ControlSet002\services\RpcSs

    然後

    reg import RpcSs

    到這裡,就可以卸載注冊表項 HKLM\sys 以及斷開虛擬硬盤,重啓電腦了。

    在重啓完成後,能夠看到登錄界面,並且能按 Ctrl+Shift+Delete 鍵,輸入域管理員用戶名和密碼完成登錄。

    這就説明,恢復已經完成了一大半。現在説明剩餘的恢復步驟

    首先登錄系統後,應該會看到因爲某些設置已改變,系統爲了應用這些更改,必須重啓系統。

    先單擊稍後重啓系統按鈕。

    并關閉 "關閉服務器管理器"

    現在先恢復有線網絡適配器設置

    因爲是非常規恢復系統的, 所以某些功能可能不能執行,比如設置 IP 的 netsh 部分内部命令會報 "RPC 服務器不可用" 錯誤。

    當然你可以嘗試通過控制面板進行設置。

    首先在開始菜單搜索框輸入并啓動 cmd

    然後執行命令

    netsh int ip addr

    查看網絡適配器名稱以及 IP 設置。這時應該可以看到啓用了 DHCP 協議的 "本地連接"。本地連接後可能跟序號

    reg query HKLM\SYSTEM\CurrentControlSet\control\network /s /d /e /f 網絡適配器名稱 | clip

    在記事本複製下其路徑 Connection 左側的那個 GUID。

    接著

    cd /d \tmp
    copy int int.txt
    notepad int.txt

    在 int 文件副本中,把原有 {GUID} 替換爲剛才複製的,

    并將

    sys

    替換爲

    SYSTEM

    ControlSet002

    替換爲

    CurrentControlSet

    最後將整個路徑複製一下。

    reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\tcpip\parameters\interfaces\{GUID}"

    如果可以返回結果,則

    reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\tcpip\parameters\interfaces\{GUID}"
    reg import int.txt

    這樣完成網絡適配器的設置恢復。

    現在就可以重啓機器了。

    待重啓完成後,在 cmd 執行一下命令

    netsh int ip show addr

    確認更改是否成功。

    在等待該機 DNS 服務器初始化完成後,就可以著手下一步操作,恢復 RID Pool。

    如果通過 nslookup 發現 DNS 服務偵聽有問題,那麽可以通過

    netsh int ip set dns "本地連接" static 192.168.10.10 primary

    重新設置一下。

    根據 Active Directory 最佳實踐的建議,RID Manager 角色一般與 PDC 角色在同一臺主機上。

    所以這裡就不做 RID Manager 角色遷移操作,而是直接恢復 RID Pool。

    首先在 cmd 中執行命令

    dsquery * "CN=RID Set,CN=DC01,OU=Domain Controllers,DC=contoso,DC=com" -attr rIDAllocationPool rIDPreviousAllocationPool rIDNextRID -l

    可以看到 rIDPreviousAllocationPool, rIDNextRID 爲 0,將不為 0 的 riDAllocationPool 值記錄下來。

    在開始菜單搜索框輸入 cmd 并以管理員身份運行

    然後在 cmd 執行命令

    dsquery * -filter "objectsid=*" -attr objectsid -limit 0 -l

    記錄下最後一個 SID 的最右側 - 字符的數字,即 RID 。

    這裡假設爲 6315。

    然後執行命令

    powershell

    并複製如下命令

    # Begin
    
    $root = [adsisearcher]'LDAP://RootDSE'
    $root.filter = '(&(isDeleted=TRUE)(Objectsid=*))'
    $root.tombstone = $true
    $objects = $root.findall()
    
    $maxRID = 0
    foreach ($obj in $objects) 
    {
     $arr = $obj.properties.objectsid.item(0)
     $s = new-object system.security.principal.securityidentifier($arr, 0)
     $sid = $s.tostring()
     $rid = [int32]$sid.substring($sid.lastindexof('-') + 1)
     if ($rid -ge $maxRID) {$maxRID = $rid}
    }
    $maxRID
    
    # End

    然後在運行了 powershell 的 cmd 按 Alt, E, P 鍵粘貼命令,并按 Enter 鍵執行。

    將返回的數字同之前記錄的數字,相比取大的,并記錄下來,留作後用。

    假設這裡爲 6295。

    下面開始對之前記錄的 rIDAllocaionPool 值在 powershell 中進行計算

    這裡假設該數值爲

    27058293970601

    [int32](27058293970601 / [math]::pow(2, 32))

    得到的結果爲

    6300

    該值爲 RID Pool 的最高值。

    然後在

    27058293970601 - (6300 * [math]::pow(2, 32))

    得到

    5801

    最低值。

    另外也可以在算出最高值後,通過查詢注冊表

    reg query "HKLM\SYSTEM\CurrentControlSet\services\NTDS\RID Values" /v "RID Block Size"

    其中 0 表示默認值 500,你也可以設置的更大。關於更多信息,可以參見

    Managing RID Issuance
    http://technet.microsoft.com/en-us/library/jj574229.aspx

    所以你可以通過此值算出最低值

    6300 - 500 + 1

    可以看到之前記錄的 RID 值 6315 超過了 5801 ~ 6300 的範圍, 所以需要重新設置 rIDAllocationPool。

    將最低值設置爲 6316, 最高值爲 6815。

    然後通過下面的表達式換算成 rIDAllocationPool

    6316 + 6815 * [math]::pow(2, 32)

    29270202128556

    這時新建一個文本文件 ldf.txt

    編輯如下内容:

    dn:
    changetype: modify
    replace: schemaUpgradeInProgress
    schemaUpgradeInProgress: 1
    -

    dn: CN=Rid Set,CN=DC01,OU=Domain Controllers,DC=contoso,DC=com
    changetype: modify
    replace: rIDAllocationPool
    rIDAllocationPool: 29270202128556
    -

    dn: CN=Rid Set,CN=DC01,OU=Domain Controllers,DC=contoso,DC=com
    changetype: modify
    replace: rIDPreviousAllocationPool
    rIDPreviousAllocationPool: 29270202128556
    -

    dn: CN=Rid Set,CN=RID_MASTER,OU=Domain Controllers,DC=contoso,DC=com
    changetype: modify
    replace: rIDNextRID
    rIDNextRID: 6316
    -

    dn:
    changetype: modify
    replace: schemaUpgradeInProgress
    schemaUpgradeInProgress: 0
    -

    dn:
    changetype: modify
    replace: schemaUpdateNow
    schemaUpdateNow: 1
    -

    文中的 29270202128556, 6316 即爲之前結算得來的值。

    最後以 Schema Admins 組身份執行命令

    ldifde -i -f ldf.txt

    重置 RID Pool。

    當設置完成後,就可以通過重啓機器使得設置生效。但是考慮因爲目前環境祇有一臺 DC,重啓後會有相對較長的 DNS 服務初始化時間。

    Domain Controller boots up slowly when pointing to itself as the only DNS server
    http://support.microsoft.com/kb/945765/en-us

    若發現 SYSVOL 目錄的 domain 目錄存在 NtFrs_PreExisting__See_EventLog,這時候可以參考如下 Microsoft 支持提供的方法進行授權還原

    How to rebuild the SYSVOL tree and its content in a domain
    http://support.microsoft.com/kb/315457/en-us

    恢復完成後,就可以進行角色遷移。當角色遷移完成後,就可以將已經永久離線的 DC 降級。來完成 Active Directory 的 Disaster Recovery。

    2.5 其他相關應用

    最後根據初步測試,也可以使用此方法進行授權還原。這裡大致說一下方法:

    首先通過 nsdsutil 的 snapshot 功能創建快照,複製 NTDS 目錄到一個存儲位置。比如 VHD 文件。
    然後重啓 DC 并通過在啓動過程中按 F8 進入到 DSRM。
    使用備份對 NTDS 目錄進行替換。
    最後通過 ntdsutil 的 Authoritative Restore 功能完成特定對象的授權還原。

    同樣的,使用此方法存在風險,如需採納,需要自行進行充分測試。


    Folding@Home





    • 已编辑 repl 2013年11月23日 8:44 更正獲取原系統 tcpip 設置正確時序
    2013年11月10日 11:11

全部回复

  • 本文也在 WinOS 論壇進行分享:

    http://bbs.winos.cn/viewthread.php?tid=136043&extra=


    Folding@Home

    2013年11月10日 12:41
  • 您好,

    感谢您的分享。


    Jeremy Wu

    TechNet Community Support

    2013年11月10日 19:56
    版主
  • 對備份定製 System State 步驟進行了改進,先在通過 diskpart 和 ntdsutil 分別創建好虛擬磁盤和快照後,就可以通過如下批處理程序進行備份。

    需要説明的是,基於時間因素,我祇是檢查了備份後的日誌文件,並未使用通過批處理的備份進程還原測試。

    以下是批處理

    @echo off
    
    pushd .
    
    echo. 
    echo 获取目标磁盘盘符
    set drv=%1
    if not defined drv (goto notArg)
    
    for /f "tokens=*" %%n in ('echo %1') do (
    	set drv=%%~n
    	set drv=%drv:~0,1%
    )
    
    echo %drv% | findstr /r/c:"[A-Z]" 2> nul 1> nul
    if %errorlevel% neq 0 (goto errData)
    
    echo 使用机器名在目标磁盘创建存放目录
    for /f "tokens=*" %%h in ('hostname') do set folder=%%h
    mkdir "%drv%:\%folder%"
    dir "%drv%:\%folder%" /ad/b 2> nul 1> nul
    if %errorlevel% neq 0 (goto errPath)
    
    echo 切换到该目录
    cd /d "%drv%:\%folder%"
    if %errorlevel% neq 0 (goto errPath)
    
    echo 获取系统磁盘盘符
    set sysdrv=
    set sysdrv=%systemdrive:~0,1%
    if not defined sysdrv (goto notArg)
    echo %sysdrv% | findstr /r/c:"[A-Z]" 2> nul 1> nul
    if %errorlevel% neq 0 (goto errData)
    
    echo 获取通过 ntdsutil 挂载的快照目录
    set snap=
    for /f "tokens=*" %%n in ('dir %sysdrv%:\ /ad/b ^| findstr /r/i/c:"^$SNAP_[0-9]*_VOLUME[A-Z]\$$" 2^> nul') do (
    	set snap=%%n
    )
    if not defined snap (goto errDev)
    
    echo 设置日志文件名
    set logFile=%random%_%random%_%random%_%random%.log
    
    echo.
    echo 系统盘符 %sysdrv%:
    echo 存储目录 %drv%:\%folder%
    echo 快照名   %snap%
    echo 日志文件 %logFile%
    echo.
    
    echo 开始备份
    
    robocopy %sysdrv%:\%snap%\Windows\NTDS NTDS -copyall -dcopy:t -s -e -np  -r:0 -w:0 >> %logFile%
    robocopy %sysdrv%:\%snap%\Windows\SYSVOL SYSVOL -copyall -dcopy:t -xjd -s -e -np  -r:0 -w:0 >> %logFile%
    xcopy /hrk %sysdrv%:\%snap%\Windows\link.txt >> %logFile%
    dism -online -get-features -format:table > features.txt
    attrib features.txt +r >> %logFile%
    robocopy %sysdrv%:\%snap%\Windows\system32\dns dns -copyall -dcopy:t -s -e -np  -r:0 -w:0 >> %logFile%
    robocopy %sysdrv%:\%snap%\Windows\system32\config config -copyall -dcopy:t -s -e -np  -r:0 -w:0 >> %logFile%
    attrib %logFile% +r
    
    echo.
    echo 备份完成,详情请参见日志文件。
    
    goto exit
    
    :notArg
    net helpmsg 87
    echo copyright 2013 repl
    echo 备份定制 System State 
    echo 用法: baksysst bakupdrive
    echo.
    echo		bakupdrive  为备份目标磁盘盘符
    
    popd
    exit /b 87
    
    :errData
    net helpmsg 13
    popd
    exit /b 13
    
    :errPath
    net helpmsg 3
    popd
    exit /b 3
    
    :errDev
    net helpmsg 20
    popd
    exit /b 20
    
    :exit
    net helpmsg 0
    popd
    exit /b 0


    Folding@Home



    • 已编辑 repl 2013年11月22日 9:01 追加 robocopy 的 -r, -w 參數
    2013年11月22日 2:55