Feiertage.vbs

Alle Skripte sind Muster ohne jede Gewährleistung oder Funktionsgarantie. für Schäden bin ich nicht verantwortlich. Achten Sie auf Zeilenumbrüche bei der Übernahme.

Achtung:
In meinen Testumgebungen und bei Kunden hat dieses Skript bislang problemlos funktioniert. Trotzdem kann es sein, dass das Script unerwartet abbricht. Dies liegt oft an Sonderzeichen oder Inhalten im AD, die ich noch nicht abgefangen habe.

VBScript und 64Bit !
Viele 32bit COM-Objekte lassen sich auf einem 64bit System nur instanziieren, wenn die 32bit Version von CSCRIPT/WSCRIPT genutzt wird, welcher unter C:\Windows\SysWOW64\cscript.exe liegt.

Anscheinend kann das Skript keine Feiertage in der Vergangenheit anlegen. Lassen Sie diese daher bis auf weiteres einfach aus der Quelldatei heraus. Den Fehler konnte ich bislang nicht eingrenzen (Zeitmangel)

Um auch bei Exchange 2007 mit einem Konto auf alle Postfächer zugreifen zu können, müssen Sie per Skript die Berechtigungen addieren. Siehe auch E2K7 Berechtigungen

Alle Jahre ist es das gleiche Problem. Die aktuellen Feiertage sind nicht im Kalender aufgeführt. Meist löst sich dadurch, dass Sie eine neue Version von Outlook installieren und damit die aktuellen Termine erhalten. Outlook legt die fehlenden Termine ja an. Aber was machen all die Anwender, die noch ein älteres Outlook nutzen ?.

Fakt ist, dass Sie mit Outlook eine Datei mit Terminen importieren können. Outlook nutzt dazu ein eigenes Format (HOL-Datei). Nur ist es Natürlich nicht gerade elegant, jedem Anwender eine Mail mit dieser Anlage zum Import bereit zu stellen. Mit den passenden Berechtigungen ausgestattet und etwas Code können Sie aber auch auf dem Server zentral solche und andere Inhalte importieren. Mit etwas Geschick können Sie den Code anpassen um fast alles damit anzustellen. Aber immer vorausgesetzt, Sie haben die erforderlichen Berechtigungen (Siehe Exchange 2000 Berechtigungen)

Funktionsweise

Das Skript ist einfach und geradlinig geschrieben. Die Logik ist wie folgt:

  • Einlesen der Termine
    Das Script liest die zu importierenden Termine aus einer Textdatei. Das Format ist sehr einfach und folgt der HOL-Datei von Outlook (Siehe auch http://www.docoutlook.de/Umgebung/Add-on/Add-on_page.htm). HOL-Dateien erlauben zwar mehrere Einträge, aber das Script macht sich den Import, indem die erste Zeile übersprungen wird und dann alle Folgezeilen einliest, die den Betreff des Termins und den Startzeitpunkt durch Komma getrennt enthalten, z.B.:

[Deutschland] 2
Test8-12-05, 2005/12/08
Test9-12-05, 2005/12/09

  • Mailboxen aus dem Active Directory auslesen
    Über den globalen Katalog liest das Script alle Postfächer aus, die nicht versteckt sind. Weitere Werte sind der Homeserver und die Mailadresse
  • Verbindung zur Mailbox herstellen
    Das Script nutzt CDO (Version 1.21 erforderlich !) um mit "CreateObject("MAPI.Session")" eine Verbindung zu jeder einzelnen Mailbox herzustellen und den Kalender zu verbinden.
  • Zeitzone der Mailbox prüfen/setzen (Seit Version 1.10)
    Um die korrekte Zeit zu schreiben, wird die Zeitzone in der Mailbox auf "Berlin" gesetzt. Dies ist in anderen Zeitzonen Natürlich anzupassen.
Const CdoTmzGMT1 = 3
objSession.SetOption "TimeZone", CdoTmzGMT1
  • Import der Termine
    Dann wird für jeden zu importierenden Termin geprüft, ob dieser schon im Kalender vorhanden ist. Fehlt dieser, so wird er importiert. Der Termin wird als ganztägiger Termin angelegt. Die Belegt-Kennzeichnung ist "Frei" und die Kategorie enthält "Feiertag". Das können Sie Natürlich im Code ebenfalls jederzeit ändern und erweitern

Download und Anpassung

Erste Schritt ist Natürlich der Download des Scripts.

feiertage.1.11.vbs
Nach dem Download als VBS-Datei speichern

Ehe Sie aber nun das Script aufrufen können, müssen Sie noch ein paar Dinge tun:

  • Feiertagsdatei anlegen
    Laden Sie sich z.B. die Holiday-Datei von http://www.docoutlook.de/Umgebung/Add-on/Add-on_page.htm herunter und speichern Sie diese als "outlook.txt" im Programmverzeichnis. Sie können auch eigene Termine eingeben.
  • Berechtigungen
    Sie benötigen ein Benutzerkonto, welches Berechtigungen auf alle Postfächer zu haben.
  • Simulation und Produktion
    Im Skript finden Sie eine Contante "ConSimluation", welcher per Default auf "true" gesetzt wird. Damit wir das Skript laufen aber keine Änderungen durchführen, Es reicht aber um z.B. zu testen, ob sie wirklich alle Postfächer öffnen können. Wenn Sie sicher sind, müssen Sie diesen Eintrag auf "False" setzen, damit es Skript "scharf" wird.
  • Testen !!!!
    Per Default wird das Programm die Termine in alle Postfächer ihrer Exchange Organisation importieren. Sie sollten Natürlich prüfen, ob das auch funktioniert. In der Zeile 153 erfolgt der Aufruf. Wenn Sie diesen durch eine Testzeile mit einem Testpostfach ersetzen, können Sie immer wieder Fehler korrigieren, ehe Sie das Script auf alle Postfächer loslassen.

Achtung:
Das Skript wirkt sich auch alle Postfächer der Organisation aus. Es ist prinzipiell möglich, auch eine Textdatei oder LDAP-Filter für eine Selektion zu nutzen. Das ist im Script aber aktuell nicht umgesetzt.

Um daher z.B. die Funktion auf ein einzelnes Postfach zu beschränken, sollten Sie am besten die LDAP-Abfrage entsprechend anpassen, damit eben nur dieses Postfach "gefunden" wird. dazu eignet sich am besten das Feld "MailNickName" an folgender Stelle:

Testen !!!
Wenn Sie hier z.B. "mailnickname=testmailbox@firma.de" eingeben, wobei "testmailbox@firma.de" der Alias oder die SMTP-Adresse ist, dann wird der Import nur auf diese eine Mailbox angewendet.

Aufruf

Anscheinend verhält sich Outlook und CDO unterschiedlich. Bei meinen Tests auf dem Exchange Server selbst per CDO wurden die Termine nie als "AllDayEvent" angelegt. Leser der MSXFAQ haben aber berichtet, dass dies funktioniert, wenn der Aufruf auf einer Workstation mit Outlook 2003 erfolgt. (Nicht auf dem Exchange Server selbst)

Das Script wird mit CSCRIPT aufgerufen. Kommandozeilen werden nicht genutzt.

C:\>cscript feiertag.VBS

während der Ausführung wird sowohl in der Konsole selbst als auch in einem eigenen Internet Explorer Fenster der aktuelle Status ausgegeben.

 

Den Internet Explorer dürfen Sie nicht beenden, da sonst auch das Script abbricht. Warten Sie daher bis das Script korrekt beendet wurde. Alle Aktionen werden zusätzlich in einer XML-Datei protokolliert, die mit dem passenden Stylesheet auch direkt im Internet Explorer zur Ausgabe geöffnet werden können. Warten Sie aber auch hier, bis das Script durchgelaufen ist, da ansonsten die XML-Datei nicht korrekt abgeschlossen ist.

In der XML-Datei stehen aber weitere Informationen, z.B. die einzelnen importierten und �übersprungenen Termine, die aber über das Stylesheet ausgeblendet bleiben. Die Ausgaben auf der Konsole landen zudem in einer Protokolldatei im Programmverzeichnis.

Risiken und Probleme

Das Skript wurde von mir sowohl in einer TestUmgebung als auch der ein oder anderen ProduktionsUmgebung in angepasster Form eingesetzt und hat wie gewünscht funktioniert. Dies ist aber keine Garantie. Probleme, die ich vermute:

  • Zeitzonen
    Das Script legt über CDO1.21 die Termine an und vergleicht vorhandene Termine mit zu importierenden Terminen. Dabei kommen verschiedene Datum und Zeitformate zum tragen. Das kann bei Vergleichen zu Problemen kommen.
  • Schreibweise
    Das Script prüft vor dem Import, ob es einen Termin zur gleichen Zeit mit gleichem "Betreff" gibt. Ich habe schon gesehen, dass einige Feiertage sich in der Schreibweise unterscheiden, z.B. "1. Advent" und "1. Adventstag". In diesem Fall kommt der Feiertag erneut hinzu.

Weitere Links