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]

ParameterBemerkung
-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)
-caNeue Dateien werden auch an gesetzem Archiv-Attribut erkannt
-raArchiv-Attribut wird zurückgesetzt
-e <FileExtension>Dateierweiterung/-endung
(auch kompletter Dateiname möglich)
-mKommagetrennte Liste von Empfängeradressen
(überschreibt den Standardempfänger TOADDR)
-fPrüfung von Ordnern statt Dateien
-sDurchsuchen 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:

Links:

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne
(1 Bewertungen, ⌀: 5,00 / 5)
Loading...

12 Kommentare

  1. michael

    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ß

    • Dennis Bistron

      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

  2. Stephan

    Hallo und erstmal vielen Dank für das praktische Skript.

    Ist es möglich auch Unterverzeichnisse durchsuchen zu lassen?

    Danke & Vg Stephan

    • Dennis Bistron

      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

      • Stephan

        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

  3. Ingo

    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

  4. Ingo

    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

  5. Ingo

    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

  6. Ali Savas

    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

Schreibe eine Antwort zu michaelAntwort abbrechen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Neue BeiträgeOft gelesene BeiträgeNeueste KommentareBlog abonnieren

Gib Deine E-Mail-Adresse an, um diesen Blog zu abonnieren und Benachrichtigungen über neue Beiträge via E-Mail zu erhalten.