You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时,转义的&amp;会自动变回&:

$xml = [xml](Get-Content "C:\Users\AdminSec\Desktop\00 - Home\Users.xml")
$xml.ADDS.Users.TEST | ForEach-Object {
    # 输出自动还原后的原始密码
    Write-Host $_
}

内容的提问来源于stack exchange,提问作者AdminSec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:20:26