VB + VBS um Email in Txt zu speicher, auszuwerten und Aktion auszulösen. Teil 2
Fortführung zu Thema: VB + VBS um Email in Txt zu speicher, auszuwerten und Aktion auszulösen.
Letzter Stand:
Dim strClientname, fso, regex, strContent, matches
Set fso=CreateObject("Scripting.FileSystemObject")
Set regex = CreateObject("vbscript.regexp")
regex.IgnoreCase = True
regex.Pattern = "Kryptik"
strContent = fso.OpenTextFile("C:\PFAD\DATEI.txt").ReadAll()
Set matches = regex.Execute(strContent)
If matches.Count > 0 Then
regex.Pattern = "Clientlist: SERVER / ([^,\r\n]+)"
Set matches = regex.Execute(strContent)
If matches.Count > 0 Then
strClientname = Trim(matches(0).submatches(0))
msgbox strClientname
End If
End If
Hallo noch mal, habe doch noch ein Anliegen: Ich muss leider ne Sicherung einbauen.
Es ist möglich das 2 oder mehr mal Zeile 9 (Clientlist: SERVER / ) Bedingung in der Textdatei erfüllt wird (sehr selten aber doch möglich)
Dadurch muss die Abfrage eine Abbruchbedingung bekommen, damit nicht der falsche Client bearbeitet wird.
Ich weiß das das mit For Each funktioniert. Allerdings nicht wie im Zusammenhang mit diesen "Regex.pattern" das gemacht wird.
Es reicht halt kein If / Else mehr, da das matches abbricht, sobald es einmal den String gefunden hat.
wenn 1 -> Bedingung A
wenn 0 -> Bedingung B
wenn >1 -> Bedingung C
Ich stehe etwas mit Schleifen auf Kriegsfuß und hoffe mir hilft wer
Danke
mfg Rob
Letzter Stand:
Dim strClientname, fso, regex, strContent, matches
Set fso=CreateObject("Scripting.FileSystemObject")
Set regex = CreateObject("vbscript.regexp")
regex.IgnoreCase = True
regex.Pattern = "Kryptik"
strContent = fso.OpenTextFile("C:\PFAD\DATEI.txt").ReadAll()
Set matches = regex.Execute(strContent)
If matches.Count > 0 Then
regex.Pattern = "Clientlist: SERVER / ([^,\r\n]+)"
Set matches = regex.Execute(strContent)
If matches.Count > 0 Then
strClientname = Trim(matches(0).submatches(0))
msgbox strClientname
End If
End If
Hallo noch mal, habe doch noch ein Anliegen: Ich muss leider ne Sicherung einbauen.
Es ist möglich das 2 oder mehr mal Zeile 9 (Clientlist: SERVER / ) Bedingung in der Textdatei erfüllt wird (sehr selten aber doch möglich)
Dadurch muss die Abfrage eine Abbruchbedingung bekommen, damit nicht der falsche Client bearbeitet wird.
Ich weiß das das mit For Each funktioniert. Allerdings nicht wie im Zusammenhang mit diesen "Regex.pattern" das gemacht wird.
Es reicht halt kein If / Else mehr, da das matches abbricht, sobald es einmal den String gefunden hat.
wenn 1 -> Bedingung A
wenn 0 -> Bedingung B
wenn >1 -> Bedingung C
Ich stehe etwas mit Schleifen auf Kriegsfuß und hoffe mir hilft wer
Danke
mfg Rob
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 249828
Url: https://administrator.de/forum/vb-vbs-um-email-in-txt-zu-speicher-auszuwerten-und-aktion-auszuloesen-teil-2-249828.html
Ausgedruckt am: 24.12.2024 um 03:12 Uhr
15 Kommentare
Neuester Kommentar
Hallo Rob,
du kannst mit REGEX auch mehrere Vorkommen eines Pattern matchen lassen. Dies legst du mit
fest. Dann werden alle Vorkommen in das Matches-Array mit aufgenommen, und du kannst mit matches(x) auf den gewünschten Match zugreifen.
Über alle Matches lässt sich dann ebenfalls iterieren:
Oder du passt das Regex so an das nur der gewünschte Part gematcht wird. Hiermit wird z.B. der letzte Eintrag dieser Art genommen:
Du musst halt wissen welchen Eintrag du haben willst ...
Grüße Uwe
p.s. für die Arbeit mit Regular Expressions kann ich RegexBuddy wärmstens empfehlen.
du kannst mit REGEX auch mehrere Vorkommen eines Pattern matchen lassen. Dies legst du mit
regex.Global = True
Über alle Matches lässt sich dann ebenfalls iterieren:
For Each myMatch In matches
if myMatch.SubMatches(0) = "?????" then
'usw.
end if
Next
Oder du passt das Regex so an das nur der gewünschte Part gematcht wird. Hiermit wird z.B. der letzte Eintrag dieser Art genommen:
regex.Pattern = "[\s\S]*Clientlist: SERVER / ([^,\r\n]+)"
Grüße Uwe
p.s. für die Arbeit mit Regular Expressions kann ich RegexBuddy wärmstens empfehlen.
Das ist kein Problem die Blöcke im Log lassen sich mit Regex zerlegen und nur im jeweiligen Block auf eine beliebige Anzahl an Stichworten durchsuchen (mache dir morgen mal ein Beispiel)... aber bevor wir hier weiter machen mal so als Anmerkung:
Die Vorgehensweise ist doch ziemlich Fehleranfällig, erstens wird immer erst nach 5 Minuten geprüft und in dieser Zeit kann der Virus schon eine beträchtliche Anzahl an Files verschlüsselt haben; zweitens hat der Virenscanner den Schädling erkannt und sollte ihn soweit blockieren das kein Schaden entsteht (wenn nicht, solltet ihr über ein anderes Antivirus-Produkt nachdenken!); drittens kommt so etwas normalerweise nur vor wenn auf den Clients mit Updates geschlampt wird und Policies, Rechte und Backups zu lasch umgesetzt sind.; viertens kämst du mit dem
Nachpflegen von Virenvarianten in dein Script nicht rechtzeitig hinterher (die Virenproduzenten sind einfach schneller)
Hier wäre ein grundlegendes Umdenken angesagt, oder ein anderes Antivirenprodukt die Lösung der Wahl. Es gibt nämlich Produkte die solch ein trennen der Verbindung oder verschieben in ein Quarantänenetz beherrschen. Im Zusammenhang mit einem Network Policy Server (NPS) ist das schön umzusetzen, und kann wesentlich schneller auf die Bedrohung reagieren.
Zusammen mit regelmäßigen Schattenkopien und Backups auf den Fileservern, kannst du so etwas gelassen sehen.
Das Gefrickel mit dem Script wäre mir die absolut allerletzte Wahl, das wird dir hier jeder Bestätigen. Erst neulich ist damit ein Kollege so ziemlich auf die Fresse gefallen.
Grüße Uwe
-edit- dieser Code extrahiert die jeweiligen Blöcke und checkt diese nach einer Liste von Keywords. Der Code geht davon aus das zwischen den Blöcken und am Ende mindestens eine Leerzeile vorhanden ist.
Als Hilfe: Der Regex-Match sieht bildlich so aus:
Die Vorgehensweise ist doch ziemlich Fehleranfällig, erstens wird immer erst nach 5 Minuten geprüft und in dieser Zeit kann der Virus schon eine beträchtliche Anzahl an Files verschlüsselt haben; zweitens hat der Virenscanner den Schädling erkannt und sollte ihn soweit blockieren das kein Schaden entsteht (wenn nicht, solltet ihr über ein anderes Antivirus-Produkt nachdenken!); drittens kommt so etwas normalerweise nur vor wenn auf den Clients mit Updates geschlampt wird und Policies, Rechte und Backups zu lasch umgesetzt sind.; viertens kämst du mit dem
Nachpflegen von Virenvarianten in dein Script nicht rechtzeitig hinterher (die Virenproduzenten sind einfach schneller)
Hier wäre ein grundlegendes Umdenken angesagt, oder ein anderes Antivirenprodukt die Lösung der Wahl. Es gibt nämlich Produkte die solch ein trennen der Verbindung oder verschieben in ein Quarantänenetz beherrschen. Im Zusammenhang mit einem Network Policy Server (NPS) ist das schön umzusetzen, und kann wesentlich schneller auf die Bedrohung reagieren.
Zusammen mit regelmäßigen Schattenkopien und Backups auf den Fileservern, kannst du so etwas gelassen sehen.
Das Gefrickel mit dem Script wäre mir die absolut allerletzte Wahl, das wird dir hier jeder Bestätigen. Erst neulich ist damit ein Kollege so ziemlich auf die Fresse gefallen.
Grüße Uwe
-edit- dieser Code extrahiert die jeweiligen Blöcke und checkt diese nach einer Liste von Keywords. Der Code geht davon aus das zwischen den Blöcken und am Ende mindestens eine Leerzeile vorhanden ist.
Als Hilfe: Der Regex-Match sieht bildlich so aus:
Dim strClientname, fso, regex, strContent, matches, arrKeywords
'Array-Liste der Keywords
arrKeywords = Array("TrojanDownloader","Kryptik")
Const FileName = "C:\Virenschutz\Bedrohung.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set regex = CreateObject("vbscript.regexp")
regex.IgnoreCase = True
regex.MultiLine = True
regex.Global = True
regex.Pattern = "^\[\d{4}-\d{2}-\d{2}[\s\S]+?Clientlist:.*?/\s?([^\r\n]+)[\s\S]+?^\s+$"
strContent = fso.OpenTextFile(FileName).ReadAll()
' Regex ausführen
Set matches = regex.Execute(strContent)
If matches.Count > 0 Then
For Each match In matches
Dim isKeywordMatch
isKeywordMatch = False
'Clientname extrahieren
strClientname = Trim(match.Submatches(0))
'Checke den Inhalt des Blocks auf die Liste der Keywords
For i = 0 To UBound(arrKeywords)
If InStr(1,match,arrKeywords(i),1) Then
isKeywordMatch = True
Exit For
End If
Next
If isKeywordMatch Then
' Wenn eines der Keywords gefunden wurde mache etwas ...
MsgBox "Ein Keyword aus der Liste wurde gefunden bei Client: " & strClientname
Else
' Es wurde für diesen Client kein Keyword gefunden, mach was anderes.
End If
Next
End If
Da du hier für deinen bsp. Code keine Code-Tags verwendet hast, habe ich das schon halb vermutet. Bei Regular Expressions kommt es auf jedes Zeichen an ! Am besten wäre natürlich eine Original-Datei mit unveränderter Formatierung ...
Es darf nicht nur nach dem Keyword gesucht werden, ein absolutes muss ist der "Echtzeit-Dateischutz"
einfach eine Zusatzabfrage mit Instr() durchführen.Zitat von @Borob14:
Das verstehe ich jetzt nicht, hat doch vorher mit den IF Abfragen auch funktioniert nur das er jetzt quasi zwischen:
"Clientlist: Dd1vws01 / " und "Clientlist: Dd1vws01 / "
nach den Keywords suchen soll. Gerade das Beispiel Kryptik hat immer andere Varianten, es darf nur nach diesem Keyword gesucht
werden und es muss egal sein ob davor etwas anderes steht, zum Beispiel Blablu0815.Kryptik oder ähnliches, die Schreibweise
ändert sich ja leider dauernd und auch die Stelle/Position wo Kryptik steht kann sich ändern. Ist das somit
überhaupt suchbar?
funktioniert hier mit deinem Beispiel-Posting einwandfrei ...Das verstehe ich jetzt nicht, hat doch vorher mit den IF Abfragen auch funktioniert nur das er jetzt quasi zwischen:
"Clientlist: Dd1vws01 / " und "Clientlist: Dd1vws01 / "
nach den Keywords suchen soll. Gerade das Beispiel Kryptik hat immer andere Varianten, es darf nur nach diesem Keyword gesucht
werden und es muss egal sein ob davor etwas anderes steht, zum Beispiel Blablu0815.Kryptik oder ähnliches, die Schreibweise
ändert sich ja leider dauernd und auch die Stelle/Position wo Kryptik steht kann sich ändern. Ist das somit
überhaupt suchbar?
eventuell musst du bei dir das regex so abändern:
regex.Pattern = "^\[\d{4}-\d{2}-\d{2}[\s\S]+?Clientlist:.*?/\s?([^\r\n]+)[\s\S]+?^\s*$"
die Schreibweise ändert sich ja leider dauernd und auch die Stelle/Position wo Kryptik steht kann sich ändern. Ist das somit überhaupt suchbar?
klar, kein Problem ...> P.S. nen Originalen Log kann ich dir nicht geben, da stehen zu viele Firmen internen Sachen drin. "Clientlist: Dd1vws01 /
Dann empfehle ich dir dich mal mit dem Regular Expressions Tutorial auseinanderzusetzen.Zitat von @Borob14:
Hab mal was mit ner Testmaschine provoziert, hoffe das ist besser (habe nur den Firmennamen geändert, die Buchstaben sind die
jetzt ist alles klar, du hast hier ja Leerzeilen zwischen den einzelnen Zeilen und nicht nur zischen den Blöcken !!! So kann der Pattern natürlich nicht richtig arbeiten, da er ja eine leere Zeile quasi als Trenner benutzt ...Hab mal was mit ner Testmaschine provoziert, hoffe das ist besser (habe nur den Firmennamen geändert, die Buchstaben sind die
melde mich später oder morgen nochmal.
p.s. sind die Logs die du verarbeitest immer nur von einem Rechner oder sammelst du die von allen in einem Logfile ??
Schönen Abend
Grüße Uwe
hatte doch noch gerade einen Moment. das hier läuft mit deinem aktualisierten Schnippsel:
(ergänzt: Prüfung ob im jeweiligen Block der String Echtzeit-Dateischutz vorkommt, und prüft nur dann die Keywords)
-edit- nochmal abgeändert das nur hinter Logfile: gesucht wird.
(ergänzt: Prüfung ob im jeweiligen Block der String Echtzeit-Dateischutz vorkommt, und prüft nur dann die Keywords)
Dim strClientname, fso, regex, strContent, matches, arrKeywords, strLogInfo
'Array-Liste der Keywords
arrKeywords = Array("TrojanDownloader","Kryptik")
Const Filename = "C:\Virenschutz\Bedrohung.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set regex = CreateObject("vbscript.regexp")
regex.IgnoreCase = True
regex.MultiLine = True
regex.Global = True
regex.Pattern = "^\[\d{4}-\d{2}-\d{2}[\s\S]+?Clientlist:.*?/\s?([^\r\n]+)[\s\S]*?^Logfile:(.*)"
strContent = fso.OpenTextFile(Filename).ReadAll()
' Regex ausführen
Set matches = regex.Execute(strContent)
If matches.Count > 0 Then
For Each match In matches
Dim isKeywordMatch
isKeywordMatch = False
'Clientname extrahieren
strClientname = Trim(match.Submatches(0))
'Part in dem gesucht wird
strLogInfo = match.Submatches(1)
'checke ob der String Echtzeit-Dateischutz im Block vorkommt
If InStr(1,strLogInfo,"Echtzeit-Dateischutz",1) Then
'Checke den Inhalt des Blocks auf die Liste der Keywords
For i = 0 To UBound(arrKeywords)
If InStr(1,strLogInfo,arrKeywords(i),1) Then
isKeywordMatch = True
Exit For
End If
Next
End If
If isKeywordMatch Then
' Wenn eines der Keywords gefunden wurde mache etwas ...
MsgBox "Ein Keyword aus der Liste wurde gefunden bei Client: " & strClientname
Else
' Es wurde für diesen Client kein Keyword gefunden, mach was anderes.
End If
Next
End If
-edit- nochmal abgeändert das nur hinter Logfile: gesucht wird.