none
xml-Datei nach String durchsuchen RRS feed

  • Frage

  • Hallo,

    ich schreibe gerade ein Script, mit dem über eine grafische Oberfläche ausgewählt werden kann, welche Gruppenrichtlinien Importiert werden sollen. Im Voraus ist ein Backup aller Gruppenrichtlinien durchgeführt worden, das in einem extra Ordner abgelegt wurde. Dazu wurden in diesem Ordner ein GPO-Report im xml-Format gespeichert.

    Nun möchte ich aus dieser XML-Datei die Namen der gesicherten Gruppenrichtlinien auslesen und in der grafischen Oberfläche ausgeben. Hier ein ausschnitt der xml-Datei:

    ...

    - <GPO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.microsoft.com/GroupPolicy/Settings">
    
     - <Identifier> 
    
    <Identifier xmlns="http://www.microsoft.com/GroupPolicy/Types">{1854B306-87B3-4F41-9F6E-C5D91B659156}</Identifier> 
    
    <Domain xmlns="http://www.microsoft.com/GroupPolicy/Types">motest.de</Domain> </Identifier> 
    
    <Name>testpolicy</Name>
    
    

    ...

    Mein erster Versuch:

    $ReportFile=Get-Content "$path\$directory\GPOReport.xml" 
    foreach($line in $ReportFile) { 
     $tmp=$test.Contains("<Name>") 
     if($tmp) { 
      $name=$test.Substring(8) 
      $length=$name.Length 
      $gpoName=$gpoName+$name.Substring(0, $length-7)
     }
    } 
    

    Das Problem das auftauchte: In der xml-Datei sind mehrere "<Name>"-Tags zu finden, die nicht alle einen Gruppenrichtlinienname enthalten. Deswegen kam mir die Idee, erst nach dem Tag "<GPO" zu suchen, und dann nach dem Tag "<Name>". Soweit klappt das auch mit folgendem Code:

    $ReportFile=Get-Content "$path\$directory\GPOReport.xml"
    foreach($line in $ReportFile) { 
     $tmp1=$line.Contains("<GPO") 
     if($tmp1) { 
      foreach($test in $ReportFile) { 
       $tmp2=$test.Contains("<Name>") 
       if($tmp2) { 
        $name=$test.Substring(8) 
        $length=$name.Length 
        $gpoName=$gpoName+$name.Substring(0, $length-7) 
        break 
       } 
      } 
      } 
    }
    

     Allerdings wird die Datei immer wieder von neuem durchsucht und nicht an vorheriger Stelle weiter durchsucht.

    Hat jemand einen Tipp für mich, wie ich dieses Problem lösen kann?

     Vielen Dank im Voraus für die Hilfe.

     

    Viele Grüße

    Darkholylein

    Montag, 8. November 2010 17:15

Antworten

  • Hallo,

    da es sich offensichtlich um eine gültige XML datei handelt, würde ich sie auch als [XML] laden und dann die entsprechenden Knoten auswählen. Leider lässt sich aus deinem Auszug die Gesamtstruktur der Datei nicht herauslesen, sonst könnte ich dir ein Script posten. Aber hier ein Beispiel:

    Für folgende XML-Datei:

    <?xml version="1.0"?>
    <Backups>
      <GPO>
       <Name>MeineGPO1</Name>
      </GPO>
      <WASanderes>
       <Name>xyz</Name>
      </WASanderes>
      <GPO>
       <Name>MeineGPO2</Name>
      </GPO>
      <WASanderes>
       <Name>abcde</Name>
      </WASanderes>
    </Backups>
    


    wäre eine Möglichkeit um in allen GPO-Knoten die Namen auszulesen, z.B. dieser:

    $GPOBackupXmlData = [xml](Get-Content "D:\test.xml" )
    $node = $GPOBackupXmlData.Backups.GPO 
    $GPOnames = @() 
    
    foreach ($entry in $node){ 
       $GPOnames = $GPOnames + $entry.Name
     } 
     
     Write-host $GPOnames
    


    Grüße, Denniver

    Dienstag, 9. November 2010 06:26
    Moderator

Alle Antworten

  • Hallo,

    da es sich offensichtlich um eine gültige XML datei handelt, würde ich sie auch als [XML] laden und dann die entsprechenden Knoten auswählen. Leider lässt sich aus deinem Auszug die Gesamtstruktur der Datei nicht herauslesen, sonst könnte ich dir ein Script posten. Aber hier ein Beispiel:

    Für folgende XML-Datei:

    <?xml version="1.0"?>
    <Backups>
      <GPO>
       <Name>MeineGPO1</Name>
      </GPO>
      <WASanderes>
       <Name>xyz</Name>
      </WASanderes>
      <GPO>
       <Name>MeineGPO2</Name>
      </GPO>
      <WASanderes>
       <Name>abcde</Name>
      </WASanderes>
    </Backups>
    


    wäre eine Möglichkeit um in allen GPO-Knoten die Namen auszulesen, z.B. dieser:

    $GPOBackupXmlData = [xml](Get-Content "D:\test.xml" )
    $node = $GPOBackupXmlData.Backups.GPO 
    $GPOnames = @() 
    
    foreach ($entry in $node){ 
       $GPOnames = $GPOnames + $entry.Name
     } 
     
     Write-host $GPOnames
    


    Grüße, Denniver

    Dienstag, 9. November 2010 06:26
    Moderator
  • Achja und beachte bei den Knotennamen das es bei den XML generell auf Groß- und Kleinschreibung ankommt.
    Dienstag, 9. November 2010 06:33
    Moderator
  • Hallo Denniver,

    vielen Dank für deine Hilfe, mit deiner Lösung habe ich das Problem beheben können.

     

    Viele Grüße

    Darkholylein

    Dienstag, 9. November 2010 16:49