none
[分享]幾個關於 WDS 遠程部署的方法 RRS feed

  • 常规讨论

  • 以下分享幾個 WDS 遠程部署的方法

    1. 在 Windows XP GUI 圖形安裝程序中禁用按 Shift+F10 鍵調出 cmd

    因爲此操作調出的 cmd 是以 SYSTEM 賬戶運行,所以在遠程安裝 Windows XP 時,未經授權的人員可能會利用此功能,進行一些不期望的操作。
    即便 Windows XP 在 4 月 8 日就會停止擴展支持,但考慮到由於種種原因依然存在實際環境中部署 Windows XP 客戶端執行某種任務,所以下面這個方法還是在安全方面有所裨益。

    對於從 Windows Vista 開始的系統可以直接按照如下 Microsoft 幫助介紹的方法,禁用此功能。

    How to disable the command prompt during the Windows Vista Enterprise installation process
    http://support.microsoft.com/kb/929839

    a. 設置分爲域控部分和客戶端部分,首先開始介紹域控部分的設置。
       此文中將域假設爲 contoso.com

    b. 首先在域中添加一個用於後續用於自動加入域,以及其他自動化任務的賬戶。這裡假設該賬戶名稱爲 helper。
       並在默認或指定組織單位(OU)中,按照如下 Microsoft 支持的説明, 爲這個賬戶委派如下權限

       Error message when non-administrator users who have been delegated control try to join computers to a Windows Server 2003-based or a Windows Server 2008-based domain controller- -Access is denied
       http://support.microsoft.com/kb/932455

       并參考如下 Microsoft 支持,增加該用戶可以將機器加域的次數。

       Default limit to number of workstations a user can join to the domain
       http://support.microsoft.com/kb/243327

    c. 通過 GPMC 在默認或指定組織單位(OU)中,的開機脚本新增一個 vbs 脚本,此處假設名稱爲 enable_cmd.vbs

    代碼如下

    dim shell, arg, rc, fso
    
    set shell = createobject("wscript.shell")
    set fso = createobject("scripting.filesystemobject")
    arg = "C:\Windows\tmp\do_enable_cmd.vbs"
    if (fso.fileexists(arg)) then
     rc = 0
     rc = shell.run(arg, 0, true)
     arg = "xcmd /c '\\contoso.com\sysvol\contoso.com\Policies\{GUID}\Machine\Scripts\Startup\update_locadm_group.bat'"
     arg = replace(arg, "'", chr(34))
     rc = 0 
     rc = shell.run(arg, 0, false)
    end if

    代碼如上

       上述代碼中,關於替換半角雙引號的方法,之所以使用函數進行,是個人覺得便於閲讀,你也可以改爲自己習慣的方法。
       並將此脚本的順序設置爲第一位。
       如果啓動脚本還有其他 .bat 或 .cmd 的脚本,同時這些脚本可以重複執行,那麽可以依據其重要性,將其參照上述代碼加入到 vbs 脚本中。
       這樣做是因爲從測試看部分依賴 cmd 的脚本會在 cmd 沒有恢復之前便執行,所以建議在 enable_cmd.vbs 執行一次。
       從穩妥起見考慮,可以通過分析 \Windows\tmp\xcmd.log 文件來判斷是否有執行失敗的脚本,後面有關於 xcmd.log 文件的説明。
       另外由於該代碼在執行重新啓用 cmd 功能的代碼時,使用了等待命令執行完成再執行後續命令,所以不會導致脚本内在 cmd 尚未重新啓用,就執行與 cmd 相關命令的發生。
       因爲此脚本的作用是調用 Windows XP 本地的一個脚本,本身不涉及敏感信息,所以不需要考慮它在 SYSVOL 的權限設置。
       至於本地的那個脚本,配置爲祇有 Administrators 組和 SYSTEM 可以訪問就行了。

    到這裡,域控部分的設置就完成了。

    下面開始客戶端的設置。
     
    a. 先按照正常安裝方法在一臺參考計算機安裝 Windows XP。
    b. 安裝所有必要的軟件。
    c. 然後通過 sysprep 封裝系統。計算機名需要設置爲隨機。 參數需要包括加入域的部分。
    d. 通過 Windows 7 AIK 的 Windows PE 捕獲該系統的 WIM。
       如果需要本地自動部署,則需要通過 imagex /capture 并必須添加 /flags 參數指定 EDITION 捕獲該系統的 WIM。
       如果不這樣設置, 則在後續安裝過程中 Windows PE 無法識別該鏡像導致安裝失敗。
       不過即便是沒有使用 flags 參數,也有方法能夠實現本地自動安裝。此方法將在後面予以介紹。
       至於建立映像的具體方法和步驟,請參見有關 Windows 7 AIK 和其他相關文檔,這裡不在説明。
    e. 現在通過 imagex 或 dism 將捕獲的 wim 解開,這裡假設其 mount 目錄爲 \tmp\mount
    f. 接著進入這個目錄開始對進行必要的設置

    REM 爲了方便描述,以下步驟直接用命令進行展示。
    REM 部分命令作用會加以説明

    REM .\mount 表示當前路徑下的子目錄 mount
    cd /d .\mount\windows\system32

    copy cmd.exe xcmd.exe

    cd config

    reg load HKLM\soft SOFTWARE

    REM 確認注冊表路徑是否正確,當然如果覺得此命令以及下面幾條命令比較繁瑣,你也可以通過 regedit 進行
    reg query "HKLM\soft\Microsoft\Windows NT\CurrentVersion\Image File Execution Options"

    REM 確認無誤後添加 cmd 的 Debugger
    REM 此修改同時也將每次調用 cmd 的命令行參數記錄到系統臨時文件夾 TEMP 的 xcmd.log 文件裏
    reg add "HKLM\soft\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cmd.exe" /v Debugger /t REG_SZ /d "xcmd /c @echo %date% %time% %* >> C:\Windows\tmp\xcmd.log"

    reg unload HKLM\soft

    REM 返回到 Windows
    cd ..
    cd ..

    mkdir tmp
    cacls tmp /g administrators:f system:f
    cd .\tmp

    REM 這個目錄放置實際用來恢復 cmd 的 vbs 文件
    REM 同時這個目錄祇能由 Administrators 組和 SYSTEM 訪問

    REM 這裡假設脚本名爲 do_enable_cmd.vbs

    echo. > do_enable_cmd.vbs

    代碼如下

    dim shell, arg, rc
    set shell = createobject("wscript.shell")
    arg = ""
    rc = 0
    arg = "xcmd.exe /c (xcmd /c set | find '__PROCESS_HISTORY=%WINDIR%\system32\setup.exe' 2> nul 1> nul) || (reg delete 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cmd.exe' /f)"
    arg = replace(arg, "'", chr(34))
    rc = shell.run(arg, 0, false)

    代碼如上

    如果發現有第三方安全軟件會阻止脚本恢復 cmd,那麽可以考慮預先重命名安全軟件服務或驅動的相關文件,或者臨時禁用其服務或驅動的啓動設置,亦或者延緩其安裝。

    REM 然後進入到 mount\sysprep
    cd ..
    cd ..
    cd sysprep

    REM 打開 sysprep.inf
    notepad sysprep.inf

    REM 在 [Identification] 一節中添加計算機默認加入的指定組織單位(OU), 以便于應用 GPO。這裡假設爲 Default Computers
    REM 如果有默認的組織單位,則可以不添加此項。
     
    MachineObjectOU="OU=Default Computers,DC=contoso,DC=com"

    至於其他部分應該在之前已經通過 setupmgr 完成.

    現在已經完成了 Windows XP 映像文件的修改。

    接下來開始修改用於引導系統和釋放系統的 boot.wim。

    a. 可以直接使用 x86 的 bootwim 來安裝 x86 和 x64 系統。這裡選用 Windows 7 安裝源的 boot.wim 。
    b. 對於遠程安裝需要為 boot.wim 映像文件添加網絡適配器驅動。
    c. 照例對 boot.wim 解開,mount 目錄與前面相同同樣是 \tmp\mount

    REM 爲了方便描述,以下步驟直接用命令進行展示。
    REM 部分命令作用會加以説明

    cd /d \tmp\mount
    cd Windows

    REM 依據 KB929839 的方法,禁用 boot.wim 裏 setup.exe 調出 cmd 的功能
    mkdir setup\scripts
    echo. > setup\scripts\DisableCMDRequest.TAG

    mkdir tmp
    cd tmp
    cacls tmp /g administrators:f system:f

    REM 在這個目錄放置 unattend 文件以及需要用到的脚本文件

    下面是 unattend.xml 文件,用於在基於 Windows 7 的 Windows PE 映像 boot.wim 執行安裝界面自動化,分區,格式化,下載部署 Windows XP 用 wim 文件,將系統從 wim 釋放到指定分區的一系列操作。

    echo. > unattend.xml

    以下爲 unattend.xml 文件示例

    <?xml version="1.0" ?> 
    <unattend xmlns="urn:schemas-microsoft-com:unattend">
       <settings pass="windowsPE">
          <component name="Microsoft-Windows-Setup" publicKeyToken="31bf3856ad364e35" 
    language="neutral" versionScope="nonSxS" processorArchitecture="x86">
             <WindowsDeploymentServices>
                <Login>
                   <WillShowUI>OnError</WillShowUI>
                   <Credentials>
                         <Username>helper</Username>
                         <Domain>contoso.com</Domain>
                         <Password>PASSWORD</Password>
                      </Credentials>
                   </Login>
                <ImageSelection>
                   <WillShowUI>Never</WillShowUI>
                   <InstallImage>
                      <ImageName>XP-TEMP</ImageName>
                      <ImageGroup>XP-GROUP</ImageGroup>
                      <Filename>Install.wim</Filename>
                   </InstallImage>
                      <InstallTo>
                      <DiskID>0</DiskID>
                      <PartitionID>1</PartitionID>
                   </InstallTo>
                </ImageSelection>
             </WindowsDeploymentServices>
             <DiskConfiguration>
                <WillShowUI>OnError</WillShowUI>
                   <Disk>
                      <DiskID>0</DiskID>
                      <WillWipeDisk>true</WillWipeDisk>
      <CreatePartitions>
      <CreatePartition> 
                 <Order>1</Order>
                 <Type>Primary</Type>
                 <Size>12284</Size>
              </CreatePartition>
      </CreatePartitions>
                      <ModifyPartitions>
                         <ModifyPartition>
                            <Order>1</Order>
                            <PartitionID>1</PartitionID>
                            <Letter>C</Letter>
                            <Label>Windows</Label>
                            <Format>NTFS</Format>
                            <Active>true</Active>
                            <Extend>false</Extend>
                         </ModifyPartition>
                      </ModifyPartitions>
                </Disk>
             </DiskConfiguration>
          </component>
       </settings>
    </unattend>

    以上爲 unattend.xml 文件示例

    cd ..
    cd system32

    REM 新建 ini 文件 Winpeshl.ini
    echo. > Winpeshl.ini

    内容如下

    [LaunchApps]
    %WINDIR%\system32\loader.bat

    内容如上

    REM 接著新建批處理脚本 loader.bat

    echo. > loader.bat

    代碼如下

    @echo off
    %SYSTEMDRIVE%\sources\setup.exe -unattend:%WINDIR%\tmp\unattend.xml

    代碼如上

    到這裡客戶端設置的大部分就完成了,至於清理臨時文件的方法,可以自行編寫,也可以參考自動重命名機器名的方法。

    記得 unmount/commit 保存修改到映像文件裏。

    如果是自動化本地安裝 Windows XP, 由於安裝程序會在釋放完系統後通過消息框錯誤提示 “Windows 安裝出現錯誤, 請驗證安裝源是否可訪問,并重新啓動安裝。”當通過遠程部署,則不會出現此錯誤。
    雖然可以單擊該提示重啓進入下一個步驟,但是因爲需要人去交互處理,所以會影響自動安裝繼續進行。
    要避免這個問題,可以採用下面這個方法,通過自定義釋放系統的脚本,來繞過這個問題。

    a. 處於直接使用 dism 進行操作的考慮,需要使用 Windows 8.1 安裝源的 boot.wim 。雖然用 Windows 8.1 系統來安裝 Windows XP 感覺上有些怪異。
       當然也可以通過 Windows 7 安裝源的 boot.wim 進行,不過需要放置 imagex。
    b. 替換 loader.bat 裏面的代碼

    2. 自製 Windows 安裝第一階段的脚本

    代碼如下

    @echo off
    
    set OS_VER=Windows XP
    
    title 自制 %OS_VER% 安装
    
    echo 开始第一阶段
    echo.
    echo 开始分区和格式化
    diskpart -s %WINDIR%\tmp\disk1 > nul
    echo 创建安装源目录
    mkdir C:\sources > nul
    echo 复制映像文件
    REM 這段代碼處理的較爲簡單,如果希望能夠精準找到 boot.wim 所在盤符,可以考慮使用 diskpart。
    dir D: 2> nul 1> nul
    if %errorlevel% equ 0 (
     robocopy D:\sources C:\sources install.wim -copy:dat -ndl -njh -njs
    )
    dir E: 2> nul 1> nul
    if %errorlevel% equ 0 (
     robocopy E:\sources C:\sources install.wim -copy:dat -ndl -njh -njs
    )
    echo 开始释放系统
    dism -apply-image -imagefile:C:\sources\install.wim -index:1 -applydir:C:\
    echo 清理临时文件
    rmdir C:\sources /s/q
    echo 第一阶段操作完成
    echo.
    echo 重新启动计算机,开始第二阶段安装。
    echo 按任意键立即重新启动
    timeout -t 10
    wpeutil reboot

    代碼如上

    c. 在 tmp 目錄放置一個 disk1 文件

    echo. > .\mount\windows\tmp\disk1

    代碼如下

    select disk 0
    clean
    create partition primary size=12286
    format quick fs=ntfs label="Windows"
    assign letter=c
    active
    exit

    代碼如上

    下面分享本文最後一個脚本

    3. 自動按照一定規則對機器名重命名

    此方法需要在 Windows XP 的安裝映像放置脚本文件。

    a. 放置目錄爲了便於説明,依舊爲該系統的 \Windows\tmp
    b. 脚本 create_firstbat_NT5x.bat 用於在本地以特定用戶身份創建并執行任務計劃,隨帶清理一下臨時目錄或臨時文件。

    代碼如下

    @echo off
    
    schtasks -delete -tn firstbat_NT5x -f
    schtasks -create -tn firstbat_NT5x -tr %WINDIR%\tmp\firstbat_NT5x.bat -sc onstart -ru contoso\helper -rp PASSWORD
    schtasks -run -tn firstbat_NT5x
    REM 使用 boot.wim 於本地通過 setup 安裝遺留的臨時目錄
    rmdir %SYSTEMDRIVE%\$WINDOWS.~BT /s/q
    rmdir %SYSTEMDRIVE%\$WINDOWS.~LS /s/q
    del %SYSTEMDRIVE%\WinPEpge.sys /a/f/q
    del "%0" /a/f/q

    代碼如上

    調用方法:在指定組織單位(OU) 的啓動脚本,建立一個脚本來調用  create_firstbat_NT5x.bat。
    執行此脚本之前需要先通過 net user + 批處理或者 GPO 的限制組將要執行任務計劃的用戶設置添加到本地 Administrators 組。
    但切忌不要直接在域控中直接將該用戶添加到管理員組,那樣相當於賦予其 Domain Admins 組權限。

    被調用的 firstbat_NT5x.bat 代碼,功能包含:
      依據指定規則對計算機名重命名。此處規則爲機器用途縮寫三個字母 CLI,後緊跟網段號,一個連字符,以及網絡地址。例如:CLI34-56
      legalnoticecaption 和 legalnoticetext 是預先設置 Windows XP 注冊表的登錄消息,用以向用戶告知,系統即將進行最後一次重啓,暫不要登錄系統。内容自行定義。
      將已獲得 DHCP IP 轉換爲靜態 IP,DNS 同理。
      刪除脚本 do_enable_cmd.vbs,執行成功後,避免重複執行。
      清除登錄消息。
      爲下次啓動系統添加一個以 SYSTEM 賬戶運行的任務計劃,用以清除 helper 在計算機的配置信息。

    代碼如下

    @echo off
    
    ver | find /i "5." > nul
    
    if %errorlevel% neq 0 (goto exit)
    
    set ifName=本地连接
    set host=CLI
    set ip=
    set gateway=
    
    set userdnsdomain | find /i "contoso.com" > nul
    
    if %errorlevel% neq 0 (goto exit)
    
    hostname | findstr /i/r/c:"%host%[0-9].-[0-9]." 2> nul
    
    if %errorlevel% equ 0 (goto exit)
    
    REM 下面那行代碼,祇有在具有 Administrators 組或 SYSTEM 用戶才能成功執行
    REM 這是使用系統已有功能實現判斷執行此脚本的用戶是否有足夠權限。
    REM 你也可以將 Windows Server 2003 的 whoami 命令複製過來來實現
    diskpart -? > nul
    
    if %errorlevel% neq 0 (
     shutdown -r -t 120 -f
     goto exit
    )
    
    setlocal enabledelayedexpansion
    for /f "tokens=2 delims=:" %%n in ('ipconfig ^| find /i "ip address"') do (
     set ip=%%n
     set ip=!ip:~1!
     for /f "tokens=1" %%i in ('ehco !ip!') do set ip=%%i
    )
    
    
    for /f "tokens=1-4 delims=." %%a in ('echo !ip!') do (
     set gateway=%%a.%%b.%%c.1
     set host=%host%%%c-%%d
    )
    
    wmic computersystem where name="!computername!" call rename name="!host!"
    
    netsh int ip set addr "!ifName!" static !ip! 255.255.255.0 !gateway! 1
    netsh int ip set dns "!ifName!" static 192.168.100.4 primary
    netsh int ip add dns "!ifName!" 192.168.100.7 index=2
    
    reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v legalnoticecaption /t REG_SZ /d "" /f
    reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v legalnoticetext /t REG_SZ /d "" /f
    
    del %WINDIR%\tmp\do_enable_cmd.vbs /a/f/q
    
    schtasks -delete -tn firstbat_NT5x -f
    schtasks -create -tn cleanup_wds -tr  %WINDIR%\tmp\cleanup_helper.bat -sc onstart -ru system
    shutdown -r -t 5 -f
    del "%0" /a/f/q
    
    endlocal
    
    :exit

    代碼如上

    如果希望重命名的規則更複雜,那麽我這裡有一個建議,可以在一臺能夠被客戶端訪問的服務器搭建一個 MySQL。
    該 MySQL 可以不用安裝爲服務,祇在使用時直接通過加載配置文件運行(如 my.cnf)以一個標準用戶身份運行。
    提供新的符合制定規則的重命名方法,則是通過一個預先編寫好的存儲過程實現,通過 MySQL 本身内置的函數,支持行鎖的 InnoDB 數據庫引擎,可以方便實現需求。
    至於客戶端,則放置 MySQL 的原生命令行客戶端 mysql.exe。通過其可以方便加入到脚本中實現獲取新計算機名的需求。

    下面兩個爲針對 NT 6.x 系統的,不過祇在 Windows 7 測試過

    create_firstbat_NT6x.bat

    代碼如下

    @echo off
    
    schtasks -delete -tn firstbat_NT6x -f
    schtasks -create -tn firstbat_NT6x -tr C:\Windows\tmp\firstbat_NT6x.bat -sc onstart -ru contoso\helper -rp PASSWORD -rl highest
    schtasks -run -tn firstbat_NT6x
    del "%0" /a/f/q

    代碼如上

    firstbat_NT6x.bat

    代碼如下

    @echo off
    
    ver | find /i "6." > nul
    
    if %errorlevel% neq 0 (goto exit)
    
    set ifName=本地连接
    set host=CLI
    set ip=
    set gateway=
    
    set userdnsdomain | find /i "contoso.com" > nul
    
    if %errorlevel% neq 0 (goto exit)
    
    hostname | findstr /i/r/c:"%host%[0-9].-[0-9]." 2> nul
    
    if %errorlevel% equ 0 (goto exit)
    
    REM 此處使用系統自帶的 whoami 命令判斷執行此脚本的用戶是否具有權限
    whoami -groups | find /i "S-1-16-12288" > nul
    
    if %errorlevel% neq 0 (
     shutdown -r -t 120 -f
     goto exit
    )
    
    setlocal enabledelayedexpansion
    for /f "tokens=2 delims=:" %%n in ('ipconfig ^| find /i "ipv4"') do (
     set ip=%%n
     set ip=!ip:~1!
     for /f "tokens=1" %%i in ('ehco !ip!') do set ip=%%i
    )
    
    
    for /f "tokens=1-4 delims=." %%a in ('echo !ip!') do (
     set gateway=%%a.%%b.%%c.1
     set host=%host%%%c-%%d
    )
    
    wmic computersystem where name="!computername!" call rename name="!host!"
    
    netsh int ip set addr "!ifName!" static !ip! 255.255.255.0 !gateway! 1
    netsh int ip set dns "!ifName!" static 192.168.100.4 primary
    netsh int ip add dns "!ifName!" 192.168.100.7 index=2
    
    reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v legalnoticecaption /t REG_SZ /d "" /f
    reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v legalnoticetext /t REG_SZ /d "" /f
    
    del %WINDIR%\tmp\do_enable_cmd.vbs /a/f/q
    
    schtasks -delete -tn firstbat_NT6x -f
    schtasks -create -tn cleanup_wds -tr %WINDIR%\tmp\cleanup_helper.bat -sc onstart -ru system -rl highest
    shutdown -r -t 5 -f
    del "%0" /a/f/q
    
    endlocal
    
    :exit

    代碼如上

    清理 helper 的脚本 cleanup_helper.bat

    代碼如下

    @echo off
    
    REM 下面那行代碼在 NT 5.x 和 NT 6.x 系統通用
    rmdir "%SYSTEMDRIVE%\Documents and Settings\helper" /s/q
    REM S-1-5-21-1....2-6136 爲 contoso\helper 的 SID
    reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Profilelist\S-1-5-21-1....2-6136" /f
    reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Profilelist\S-1-5-21-1....2-6136.bak" /f
    schtasks -delete -tn cleanup_wds -f
    del "%0" /a/f/q

    代碼如上

    至此關於 WDS 遠程部署相關的方法就分享完成了。希望能對大家在實際使用中帶來一些幫助。

    最後再貼一個小發現:

    從截圖可以看到 Windows 8.1 開始按鈕的四個角恰好能夠與 Windows 7 圓形開始按鈕圓周相重合。這兩個系統在任務欄能夠很好重合的目前祇發現這個。由此看來 Windows 8.1 開始按鈕的圖標設計上還是費了些心思。


    Folding@Home


    • 已编辑 repl 2014年2月24日 15:14
    2014年2月24日 14:44

全部回复