2014-07-16 2 views
0

이것은 내가 XML 파일을 만들려고 한 것은 이번이 처음이다. 나는의 GPO 목록을 쿼리하고이 적용되는 GPO와 서버의 이름의 이름을 가진 XML 파일을 생성하는 스크립트를 작성하려합니다.PowerShell 및 XML 파일 생성

나는 두 가지 문제로 실행하고 있습니다 :

  • XML 파일은 첫 번째 GPO로 만들었지 만 대신 많은의 "노드 이름"태그에 모든 서버를 얻을 수있다.

< MasterList>
< 태그>
< TAGNAME> WSUS-ALPHA </TAGNAME>
< 노드 이름> SERVER1 SERVER2 SERVER3 SERVER4 </노드 이름>
</태그>
</MasterList>

01 첫 번째 GPO는 XML 파일에 기록 된 후 23,516,
  • , 나는 나머지 다음과 같은 오류를 얻을 :

예외는 "1"인수 (들) "WriteStartElement를"호출 "작가는 닫은." 라인에서
: 3 문자 : 5
+ $ xmlWriter.WriteStartElement ('태그')
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~
+ CategoryInfo : NotSpecified (:) [] MethodInvocationException
+ FullyQualifiedErrorId : InvalidOperationException이

예외 "2"인자 (들) "WriteElementString를"호출 "토큰의 startElement 상태 오류가 발생하면 잘못된 XML 문서가 생성됩니다. " 라인에서 4 문자 : 5 + $ xmlWriter.WriteElementString ('TAGNAME'$ gpo.DisplayName) + ~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified (:) [] MethodInvocationException + FullyQualifiedErrorId : InvalidOperationException

"2"인수로 "WriteElementString"을 호출하는 예외 : "상태 오류의 Token StartElement가 잘못된 XML 문서가됩니다." 라인에서
: 10 문자 : 13
+ $ xmlWriter.WriteElementString ('NODENAME'(-Identit ... - ADGroupMember 받기
+ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~
+ 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 :

이 "0"인수 (들)과 예외 호출 "플러시는"InvalidOperationException이 : ". 폐쇄 TextWriter에 쓸 수 없습니다" 라인에서
15 문자 : 5
+ $ xmlWriter.Flush()
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified (:) [ ], MethodInvocationException
+ FullyQualifiedErrorId :

$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은() 밖으로 명령 : 경우 ObjectDisposedException 여기

내가 코드를 사용하고있다 상단 forea의 채널 루프,하지만 그건 도움이되지 않았다.

나는이 두 가지 문제가 상당히 솔직하게 해결되어야한다고 생각합니다. 어떻게 확신 할 수 없습니다. 코드 수정 방법에 대한 의견이 있으십니까?

감사합니다. 루프에서 WriteEndElement()에 호출을 추가

+0

확실하지가 있지만,'XmlTextWriter' 생성자 문서는'닷넷 프레임 워크 2.0을 시작으로, 우리는 당신이 XmlWriter를 사용하여 XmlWriter를 인스턴스를 만드는 것이 좋습니다 말한다. 새로운 기능을 활용하기 위해 메서드와 XmlWriterSettings 클래스를 만듭니다 .' – Eris

답변

0

내가 명령을 조금 재 주문까지했다. 여기에 작업 코드입니다 : 그것은 차이를 만들 것입니다 경우

$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) 
0

시도 :

... 
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() 
    } 
} 
...