将变量复制到 xml 文件的脚本

Script to copy variable into xml file

我有一些软件可以解析 .xml 文件以获取登录信息(用户名和密码)。过去,我们一直为该软件的数百名用户使用相同的用户名和密码,这已成为一个安全问题。我可以轻松地用新的登录信息替换这个 .xml 文件,但我需要一些帮助来为数百个用户设置用户名。

到目前为止,我已经为需要复制到的每台计算机生成了一个 XML 文件。

例如:

Computer1.xml
Computer2.xml
Computer3.xml
...
Computer290.xml

XML 文件本身是这样的:

<?xml version="1.0" encoding="utf-8"?>
<settings>
 <server default="true">
  <connection ssl="false">
   <address>fax.servername.com</address>
   <login>USERNAME</login>
   <password>PASSWORD</password>
  </connection>
  <about>
   <model>MODELNUMBER</model>
   <version>VERSIONNUMBER</version>
  </about>
  <user>
   <contact_url>http://contacturl/users/username</contact_url>
   <username>USERNAME</username>
   <name>JOHN DOE</name>
   <organization>Company Name</organization>
   <default_cover_page_enabled>false</default_cover_page_enabled>
   <default_cover_page_name></default_cover_page_name>
   <priority>3</priority>
   <max_attempts>3</max_attempts>
   <interval>300</interval>
   <receipt>failure</receipt>
   <receipt_attachment>pdf</receipt_attachment>
  </user>
 </server>
</settings>

我知道以纯文本形式存储密码是个糟糕的主意,但遗憾的是该软件太旧,不支持其他方法。

我有一个包含用户名和他们使用的计算机的 csv 文件。

例如 (编辑:更改为 CSV 文件格式)

User1,Computer1
User2,Computer2
User3,Computer3

如何获取这些用户名并将其弹出到 xml 文件中,以便它们与正确的计算机名称相对应?

让我们考虑这个用户-computer.csv:

UserName,ComputerName
User1,Computer1
User2,Computer2
User3,Computer3

那么您可以尝试以下操作(使用正确的正确路径进行修改,在此演示中使用当前目录):

Import-Csv -Path .\user-computer.csv | ForEach-Object {
    #$_ is the current object

    #Your "xml" is not a valid xml file as it doesn't have a root element, so we should use text replacement to modify the files.

    (Get-Content -Path ".$($_.ComputerName).xml") -replace '(?<=<username>)(.*?)(?=<\/username>)', $_.UserName | Set-Content -Path ".$($_.ComputerName).xml"
}

如果您只想根据 CSV 中的列表验证 computer/user 配对,我将从 CSV 中创建哈希表:

$csv = @{}
Import-Csv 'C:\path\to\your.csv' | % {
  $csv[$_.ComputerName] = $_.UserName.Trim()
}

然后像这样进行验证:

Get-ChildItem 'C:\path\to\*.xml' | % {
  [xml]$xml = Get-Content $_.FullName
  $username = $xml.SelectSingleNode('//username').'#text'.Trim()
  if ($username -ne $csv[$_.BaseName]) {
    "[{0}] User mismatch: {1}, {2}" -f $_.BaseName, $username, $csv[$_.BaseName]
  }
}