前陣子協助某大網站將虛擬機器移轉到另一個 Hyper-V Host 上,原本要以盡可能降低停機時間,直接線上移轉儲存區(Hyper-V 3.0 強大功能之一),再從另一個 Host 開啟 VM 方式做移轉;很不幸的是,嘗試執行過三次,只要跑到 8x% 時都會失敗。由於有時間壓力,沒有辦法探究發生原因,只好改採關閉 VM 後,拷貝 VHD 檔及設定檔離線進行。至於原有的 VM / VHD,在跟管理群討論後決定留下,未來轉成專職的 SQL 資料庫主機,讓 AP 及資料庫有機會拆到不同的 Host 上執行。

因該環境沒有使用網域,理論上只要對原來的 VM 更改電腦名稱及 IP 即可,但小弟個人比較龜毛,且不想哪天導入網域管理時,接手的人不知道有兩台 VM 的 SID 是一樣的,而造成後續可能發生異常狀況,所以還是決定採取比較標準的作法 - 執行 Sysprep!

沒想到,我人品一定很好,連很單純的 Sysprep 動作竟然也遇上狀況,直接告知「嘗試對電腦執行 sysprep 時發生嚴重錯誤」。

事出必有因,只拿這樣的錯誤訊息去網路上找解決方法,好心的 G 社搜尋引擎會吐出海量資料,拿去論壇問只是把人家當神壇,所以優先的除錯步驟應該是找出 Sysprep 的 Log

Sysprep 的 Log 存放位置及檔名完整如下

C:\Windows\System32\sysprep\Panther\setuperr.txt

開啟後,從 Log 發現只要執行 Sysprep,就會跳出三行較詳細的錯誤訊息。

 [0x0f0085] SYSPRP LaunchDll:Could not load DLL C:\Program Files\Microsoft Security Client\MSESysprep.dll[gle=0x0000007e]
[0x0f0070] SYSPRP RunExternalDlls:An error occurred while running registry sysprep DLLs, halting sysprep execution. dwRet = 126[gle=0x0000007e]
[0x0f00a8] SYSPRP WinMain:Hit failure while processing sysprep cleanup providers; hr = 0x8007007e[gle=0x0000007e]

尤其第一行的「Could not load DLL C:\Program Files\Microsoft Security Client\MSESysprep.dll」更似乎讓兇手呼之欲出。

看來,是 VM 安裝的微軟防毒軟體,似乎該目錄缺了「MSESysprep.dll」這個檔案,而導致 Sysprep 過程出錯。經過檢查,也確實沒有該檔案的存在。

既然沒有該檔案,一般人的作法是想辦法補檔。但我認為,既然是防毒軟體缺少這個檔案,那就把防毒先暫時移除,Sysprep 完再重裝總可以吧。

但移除後,Sysprep 的結果還是失敗,而且連錯誤記錄都與之前一樣。

震怒之下,決定用關鍵字「MSESysprep.dll」在機碼中搜尋,果然找到蛛絲馬跡。原來 Sysprep 相關機碼位置中,Clean Up 項目包含清理這個 dll。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\Sysprep\Cleanup

不過,前面提到已經移除防毒軟體了,猜測對該 DLL 做 Clean Up 動作也沒有意義,所以我決定...那就一起刪除吧!(叔叔先對 VM 快照所以有練過,沒事不要亂學,學之前記得先備份機碼

要特別注意,若要針對 Cleanup 項目做修改,必須要先讓所屬的帳號取得在該機碼的存取權,才能接著刪除該項目。

刪除後,不用重開機,果然就成功執行 Sysprep 了。

但之後再重新安裝原來在伺服器上的微軟防毒軟體 - System Center 2012 Endpoint Protection,觀察安裝目錄下仍舊沒有「MSESysprep.dll」這個檔案,不過 Clean Up 項目裡就沒有出現造成這次狀況的機碼值了,所以...那串機碼到底是怎麼產生的,除非有人記錄所有在伺服器上的操作,否則大概只能問神...

延伸閱讀:
Taiwan CSS Platform Team - Windows 7執行sysprep 時,出現「嘗試對電腦執行sysprep時發生嚴重錯誤」
微軟 KB929828 文件 - An error message occurs when you run "Sysprep /generalize" in Windows Vista or Windows 7: "A fatal error occurred while trying to Sysprep the machine"