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

时间:2015-01-19 17:35:46

标签: xml loops powershell csv

我有一些软件可以解析.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文件以及他们使用的计算机。

e.g。 (编辑:更改为CSV文件格式)

User1,Computer1
User2,Computer2
User3,Computer3

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

2 个答案:

答案 0 :(得分:0)

让我们考虑一下这个user-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"
}

答案 1 :(得分:0)

如果您只是想根据CSV中的列表验证计算机/用户配对,我会从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]
  }
}