如何使Import Clixml读取自定义凭据XML文件?
我正在使用如何使Import Clixml读取自定义凭据XML文件?,xml,powershell,credentials,Xml,Powershell,Credentials,我正在使用Get credentials获取Xen池主服务器的凭据。我正在使用Export-Clixml将凭据保存到XML文件中。我想向由Export Clixml创建的XML文件中添加一个元素,以将Xen池名称和Xen池主URL存储到XML文件中 问题:我使用Export-Clixml创建凭证XML文件,然后修改XML文件以添加额外的元素。但是,当我使用Import-Clixml读取XML文件时,它抛出一个错误:Import-Clixml:Obj-XML标记无法识别。 如何使Import-Cl
Get credentials
获取Xen池主服务器的凭据。我正在使用Export-Clixml
将凭据保存到XML
文件中。我想向由Export Clixml
创建的XML
文件中添加一个元素,以将Xen池名称和Xen池主URL存储到XML
文件中
问题:我使用Export-Clixml创建凭证XML
文件,然后修改XML
文件以添加额外的元素。但是,当我使用Import-Clixml
读取XML
文件时,它抛出一个错误:Import-Clixml:Obj-XML标记无法识别。
如何使
Import-Clixml
读取我的自定义凭据XML文件以获取凭据,而不会由于我的自定义对象而引发错误?我最初的方法是为Export-Clixml
生成的XML
文件定位XML
模式,希望该模式支持某种类型的操作通用字符串元素。但是,我无法找到架构
解决方案是使用Import-Clixml
cmdlet的-first
参数
首先,我使用Export-Clixml
创建了一个XML
文件,然后添加了第二个Obj
元素(
)
-first 1
强制导入Clixml
仅读取
元素(并忽略我的自定义元素)
然后,我使用XMLReader
重新读取XML文件,以获得我的自定义元素
编辑1
根据Jeroen Mostert的建议改变方法
注:
$ExportXmlFile.FileName
来自system.windows.forms.savefiledialog
$cred
加载了来自get凭据的输出
$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>
System.Management.Automation.PSCredential
系统对象
System.Management.Automation.PSCredential
uuu
pppp…pppp
如果您仍然需要自定义代码,为什么不通过包装Get Credentials
的结果来导出实际的自定义对象呢?旋转Export-Clixml
的结果,使其不能被普通的Import
命令读取,这听起来是一个非常丑陋的解决方案。即使出于某种原因,这是最合适的方法,将您的内容添加到结构化XML注释中,您可以对其进行解析,而其他人可以忽略它,这可能会更好。(通过额外的努力,您甚至可以使对象的行为与PSCredential
实例一样,但这是更高级的东西。)请注意,我确实理解通过包装Get Credentials的结果导出实际自定义对象的意思。我没有想到一个结构化的注释,但我将修改我的代码以使用该方法,即[PSCustomObject]@{poolName=“…”;poolMasterUrl=“…”;credentials=$cred}| Export Clixml
。PowerShell可以导出任何对象,包括哈希表和由它们构成的自定义对象。考虑到生成的XML真的不需要操心,那么您的Q&A的用例是什么呢?与创建多个凭据文件或创建要导出的凭据哈希表相比?这似乎过于复杂了,因为DI目前有一个PS脚本,它接受Xen池主机的url及其凭据。鉴于这些,它提供了一个池虚拟机列表,以便用户可以选择要删除的现有虚拟机快照和要为其创建新快照的虚拟机。我正在制作一个无人参与的版本,由Win调度程序运行。因此,无人参与脚本需要1)预先准备好的creds文件,2)预先准备好的池vm列表,3)池主url。因此,如果creds文件具有池主机的url(创建creds文件并用于执行连接到池主机的测试时提供的url),那就更好了
$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)
<!--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>