bbfreak
Goto Top

Werte aus txt Datei auslesen in jeder Zeile

Hallo zusammen,

ich bin recht unbewandert mit vbs-Scripten.

Ich hab ein Log wo Gruppenänderungen reingeschrieben werden.

Format:
2012-08-27 08:52:37 Ein Mitglied einer sicherheitsaktivierten lokalen Gruppe wurde hinzugefügt. Antragsteller: Sicherheits-ID: S-1-5-21-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxx Kontoname: USER1 Kontodomäne: DOMAENE Anmelde-ID: 0x9c0xxx2 Mitglied: Sicherheits-ID: S-1-5-21-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxx Kontoname: CN=OUNAME,OU=UEBEROU,OU=Gruppen,OU=bla,DC=DOMAENE,DC=local Gruppe: Sicherheits-ID: S-1-5-21-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxx Gruppenname: GRUPPENNAME Gruppendomäne: DOMAENE Weitere Informationen: Berechtigungen: - 
Das ist ansich das Log von Windows-Security wenn nen User hinzugefügt oder gelöscht wird.

Darauf brauch ich aber nur vier Werte die ich dann in ne mysql packen möchte.

Datum+Uhrzeit (im Beispiel 2012-08-27)
Kontoname (im Beispiel: USER1)
Kontoname (im Beispiel: CN=OUNAME,OU=UEBEROU,OU=Gruppen,OU=bla,DC=DOMAENE,DC=local)
Gruppenname (im Beispiel: GRUPPENNAME)


Das Log hat je nach der Anzahl von Änderungen mal mehr und mal weniger Einträge.

Die Datum+Uhrzeit Einträge sind immer 19 Zeichen lang. Das sind die ersten 19 Zeichen pro Zeile. Danach kommt aber erstmal der unnötige Text bis zweimal die gleichen Kontoname: Einträge kommen die mich interessieren.

Ist das überhaupt machbar mit nem vbs-Script?

Als Test wollte ich die vier Werte komma(Symicolon)getrennt in ne neue Datei schreiben.

Kann/Mag mir da jemand bei helfen?

Vielen Dank!

Pat

[Edit Biber] Nachgecodetagged [/Edit]

Content-Key: 190332

Url: https://administrator.de/contentid/190332

Printed on: April 23, 2024 at 08:04 o'clock

Member: BBfreak
BBfreak Aug 28, 2012 at 15:33:10 (UTC)
Goto Top
 Option Explicit  
 Dim oFSO, sFile, oFile, sText  
 Set oFSO = CreateObject("Scripting.FileSystemObject")    
 sFile = "report.txt"  

 If oFSO.FileExists(sFile) Then  

  Set oFile = oFSO.OpenTextFile(sFile, 1)  

   Do While Not oFile.AtEndOfStream  

   sText = oFile.ReadLine  

     If Trim(sText) <> "" Then    

      WScript.echo(Left(sText,19)) 'Ausgabe Datum  

     End If  

   Loop  
  oFile.Close  

 Else  
  WScript.Echo "ACHTUNG! Datei nicht vorhanden!"    
 End If 

So hab ich nun schon das Datum rausbekommen. Nur wie komme ich an die anderen Werte?
Member: bastla
bastla Aug 28, 2012 updated at 16:27:42 (UTC)
Goto Top
Hallo BBfreak!

Stellt Dein "Format"-Beispiel (BTW: Formatiere das bitte ebenfalls als "Code"!) nur eine einzige Zeile dar, und gibt es in der "report.txt" mehrere solcher Zeilen?

[Edit] Ich nehm's mal an - dann etwa so:
Set oFSO = CreateObject("Scripting.FileSystemObject")    
sInFile = "D:\report.txt"  
sOutFile = "D:\data.csv"  
sDelim = ";"  

If Not oFSO.FileExists(sInFile) Then
    WScript.Echo "ACHTUNG! Datei nicht vorhanden!"    
End If

Lines = Split(oFSO.OpenTextFile(sInFile).ReadAll, vbNewLine) 'alle Zeilen in Array Lines einlesen  

Set rE = New RegExp
For Each Line In Lines
    sDatum = Left(Line, 19)

    rE.Pattern = "Kontoname: (\S+) Kontodomäne"  
    sKontoname = rE.Execute(Line)(0).SubMatches(0)

    rE.Pattern = "Kontoname: (\S+) Gruppe:"  
    sLDAPPfad = rE.Execute(Line)(0).SubMatches(0)

    rE.Pattern = "Gruppenname: (\S+) Gruppendomäne:"  
    sGruppe = rE.Execute(Line)(0).SubMatches(0)

    LinesOut = LinesOut & vbNewline & sDatum & sDelim & sKontoname &sDelim & sLDAPPfad & sDelim & sGruppe
Next
oFSO.CreateTextFile(sOutFile).Write Mid(LinesOut, 3) 'wegen der Zeilenschaltung am Anfang erst ab Char 3 schreiben  
Hier solltest Du vielleicht noch vorbeischauen: Microsoft Beefs Up VBScript with Regular Expressions, oder auch da: Reguläre Ausdrücke - und einen hab ich noch: Regular Expressions in VBScript face-wink
[/Edit]

Grüße
bastla
Member: BBfreak
BBfreak Aug 29, 2012 updated at 09:47:10 (UTC)
Goto Top
Hallo Bastla,

vielen Dank für deine Hilfe. Auf der Beefs-Up Seite war ich bereits, aber hab bisher nur Expressions gefudnen, die mir den Start der Buchstabenreihe ausgegeben haben. Sprich ich hatte das Ergebniss 64, weil dort "Kontoname" anfing.

Dein Script gibt mir leider ne Error-Meldung:

Zeile: 20
Zeichen: 5
Ungültiger Prozeduraufruf oder ungültiges Argument.
Code: 800A0005

ich habe deine Datei als *.vbs abgespeichert und die Pfade angepasst.
Hast Du ne Idee?


Nachtrag:

2012-08-27 17:08:05 Ein Mitglied einer sicherheitsaktivierten lokalen Gruppe wurde hinzugefügt. Antragsteller: Sicherheits-ID: S-1-5-21-4161370050-3204092196-2192616155-1180 Kontoname: USERANMELDENAMEOHNEFREIZEICHEN Kontodomäne: bla Anmelde-ID: 0xa2340ff Mitglied: Sicherheits-ID: S-1-5-21-4161370050-3204092196-2192616155-1224 Kontoname: CN=VORNAME NACHNAME,OU=bla,OU=bla,DC=denk,DC=bla Gruppe: Sicherheits-ID: S-1-5-21-4161370050-3204092196-2192616155-1546 Gruppenname: GRUPPENNAMEOHNEFREIZEICHEN Gruppendomäne: bla Weitere Informationen: Berechtigungen: -


das Freizeichen bei Vorname Nachname beim zweiten Kontoname ist das Problem.

Kannst du mir noch sagen, wie ich ne if abfrage da mit einbaue? Entweder steht da blabla wurde "hinzugefügt" oder "entfernt". Das würd ich auch gern mitloggen.


Gruß
Pat
Member: bastla
bastla Aug 29, 2012 at 09:41:12 (UTC)
Goto Top
Hallo BBfreak!

Ich habe nur mit der einen oben von Dir geposteten Zeile getestet - das aber erfolgreich (und da die Zeile 17 nicht wirklich anderes macht als die Zeile 20 wäre im Fall des Falles der Fehler eigentlich schon dort zu erwarten) ...

Kannst Du vielleicht Deine Testdaten (als "Code" formatiert) posten?

Grüße
bastla
Member: BBfreak
BBfreak Aug 29, 2012 at 09:48:40 (UTC)
Goto Top
Hallo Bastla,

ich hab meine Antwort eben nochmal aktualisiert. WEnn ich das Freizeichen zwischen Vor und Nachname wegnehme, klappt die Abfrage wieder. Das Freizeichen ist in der Regal aber immer da, weil man ja Leute in eine Gruppe packt und nicht nur Gruppen (die haben keine Freizeichen bei uns)

Gruß
Pat
Member: bastla
bastla Aug 29, 2012 updated at 10:30:41 (UTC)
Goto Top
Hallo BBfreak!
WEnn ich das Freizeichen zwischen Vor und Nachname wegnehme, klappt die Abfrage wieder.
Du meinst damit vermutlich ein Leerzeichen - dann musst Du nur die Zeile 19 anpassen, etwa:
rE.Pattern = "Kontoname: \S+.*Kontoname: (.+) Gruppe:"
Für "hinzugefügt" / "entfernt" kannst Du (soferne nur eines davon enthalten sein kann) so vorgehen:
If InStr(Line, "hinzugefügt") >0 Then Aktion = "hinzugefügt"  
If InStr(Line, "entfernt") >0 Then Aktion = "entfernt"  
Grüße
bastla
Member: BBfreak
BBfreak Aug 29, 2012 updated at 13:37:42 (UTC)
Goto Top
Hallo Bastla,

Das funktioniert 1A!

Hast mich nun angefixed und das erste Buch zum lernen ist bestellt.

Vielen Dank!


Sollte das nochmal wer brauchen, hier mein Endprodukt:


Set oFSO = CreateObject("Scripting.FileSystemObject")    
sInFile = "D:\report.txt"  
sOutFile = "D:\data.csv"  
sDelim = ";"  

If Not oFSO.FileExists(sInFile) Then
    WScript.Echo "ACHTUNG! Datei nicht vorhanden!"    
End If

Lines = Split(oFSO.OpenTextFile(sInFile).ReadAll, vbNewLine) 'alle Zeilen in Array Lines einlesen  

Set rE = New RegExp
For Each Line In Lines
    sDatum = Left(Line, 19)

     If InStr(Line, "hinzugefügt") >0 Then sAktion = "hinzugefügt"   
     If InStr(Line, "entfernt") >0 Then sAktion = "entfernt"  

    rE.Pattern = "Kontoname: (\S+) Kontodomäne"  
    sKontoname = rE.Execute(Line)(0).SubMatches(0)

    rE.Pattern = "Kontoname: \S+.*Kontoname: (.+) Gruppe:"    
    sLDAPPfad = rE.Execute(Line)(0).SubMatches(0)

    rE.Pattern = "Gruppenname: (\S+) Gruppendomäne:"  
    sGruppe = rE.Execute(Line)(0).SubMatches(0)

    LinesOut = LinesOut & vbNewline & sDatum & sDelim & sAktion & sDelim & sKontoname &sDelim & sLDAPPfad & sDelim & sGruppe
Next
oFSO.CreateTextFile(sOutFile).Write Mid(LinesOut, 3) 'wegen der Zeilenschaltung am Anfang erst ab Char 3 schreiben