如何使Import-Clixml读取自定义凭据XML文件?

时间:2018-09-11 15:34:11

标签: xml powershell credentials

我正在使用Get-Credentials获取Xen Pool主服务器的凭据。我正在使用XML将凭据保存到Export-Clixml文件中。我想向XML创建的Export-Clixml文件中添加一个元素,以将Xen池名称和Xen池主URL存储到XML文件中。

问题:我使用Export-Clixml创建凭据XML文件,然后修改XML文件以添加额外的元素。但是,当我使用XML读取Import-Clixml文件时,会引发错误:Import-Clixml : Obj XML tag is not recognized.

如何使Import-Clixml读取我的自定义凭据XML文件以获取凭据,而不会由于我的自定义对象而引发错误?

1 个答案:

答案 0 :(得分:1)

我最初的方法是为XML生成的XML文件找到Export-Clixml模式,希望该模式支持某种通用字符串元素。但是,我无法找到架构。

解决方案是使用-first cmdlet的Import-Clixml参数。

首先,我使用XML创建了一个Export-Clixml文件,然后添加了第二个Obj元素(<Obj RefId="99" xmlns="">

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">UUUUU</S>
      <SS N="Password">PPPP...PPPPP</SS>
    </Props>
  </Obj>
  <Obj RefId="99" xmlns="">
    <my-element-name my-element-attribute="AAAAA">EEEEEE</my-element-name>
  </Obj>
</Objs>

要获取凭据,我像这样读取XML

$creds = $Import-Clixml -first 1 -path <fq path to xml file>

-first 1强制Import-Clixml仅读取<Obj RefId="0">元素(并忽略我的自定义元素)

然后,我使用XMLReader重新读取XML文件以获得我的自定义元素

编辑1

根据Jeroen Mostert的建议更改了方法

注意:

$ExportXmlFile.FileName来自system.windows.forms.savefiledialog

$cred加载了get-credentials的输出

$cred | Export-Clixml -Path $ExportXmlFile.FileName -Force

$xml = [xml] (type $ExportXmlFile.FileName)

[System.Xml.XmlElement]$root = $xml.DocumentElement

[System.Xml.XmlComment]$c = $xml.CreateComment(("poolName="+$textBoxXenPoolName.Text + "," + "poolMasterUrl="+$textBoxXenPoolMasterUrl.Text))
$xml.InsertBefore($c, $root);

$xml.Save($ExportXmlFile.FileName)

生成一个带有“结构化”注释的xml文件,我可以阅读和解析该文件:

<!--poolName=nnnnn,poolMasterUrl=https://###.##.#.#-->
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">uuu</S>
      <SS N="Password">pppp...pppp</SS>
    </Props>
  </Obj>
</Objs>