WDS+MDT网络启动自动部署windows(十七)MDT中文变量,描述,组织单位OU

简介#

这简直就是歧视,在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,执行代码后,乱码修复了。

 #

解决方法#

经过多天的不断尝试,还是走回了老路,和设置中文描述一样,增加函数来转换windows-1252到UTF-8编码。

不过优化了一下函数。

复制代码
' 定义 Windows-1252 编码的字符串
        Dim strWindows1252
        strWindows1252 = "技术部"

        ' 调用函数将字符串转换为 UTF-8 编码
        Dim strUTF8
        strUTF8 = ConvertToUTF8(strWindows1252)

        ' 显示 UTF-8 编码的字符串
        MsgBox strUTF8

        ' 函数用于将 Windows-1252 编码的字符串转换为 UTF-8 编码
        Function ConvertToUTF8(ByVal strInput)
            Dim objStream, strOutput

            ' 创建 ADODB.Stream 对象
            Set objStream = CreateObject("ADODB.Stream")

            ' 将原始字符串转换为字节数组
            objStream.Type = 2 ' adModeMemory
            objStream.Charset = "Windows-1252"
            objStream.Open
            objStream.WriteText strInput
            objStream.Position = 0
            objStream.Type = 1 ' adModeBinary
            objStream.Position = 0

            ' 将字节数组转换为 UTF-8 编码的字符串
            objStream.Type = 2 ' adModeMemory
            objStream.Charset = "UTF-8"
            strOutput = objStream.ReadText

            ' 关闭并释放 Stream 对象
            objStream.Close
            Set objStream = Nothing

            ' 返回 UTF-8 编码的字符串
            ConvertToUTF8 = strOutput
        End Function
复制代码

只要一个函数了,变量可以重复赋值。

在ZTIDomainJoin.wsf脚本文件使用ouname前面,重新赋值一下。

150行附近,劫持一下,执行一下转换函数。

 

 

小结#

当然,如果有机会,我也许会将这个函数改进ZTIUtility.vbs,外部使用变量时无需转换。暂时还不行,还需要在用的时候转换。

现在已经将函数放ZTIUtility.vbs,用的时候转换一下。

目前需转换的有描述,组织单位两个地方。放入ZTIUtility.vbs后,将可以在任意位置使用中文变量无需转换。

 

作者:上官飞鸿

出处:https://www.cnblogs.com/jackadam/p/18181281

版权:本作品采用「知识共享-署名-非商业性-禁止演绎(CC-BY-NC-ND)」许可协议进行许可。

posted @   上官飞鸿  阅读(185)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 易语言 —— 开山篇
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示