E-Mail-Benachrichtigung bei neuen/veralteten Dateien per Skript
Hier mal ein Skript, dass in diversen Situationen Hilfe bieten kann, in denen es darum geht eine E-Mail-Benachrichtigung abhängig vom Alter einer Datei zu erhalten. Sei es, weil sich eine Datei vor kurzem geändert hat/neu erstellt wurde oder im gegenteiligen Fall eben wenn die Datei im angegebenen Zeitraum nicht geändert wurde und somit als veraltet gilt.
Zu allererst ist das Skript mit den „Kontaktdaten“ eines Mailservers zu füttern, über den die Nachricht verschickt werden soll (Zeile 18-26) :
'************ '* CONFIG '************ Const MAILSERVER = "mailserver.bistron.eu" Const SMTPPORT = 25 Const TOADDR = "someone@bistron.eu" Const FROMADDR = "checkFileAge@bistron.eu" Const AUTHENT = 1 Const USERNAME = "MyUserName" Const PASSWD = "MyPassw0rd" Const MAXFILES = 5
Wenn eine Authentifizierung am Mailserver notwendig ist, kann kann diese über die AUTHENT aktiviert werden (1 – Basic; 2 – NTLM), andernfalls (AUTHENT = 0) können USERNAME und PASSWD leer („“) gelassen werden.
In der Benachichtigungs-E-Mail, werden immer die neusten gefundenen Objekte aufgelistet; mit MAXFILES kann deren Anzahl festgelegt werden (0 = alle).
Ist das erledigt kann das Skript wie folgt aufgerufen werden:
cscript.exe checkFileAge.vbs -p <Path> [-a <Age> -i <Interval> -c <CheckType>] [-e <FileExtension>] [-m <ToAddress1>,<ToAddress2>,…]
[-f] [-s] [-ca] [-ra]
Parameter | Bemerkung |
-p <Path> | Ordnerpfad der zu prüfenden Datei(en) |
-c <CheckType> | Art der Prüfung lt – Datei jünger als <Age><Interval> (neu)? gt – Datei älter als <Age><Interval> (veraltet)? (Default) |
-a <Age> | Dateialter ab dem die Datei als veraltet/neu gilt. (Integer) |
-i <Interval> | Zeitintervall (Age) d – Tag h – Stunde n – Minute s – Sekunde (weitere Möglichkeiten s. Links) |
-ca | Neue Dateien werden auch an gesetzem Archiv-Attribut erkannt |
-ra | Archiv-Attribut wird zurückgesetzt |
-e <FileExtension> | Dateierweiterung/-endung (auch kompletter Dateiname möglich) |
-m | Kommagetrennte Liste von Empfängeradressen (überschreibt den Standardempfänger TOADDR ) |
-f | Prüfung von Ordnern statt Dateien |
-s | Durchsuchen von Unterordnern aktivieren |
Das Skript sucht nun bei Ausführung (z.B. als geplanter Task) im angegebenen Ordner nach der neusten Datei – entsprechend der angegebenen Dateiendung – und überprüft, ob die letzte Änderung vor (veraltete Datei) bzw. innerhalb (neue Datei) des angegebenen Zeitrahmens durchgeführt wurde und sendet in diesem Fall eine E-Mail an die vorgegebene E-Mail-Adresse.
Nun noch zwei einfache Beispiele zur Anwendung:
1)
In unregelmäßigen Abständen wird eine Datei in das Verzeichnis \\bistron.eu\dfs\FTP\incoming hochgeladen und muß anschließend von jemandem weiterbearbeitet werden.
Hier reicht es das Skript mit folgenden Parametern bspw. halbstündlich als Task auszuführen:
cscript.exe checkFileAge.vbs -p \\bistron.eu\dfs\FTP\incoming -c lt -a 30 -i n
Trifft eine neue Datei ein, wird ein Mitarbeiter max. 30 Minuten nach Eintreffen per E-Mail benachrichtigt.
2)
Es werden täglich/wöchentlich Sicherungen durch verschiedene Programme/Skripte in Unterordnern von \\bistron.eu\dfs\backup\ abgelegt. Ist keine Änderung seit der letzen Sicherung im Zielordner festzustellen – also z.B. ein Backup fehlgeschlagen – soll der Administrator einmal täglich per E-Mail benachrichtigt werden…
Man kann nun mit zwei Batchdateien und geplanten Tasks die Arbeit verrichten lassen. Die erste enthält die Überprüfung der Verzeichnisse mit täglichen Änderungen und wird als geplanter Task täglich nach der Sicherung ausgeführt:
cscript.exe checkFileAge.vbs -p \\bistron.eu\dfs\backup\Server1 -a 24 -i h
cscript.exe checkFileAge.vbs -p \\bistron.eu\dfs\backup\Server2 -a 24 -i h
cscript.exe checkFileAge.vbs -p \\bistron.eu\dfs\backup\MSSQLDump -a 24 -i h
Und die zweite Datei noch zur Überprüfung der Ordner mit wöchentlichen Sicherungen – sie wird entsprechend als wöchentlicher Task angelegt:
cscript.exe checkFileAge.vbs -p \\bistron.eu\dfs\backup\Printserver -a 168 -i h
cscript.exe checkFileAge.vbs -p \\bistron.eu\dfs\backup\GPOs -a 168 -i h
Stellt das Skript nun bspw. bei der wöchentlichen Prüfung fest, daß der letzte Export der Printserver-Konfiguration länger als eine Woche (168 Stunden) her ist, wird der Administrator per E-Mail benachrichtigt.
Downloads:
- Skript: checkFileAge.vbs (ZIP) – Letzte Aktualisierung: 27.05.2014
9. November 2012 um 10:39 Uhr - -
Hallo,
ich habe das Skript ausprobiert.
Funktioniert im Büro (Exchange-Server vorhanden) tadellos.
Jetzt habe ich zu Hause keinen Exchange-Server und wollte es evtl. mit dem kleinen Programm blat (www.blat.net) kombinieren.
Gibt es hier eine möglichkeit dies zu machen ?
Gruß
10. November 2012 um 21:41 Uhr - -
Hallo Michael,
das Skript sollte auch mit anderen Mailservern nutzbar sein (war im Beitrag etwas missverständlich ausgedrückt). Problem wird vermutlich sein, dass eine Authentifizierung am Mailserver erfolgen muss; daher habe ich die sendMail-Funktion etwas angepasst. Die Konfiguration der Authentifizierung erfolgt über die Konstanten im Skript.
Falls ich daneben liege, und es für Dich trotzdem erforderlich ist den Mailversand über ein externes Tool durchzuführen, kann man dies natürlich auch durch eine Anpassung der Funktion sendMail() erreichen (Nachrichtentext in Datei schreiben; blat.exe mit Parametern ausführen).
MfG
26. Februar 2013 um 18:06 Uhr - -
Hallo und erstmal vielen Dank für das praktische Skript.
Ist es möglich auch Unterverzeichnisse durchsuchen zu lassen?
Danke & Vg Stephan
26. Februar 2013 um 19:11 Uhr - -
Hallo Stephan,
das Skript kann nur die Dateien bzw. Ordner verarbeiten, die direkt im angegebenen Pfad liegen. Die einzige Möglichkeit ist dann halt, das Skript mit entsprechend angepasstem Pfad für jeden Unterordner erneut aufzurufen (,oder ein Skript zu basteln, das das erledigt).
Werde aber mal schauen, ob ich die Option im Skript noch unterbringen kann…
MfG
26. Februar 2013 um 19:44 Uhr - -
Hallo Dennis,
Danke für die schnelle Antwort.
Ich bin in VB leider nicht der hellste. Ich brauche das um in gewissen Verzeichnissen zu kontrollieren ob in dynamisch erstellten Verzeichnissen irgendwo eine Datei „.failed“ landet.
Ich habe hier automatische Abläufe die jeden Tag mehrere Ordner erstellen und PDFs. Sobald da was fehlschlägt kommt dann diese .failed und ich brauch das als E-Mail Benachrichtigung.
Vlt. ist das ja einfacher zu erstellen.
Vielen Dank und vg Stephan
15. Oktober 2013 um 18:13 Uhr - -
was länge währt… wird endlich GUT!
Ich hab es endlich einrichten können.
Läuft alles bestens! Danke dir Dennis
15. Oktober 2013 um 21:42 Uhr - -
🙂
12. März 2013 um 15:03 Uhr - -
Hallo,
tolles Script, aber wenn man „alte“ Dateien ins überwachte Verzeichnis packt, sprint es nicht an.
Kann man es nicht mit dem Archiv Bit kombinieren ?
CONST F_ATTR_HIDDEN = 2
CONST F_ATTR_STANDARD = 32 ‚ Normal ist nur Attribut Archiv
Set MyFSO = CreateObject(„Scripting.FileSystemObject“)
File=“H:dummy2.txt“
set oFS=MyFSO.GetFile(file) ‚ obj File Source
If oFS.Attributes AND F_ATTR_STANDARD Then
wscript.echo „Archivbit = true“
hidden = true
End If
dann könnte man nach prüfung das Archivbit wieder löschen
13. März 2013 um 13:00 Uhr - -
Hallo Ingo,
werde mal schauen, wie sich die Option am sinnvollsten unterbringen lässt…
MfG
13. März 2013 um 13:12 Uhr - -
Hallo,
hab das Script dementsprechend umgebogen :
CONST F_ATTR_HIDDEN = 2
CONST F_ATTR_STANDARD = 32 ‚ Normal ist nur Attribut Archiv
Function getArchivFlag(strF)
Set MyFSO = CreateObject(„Scripting.FileSystemObject“)
Set oFS=MyFSO.GetFile(strF) ‚ obj File Source
If oFS.Attributes AND F_ATTR_STANDARD Then
getArchivFlag = „true“
‚Danach wird das Archivflag wegegnommen
oFS.Attributes=oFS.attributes-32
End If
End Function
Danach darauf abgefragt und alle Dateien in die E-Mail gepackt, nicht nur die Letzte :
‚* Neustes Objekt ermitteln
For Each objF In colObj
strFName = objF.Name
‚* Test Endung
If IsEmpty(strExt) Or LCase(Right(strFName, intLenExt)) = LCase(strExt) Then
intFAge = getArchivFlag(objF.Path)
If intFAge = „true“ then
’strNewestF = objF.Name
strNewestF = strNewestF & objF.Name & vbCRLF
End if
End If
Next
13. März 2013 um 13:15 Uhr - -
und natürlich noch :
If intFAge = „true“ then
strSubject = TXT_NEWF_SUBJECT & strPath
strText = TXT_NEWF_PREPATH & strPath & TXT_NEWF_POSTPATH & VbCrLf & VbCrLf & _
TXT_NEWESTF & VbCrLf & VbCrLf & strNewestF & VbCrLf
End If
1. Dezember 2021 um 19:02 Uhr - -
Moin,
ich bin ein wenig Begriffsstutzig. Folgendes möchte ich mit dem Script erreichen:
Ich habe eine Datei in einem bestimmten Verzeichnis, dass jede Stunde aktualisiert werden muss. Wird aber einmal vergessen die Datei zu aktualisieren, soll eine E-Mail rausgeschickt werden. Also, vereinfacht gesagt, sit eine Datei älter als eine Stunde, soll eine Mail geschickt werden.
Kann mir hier jemand die Parameter aufschreiben?
Vorab lieben Dank
Ali