WDS+MDT網路啟動自動部署windows(十七)MDT中文變數,描述,組織單位OU

上官飞鸿發表於2024-05-09

簡介

這簡直就是歧視,在MDT使用變數時,資料庫設定時,居然不能用中文。

計算機描述,我將在資料庫中設定為使用人,主要是其他地方也不方便看。

描述是存在登錄檔中的,未來自動化也將會使用使用人這個欄位,用來註冊OCS這樣,有標籤,使用人欄位的軟體。

方向

解決MDT/BDD無法加入帶中文名稱的OU問題_xmuxsp的技術部落格_51CTO部落格

剛開始接觸BDD 2007的時候,就知道BDD 2007有個bug,加域時可以選擇加入指定的OU,但這個OU名稱是不能包含中文的。因為包含中文名稱的OU,在實際展現時會顯示為亂碼。
實際上不止是machineobjectOU這個變數,所有的變數,只要是涉及雙位元組字元,都會顯示為亂碼。
最近突然心血來潮,想趁著學習指令碼的勁頭,把這個問題解決了。
問題在哪裡?
粗略分析了一下,MDT裡的變數都儲存在variables.dat中,這其實是一個XML檔案,由ztigather.wsf這個指令碼生成和更新。生成後,Wizard.hta再讀取variables供各個指令碼呼叫——用寫字板開啟這個檔案,會發現所有中文都是亂碼,如果我中斷期間的過程,手動修改Variables.dat糾正亂碼,是可以正常識別的——所以我判斷問題出在Variables.dat中的亂碼。
剛開始我認為亂碼是發生在寫入時,比如寫入函式將錯誤的編碼過的中文字串寫入了XML檔案中。但我發現用Notepad++或者記事本開啟有亂碼的Variables.dat,亂碼是能夠被正確識別並顯示為中文的。於是我懷疑並不是寫入函式的問題,而是檔案本身編碼的問題。
詢問了小顧,xml檔案只能是由ansi進行編碼(GB2312),而在Notepad++右下的編碼資訊裡,顯示的是ansi with utf-8,也就是說這個檔案被識別為用utf-8編碼,莫非是這個問題?
於是我單獨測試了一下,驗證得知確實是這個問題,如果我強制轉換編碼為Gb2312後,用寫字板開啟variables.dat看到的也是正確的中文了
如何修改程式碼?
因為我之前完全沒有系統學習vbscript,這次修改程式碼鬧了不少笑話......好在都解決了
我的思路很簡單,在ztigather收集完資料後,強制轉換variables.dat的編碼,由於是緊密相連的,就沒有將轉換的指令碼獨立出來,而是直接黏在了ztigather.wsf的屁股上。這裡我借用了別人的程式碼,生命一下.....
在附件裡把修改後的ztigather.wsf附上,以免日後自己都忘記了
-----------------------------------
©著作權歸作者所有:來自51CTO部落格作者xmuxsp的原創作品,請聯絡作者獲取轉載授權,否則將追究法律責任
解決MDT/BDD無法加入帶中文名稱的OU問題
https://blog.51cto.com/xmuxsp/284813

很久以前的貼子了,複製一份吧。免得丟了。

設定OU=技術部,嘗試解決問題。

解決過程

查日誌

配置mdt記錄日誌到共享目錄,但是日誌裡面沒有variables.dat。

打斷點

這次嘗試bat斷點

錯誤提示是這樣的,提示我加入域4次失敗,停在了pause任務。挺好。

定位故障

居然還是沒有variables.dat

就在recover join domain上下附近,反覆打斷點,甚至在 recover join domain任務執行時,我終於將一個8k大小的variables.dat,放入了日誌目錄,MDT時,可以對設定的遠端日誌目錄進行讀寫。

具體怎麼弄出來,我也就不去復現了。

檢視故障

為了檢視故障以及修復故障,我考慮在MDT安裝環境中對故障進行修復。所以又是斷點,一般都在State Restore任務組中。

中斷以後,複製variables.dat到C盤根目錄,我隨便改了個名。

用記事本開啟。尋找ouname

找了個亂碼恢復網站

查到了原有編碼和正確編碼,至於搜到的GB2312,還真不算對。

解決方案

經過AI,QQ群友的幫助,寫了這麼個wsf指令碼。

<?xml version="1.0" encoding="utf-8"?>
<job id="test">
  <script language="VBScript">
    <![CDATA[
    strVarFilePath1 = "C:\VARIABLEStag.DAT"
    strVarFilePath2 = "C:\VARIABLESout.DAT"
    str=ReadFile(strVarFilePath1, "UTF-8")
    WriteToFile  strVarFilePath2, Str, "windows-1252"
    
    Function ReadFile(FileUrl, CharSet)
    Dim Str
    Set stm = CreateObject("Adodb.Stream")
    stm.Type = 2
    stm.mode = 3
    stm.charset = CharSet
    stm.Open
    stm.loadfromfile FileUrl
    Str = stm.readtext
    stm.Close
    Set stm = Nothing
    ReadFile = Str
    End Function

    Function WriteToFile (FileUrl, Str, CharSet)
    Set stm = CreateObject("Adodb.Stream")
    stm.Type = 2
    stm.mode = 3
    stm.charset = CharSet
    stm.Open
    stm.WriteText Str
    stm.SaveToFile FileUrl, 2
    stm.flush
    stm.Close
    Set stm = Nothing
    End Function
    ]]>
  </script>
</job>

用utf-8讀VARIABLEStag.DAT,重新編碼為windows-1252,並寫入VARIABLESout.DAT,執行程式碼後,亂碼修復了。

解決方法

我也找了幾遍,並沒有找到合適的地方插入一個任務來修復文件編碼,只好學習方向中前輩的方法,直接黏在了ztigather.wsf的屁股上。

由於這個wsf,上面已經引入了ZTIUtility.vbs,所以我們將使用變數來定義這個檔案路徑,測試已經透過,則讀檔案和覆寫檔案將是同一個檔案。

放在End Class 和 </script>之間。

測試

我相信這將同時解決所有的中文變數問題,也就是說描述和組織單位都將適用。

測試暫未透過,將繼續嘗試,實在是不好除錯。

加入域似乎是在Postinstall組中,這裡無法中斷。

似乎可以試試先做描述中文的測試。

相關文章