Powershell和XML文件创建

Powershell和XML文件创建,xml,powershell,powershell-2.0,Xml,Powershell,Powershell 2.0,这是我第一次尝试创建XML文件。我正在尝试编写一个脚本来查询我们的GPO列表,并生成一个XML文件,该文件包含GPO的名称以及应用该GPO的服务器的名称 我遇到两个问题: XML文件是用第一个GPO创建的,但我得到的是“NodeName”标记中的所有服务器,而不是许多 WSUS-ALPHA SERVER1 SERVER2 SERVER3 SERVER4 在将第一个GPO写入XML文件后,其余部分将出现以下错误: 使用“1”参数调用“WriteStarteElement”时出现异常

这是我第一次尝试创建XML文件。我正在尝试编写一个脚本来查询我们的GPO列表,并生成一个XML文件,该文件包含GPO的名称以及应用该GPO的服务器的名称

我遇到两个问题:

  • XML文件是用第一个GPO创建的,但我得到的是“NodeName”标记中的所有服务器,而不是许多


WSUS-ALPHA
SERVER1 SERVER2 SERVER3 SERVER4

  • 在将第一个GPO写入XML文件后,其余部分将出现以下错误:
使用“1”参数调用“WriteStarteElement”时出现异常:“编写器已关闭。”
第3行字符:5
+$xmlWriter.WriteStarteElement('Tag')
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:NotSpecified:(:)[],MethodInvocationException
+FullyQualifiedErrorId:InvalidOperationException

使用“2”参数调用“WriteElementString”时出现异常:“令牌StartElement处于状态错误将导致 无效的XML文档。“ 第4行字符:5 +$xmlWriter.WriteElementString('TagName',$gpo.DisplayName) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:NotSpecified:(:)[],MethodInvocationException +FullyQualifiedErrorId:InvalidOperationException

使用“2”参数调用“WriteElementString”时出现异常:“令牌StartElement处于状态错误将导致 无效的XML文档。“
第10行字符:13
+$xmlWriter.WriteElementString('NodeName',(获取ADGroupMember-Identiit…
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:NotSpecified:(:)[],MethodInvocationException
+FullyQualifiedErrorId:InvalidOperationException

使用“0”参数调用“WriteEndElement”时出现异常:“没有打开XML开始标记。”
第13行字符:5
+$xmlWriter.WriteEndElement()
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:NotSpecified:(:)[],MethodInvocationException
+FullyQualifiedErrorId:InvalidOperationException

使用“0”参数调用“WriteEndElement”时出现异常:“没有打开XML开始标记。”
第14行字符:5
+$xmlWriter.WriteEndElement()
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:NotSpecified:(:)[],MethodInvocationException
+FullyQualifiedErrorId:InvalidOperationException

使用“0”参数调用“Flush”时出现异常:“无法写入已关闭的TextWriter。”
第15行字符:5
+$xmlWriter.Flush()
+~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:NotSpecified:(:)[],MethodInvocationException
+FullyQualifiedErrorId:ObjectDisposedException

以下是我正在使用的代码:

$xmlFile = "c:\data-$randomnumber.xml"
$xmlWriter = New-Object System.XMl.XmlTextWriter($xmlFile,$Null)
$xmlWriter.Formatting = 'Indented'
$xmlWriter.Indentation = 1
$xmlWriter.IndentChar = "`t"
$xmlWriter.WriteStartElement('MasterList')

#Get the list of GPOs that start with "wsus".
$wsusGPOs = Get-GPO -All | where {$_.DisplayName -like 'wsus*'} 

Foreach ($gpo in $wsusGPOs) {
    #For each GPO that starts with "wsus", create a tag with the GPO's name.
    $xmlWriter.WriteStartElement('Tag')
    $xmlWriter.WriteElementString('TagName',$gpo.DisplayName)

    #Get the list of AD groups that have the "Apply" permission, in each GPO.
    $wsusPerms = $gpo | Get-GPPermission -All | where {$_.permission -eq 'GpoApply' -and $_.denied -eq $false}
    Foreach ($permsList in $wsusPerms) {
        If ($permsList.trustee.name -ne 'Authenticated Users') {
            #For each AD group that can apply the GPO, get the list of servers in the AD group. Ignores the "Authenticated Users" group. 
            $xmlWriter.WriteElementString('NodeName',(Get-ADGroupMember -Identity $permsList.Trustee.name -Recursive).name)
        }
    }

    $xmlWriter.WriteEndElement()
    $xmlWriter.WriteEndElement()
    $xmlWriter.Flush()
    $xmlWriter.Close()

    }
我尝试将$xmlWriter.Flush()和$xmlWriter.Close()命令移出顶部的foreach循环,但没有效果

我觉得这两个问题都应该直截了当地解决,我只是不确定如何解决。有没有关于如何修改代码的想法


谢谢。

尝试在循环中添加对WriteEndElement()的调用:

...
Foreach ($permsList in $wsusPerms) {
    If ($permsList.trustee.name -ne 'Authenticated Users') {
        #For each AD group that can apply the GPO, get the list of servers in the AD group. Ignores the "Authenticated Users" group. 
        $xmlWriter.WriteElementString('NodeName',(Get-ADGroupMember -Identity $permsList.Trustee.name -Recursive).name)
        $xmlWriter.WriteEndElement()
    }
}
...

最后我对命令进行了一点重新排序。下面是工作代码:

$randomnumber = Get-Random -minimum 100 -maximum 10000
$xmlFile = "c:\data-$randomnumber.xml"
$xmlWriter = New-Object System.XMl.XmlTextWriter($xmlFile,$Null)
$xmlWriter.Formatting = 'Indented'
$xmlWriter.Indentation = 1
$xmlWriter.IndentChar = "`t"
$xmlWriter.WriteStartElement('MasterList')

#Get the list of GPOs that start with "wsus".
$wsusGPOs = Get-GPO -All | where {$_.DisplayName -like 'wsus*'} 

Foreach ($gpo in $wsusGPOs) {
#Get the list of AD groups that have the "Apply" permission, in each GPO.
$wsusPerms = $gpo | Get-GPPermission -All | where {$_.permission -eq 'GpoApply' -and $_.denied -eq $false}

    Foreach ($securityGroup in $wsusPerms) {
        If ($securityGroup.trustee.name -ne 'Authenticated Users') {
            #For each AD group that can apply the GPO, get the list of servers in the AD group. Ignores the "Authenticated Users" group. 
            Foreach ($computer in (Get-ADGroupMember -Identity $securityGroup.Trustee.name -Recursive).name) {
                $xmlWriter.WriteStartElement('Tag')
                $xmlWriter.WriteElementString('TagName',$gpo.DisplayName)
                $xmlWriter.WriteElementString('NodeName',$computer)
                $xmlWriter.WriteEndElement() #Closes the "Tag" element
            }
        }
    }
}
$xmlWriter.WriteEndElement() #Closes the "MasterList" top-level element
$xmlWriter.Flush()
$xmlWriter.Close()
$xmlContent = [IO.File]::ReadAllText($xmlFile)

不确定这是否会产生影响,但是
XmlTextWriter
构造函数文档说
从.NET Framework 2.0开始,我们建议您使用XmlWriter.create方法和XmlWriterSettings类创建XmlWriter实例,以利用新功能。