PowerShell生成AD用户密码写入XML时HTML编码问题求助
解决PowerShell写入XML时密码特殊字符被转义的问题
问题原因
WriteElementString方法会自动对XML特殊字符(如&、<、>等)进行转义,这是XML规范的强制要求,目的是保证XML文档的有效性。这种转义属于正常行为——当你后续用XML解析器读取该文件时,转义后的字符会自动还原为原始内容,不需要手动替换。
解决方案
如果希望在XML文件中直接保留原始密码字符(不转义),可以使用XML的CDATA段包裹密码内容。CDATA段中的内容会被XML解析器当作纯文本处理,不会触发特殊字符转义。
修改后的代码(使用CDATA)
$xmlsettings = New-Object System.Xml.XmlWriterSettings $xmlsettings.Indent = $true $xmlsettings.IndentChars = " " $XmlWriter = [System.XML.XmlWriter]::Create("C:\Users\AdminSec\Desktop\00 - Home\Users.xml", $xmlsettings) $xmlWriter.WriteStartDocument() $xmlWriter.WriteProcessingInstruction("xml-stylesheet", "type='text/xsl' href='style.xsl'") $xmlWriter.WriteStartElement("ADDS") $xmlWriter.WriteStartElement("Users") $i = 0 # 将程序集加载移到循环外,避免重复执行 Add-Type -AssemblyName 'System.Web' while($i -ne 250) { $Password = [System.Web.Security.Membership]::GeneratePassword(15, 1) $xmlWriter.WriteStartElement("TEST") # 用CDATA段包裹原始密码 $xmlWriter.WriteCData($Password) $xmlWriter.WriteEndElement() $i++ } $xmlWriter.WriteEndElement() $xmlWriter.WriteEndElement() $xmlWriter.WriteEndDocument() $xmlWriter.Flush() $xmlWriter.Close()
额外优化说明
- 把
Add-Type -AssemblyName 'System.Web'移到循环外部,避免每次循环重复加载程序集,提升脚本执行效率。 - 使用CDATA后,XML中的密码会被包裹在
<![CDATA[...]]>标记中,例如:<TEST><![CDATA[Xy&z123!]]></TEST>,读取时通过元素的InnerText属性即可获取原始密码。
转义行为的补充说明
如果不需要在XML文件中直观看到原始字符,建议保留默认的转义行为,因为这符合XML规范,且读取时会自动还原。例如用以下代码读取XML时,转义的&会自动变回&:
$xml = [xml](Get-Content "C:\Users\AdminSec\Desktop\00 - Home\Users.xml") $xml.ADDS.Users.TEST | ForEach-Object { # 输出自动还原后的原始密码 Write-Host $_ }
内容的提问来源于stack exchange,提问作者AdminSec
相关产品推荐
相关产品推荐

