Как заставить Import-Clixml читать XML-файл с пользовательскими учетными данными? - PullRequest
0 голосов
/ 11 сентября 2018

Я получаю учетные данные для главного сервера пула Xen, используя Get-Credentials. Я сохраняю учетные данные в файл XML, используя Export-Clixml. Я хочу добавить элемент в файл XML, созданный Export-Clixml, чтобы сохранить имя пула Xen и главный URL-адрес пула Xen в файле XML.

Проблема: я создаю файл учетных данных XML, используя Export-Clixml, а затем изменяю файл XML, чтобы добавить дополнительный элемент. Однако когда я читаю файл XML, используя Import-Clixml, он выдает ошибку: Import-Clixml : Obj XML tag is not recognized.

Как заставить Import-Clixml прочитать мой XML-файл пользовательских учетных данных, чтобы получить учетные данные, не выдавая ошибку из-за моего пользовательского объекта?

1 Ответ

0 голосов
/ 11 сентября 2018

Мой первоначальный подход заключался в том, чтобы найти схему XML для файла XML, созданного Export-Clixml, в надежде, что схема поддерживает какой-то общий строковый элемент.Однако мне не удалось найти схему.

Решением было использование аргумента -first командлета 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"> (и игнорировать мой пользовательский элемент)

Затем я сновапрочитайте файл XML, используя XMLReader, чтобы получить мой пользовательский элемент

Редактировать 1

Изменен подход согласно предложению Йероена Мостерта

Примечания:

$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>
...