none
INI-File Filtern und Modifizieren RRS feed

  • Frage

  • Ich versuche gerade ein Ini-Files mit Powershell zu parsen.

    Problemstellung:

    In diesem Loginscript.ini file mit (hunderten von Zeilen) werden aufgrund von gleichen Gruppenzugehörigkeiten eines Users in den verschiedenen Sektionen SASIMAP und SASOLAP (hier im Beispiel wäre eine solche aufgeführt, nämlich UserGroups=Domäne\gl_w_SASIMAP) die gleichen Skripte mehrfach ausgeführt. Dies führt zu langen Logonzeiten.

    Ziel ist es, mit Powershell durch Löschen der ganzen überzähligen Sektionen im Ini-File zu bewirken, dass jedes VB-Script für jede UserGroup nur einmal ausgeführt wird. 

    Wie im Beispiel ersichtlich sind die rot markierten gleichen Mehrfacheinträge (die beliebige Namen und Stringlängen haben könnten), auf Gleichheit herauszufiltern.

    Sind Übereinstimmungen von scriptname.vbs in verschiedenen Sektionen gefunden und gibt es gleichzeitig noch die Übereinstimmung der UserGroup=Domain\Usergroup, dann sollen alle überzähligen Sektionen gelöscht werden, so dass  jedes VB-Script für jede UserGroup nur einmal ausgeführt wird.

    Um zu verhindern, dass ein Aufruf von VBScripten welche x-beliebig heissen können, ( Scriptname01vbs bis ScriptnameN.vbs) unnötig doppelt oder mehrfach erfolgt, möchte

    Unter Mehrfacheinträgen verstehe ich Folgendes und möchte das an dem Beispiel erklären, an dem ich Treffer für Mehrfacheinträge in verschiedenen Sektionen habe.

    In den Sektionen, [SASIMP] und [SASOLAP]gibt es unter Arguments einen Pfad in dem das gleiche VBSscript (im Beispiel scriptname01) aufgerufen wird, falls der 2. Parameter, nämlich der Eintrag unter UserGroups=Domäne\globale_Security_Group ebenfalls gleich lautet handelt es sich um einen Treffer (Mehrfachaufruf des selben *.vbs aus mehreren Sektionen)

    Im Beispiel wird das aufgerufene VB-Script scriptname01.vbs genannt wird. Werden 2 gleiche Scriptnamen innerhalb mehrerer Sektionen im ini-file gefunden und sind zusätzlich noch die UserGroups=Domäne\gl_w_SASIMAP in diesen Sectionen ebenfalls gleich, dann würde die Suche einen Treffer haben und alle bis auf eine dieser Sectionen sollten dann gelöscht werden.

    Ergebnis:

    Das Löschen der ganzen überzähligen Sektionen bewirken, dass jedes VB-Script für jede UserGroup nur einmal ausgeführt wird.

    Frage: Kann dies überhaupt in Powershell realisiert werden ?Falls ja. -Wie kann dies über ein Powershell - Skript realisiert werden ?

    Fall Beispiel eines Treffers aus dem INI-File:

    [SASIMAP]
    FileName=C:\Program Files (x86)\VBScript\CScript.exe
    Arguments=”C:\Windows\Application Compatibility Scripts\Logon\scriptname01.vbs” //B //NoLogo //T:60
    UserGroups=Domäne\gl_w_SASIMAP
    Description=SASIMAP
    Wait=0
    WindowStyle=1
    [SASOLAP]
    FileName=C:\Program Files (x86)\VBScript\CScript.exe
    Arguments=”C:\Windows\Application Compatibility Scripts\Logon\scriptname01.vbs” //B //NoLogo //T:60
    UserGroups=Domäne\gl_w_SASIMAP
    Description=SASOLAP
    Wait=0
    WindowStyle=1

    (siehe Ini-File Bespiel)

    Bitte kann mir hier jemand in der Vorgehensweise, dies in Powershell zu programmieren, weiterhelfen.
    Einlesen der Ini-Files in verschiedene Arrays und Vergleich der Einträge auf identische Scriptnamen und identische UserGroups, wäre meine erste Idee. Leider bin ich noch nicht soweit das ich das selber umsetzen könnte.

    Gottfried Bregenzer
    Dienstag, 30. Juni 2015 14:02

Antworten

  • Moin

    du müsstest das sauber parsen bzw. unterteilen. Mittels Regex kannst du die unterschiedlichen Bereiche abgreifen:

    #Content parsen und Export-Dateien suchen $matches =[regex]::Matches($response,'REGEX-Part für[SASOLAP] oder [SASIMAP]') #Durchlauf für alle gefundenen Dateien foreach ($item in $matches) { in Hashtable packen á la

        $Item= Select-Object @{n="User-Groups"; e={Wert für User-Groups}}, `
                               @{n="Mac-Adresse"; e={}}, `
                               @{n="Service-Category"; e={$ExportData[0].ServiceCategory}}, `
                               @{n="Branding-ID"; e={$_.adv.ProgramName}}, `
                               @{n="Service-State"; e={$_.stat.LastStateName}}, `
                               @{n="ErrorType"; e={$_.stat.LastStateName}}, `
                               @{n="Comment"; e={$ExportData[0].adv.Comment}} 

    }


    Anschließend filtern anhand der Bedingungen wo ini und Domäne identisch sind die dann entfernen. Leider bin ich grad kurz angebunden. Das wird dir helfen:

    http://blogs.technet.com/b/heyscriptingguy/archive/2011/08/20/use-powershell-to-work-with-any-ini-file.aspx



    Samstag, 8. August 2015 07:28

Alle Antworten

  • Moin

    du müsstest das sauber parsen bzw. unterteilen. Mittels Regex kannst du die unterschiedlichen Bereiche abgreifen:

    #Content parsen und Export-Dateien suchen $matches =[regex]::Matches($response,'REGEX-Part für[SASOLAP] oder [SASIMAP]') #Durchlauf für alle gefundenen Dateien foreach ($item in $matches) { in Hashtable packen á la

        $Item= Select-Object @{n="User-Groups"; e={Wert für User-Groups}}, `
                               @{n="Mac-Adresse"; e={}}, `
                               @{n="Service-Category"; e={$ExportData[0].ServiceCategory}}, `
                               @{n="Branding-ID"; e={$_.adv.ProgramName}}, `
                               @{n="Service-State"; e={$_.stat.LastStateName}}, `
                               @{n="ErrorType"; e={$_.stat.LastStateName}}, `
                               @{n="Comment"; e={$ExportData[0].adv.Comment}} 

    }


    Anschließend filtern anhand der Bedingungen wo ini und Domäne identisch sind die dann entfernen. Leider bin ich grad kurz angebunden. Das wird dir helfen:

    http://blogs.technet.com/b/heyscriptingguy/archive/2011/08/20/use-powershell-to-work-with-any-ini-file.aspx



    Samstag, 8. August 2015 07:28
  • Die INI File PowerShell Functions hatte ich vor einiger Zeit verwendet. Eine schlanke und gut zu bedienende Lösung, die ich empfehlen kann


    -Raimund

    Sonntag, 9. August 2015 16:35
  • rstmals vielen Dank für die Anwort, die einen Lösungsweg andeutet,  zu dem ich noch einige Fragen habe.

    Interessant für mich, wäre den Vergleich der Strings im Regex Part zu finden.

    (Die Values scriptname01 bis scriptname0n können innerhalb des Ini-Files sehr beliebig sein, so dass ich nicht auf ein fixes Pattern wie [Sasolap] oder [sasimap] zurückgreifen kann.) Falls die "scriptnamen" in den gefundenen aufgelisteten Strings unbestimmt sind, habe ich keinen Vergleichsoperator als nur -eq.  - Oder gibt es da doch etwas ?

    Arguments=”C:\Windows\Application Compatibility Scripts\Logon\scriptname01.vbs” //B //NoLogo //T:60 bis

    Arguments=”C:\Windows\Application Compatibility Scripts\Logon\scriptname0n.vbs” //B //NoLogo //T:60

    Die Frage ist: Wie kann ich beim parsen des Ini-Files mit PowerShell jeden Value, der im Key "Arguements=" vorkommt, mit jedem anderen Value des anderen Keys "Arguments=" vergleichen ? Es geht darum, die gleichen scriptnamen.vbs in zu finden. Der Pfad davor bleibt immer gleich.

    Vielen Dank.

    Montag, 10. August 2015 13:13
  • Vielen Dank für den Vorschlag.- Geht in die richtige Richtung.

    Die Frage ist noch folgende: Wie kann ich mit den empfohlenen Funktionen in Ihrem Download alle Sektionen und deren  Keys "Arguments=" diejenigen finden, deren Value gleich sind ? Gibt es eine Funktion wie StringCompare ?

    Gerne hätte ich das mal ausprobiert, doch

    leider lässt sich das beschriebene Modul nicht downloaden.

    http://www.fpschultze.de/modules/PDdownloads/singlefile.php?cid=4&lid=82

    -Gottfried

    Montag, 10. August 2015 13:21
  • Stimmt, der Link geht nicht, aber dafür steht der Code ja im Klartext in dem Artikel, den einfach kopieren.

    Ich bin mir nicht sicher, ob ich das Problem verstanden habe, aber doppelte Schlüssel / Wert Paare zu finden, könnte mit dem Modul so gehen:

    PS C:\> ((Import-Ini D:\win.ini).GetEnumerator() | ForEach-Object
    { $_.Value }) | ForEach-Object { $_.GetEnumerator() } | Group-Object Name,Value
    
    Count Name                      Group
    ----- ----                      -----
        2 path, c:\tools            {System.Collections.DictionaryEntry, System.Collections.DictionaryEntry}
        1 OLEMessaging, 1           {System.Collections.DictionaryEntry}
        1 MAPI, 1                   {System.Collections.DictionaryEntry}
        1 MAPIX, 1                  {System.Collections.DictionaryEntry}
        1 CMCDLLNAME32, mapi32.dll  {System.Collections.DictionaryEntry}
        1 MAPIXVER, 1.0.0.1         {System.Collections.DictionaryEntry}
    In der Ini Datei kam die Kombination path=c:\tools zwei Mal vor.


    -Raimund

    Montag, 10. August 2015 20:59