melmax
Goto Top

Feiertage in Outlook falsch

Hallo zusammen,

ich bin gerade von einem User darauf aufmerksam gemacht worden dass die Pfingstfeiertage 2015 in Outlook falsch sind.
Nach einigen Google Abfragen weiß ich zwar wie ich das Problem lösen kann (mit Feiertage löschen und .hol File tauschen...), irgendwie macht das aber bei 900 Clients keinen Spass.
Da steiken auch meine Azubis face-wink

Hat einer von euch hier schon eine Enterprise-taugliche Lösung oder hab ich mal wieder ein MS Hotfix übersehen?

Vielen Dank für euren Input,

Melmax

Content-ID: 255392

Url: https://administrator.de/forum/feiertage-in-outlook-falsch-255392.html

Ausgedruckt am: 23.12.2024 um 01:12 Uhr

colinardo
Lösung colinardo 20.11.2014, aktualisiert am 09.06.2017 um 11:15:07 Uhr
Goto Top
Hallo Melmax,
ließe sich mit einem Powershell-Script machen, hier mal schnell skizziert:
(Das korrigierte HOL-File kannst du ja auf ein Netzlaufwerk legen / Pfad Zeile 11)
function Remove-OutlookHolidays(){
    $objOL = New-Object -ComObject "Outlook.Application"  
    $calendar = $objOL.GetNamespace("MAPI").GetDefaultFolder(9)  
    $holidays = $calendar.Items.Restrict("@SQL=""http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Keywords"" = 'Feiertag'")  
    while($holidays.Count -gt 0){
        $holidays.Remove(1)
    }
}

function Add-OutlookHolidays(){
    $holFile = "\\Server\Share\OUTLOOK_FIX.HOL"  
    $objOL = New-Object -ComObject "Outlook.Application"  
    $calendar = $objOL.GetNamespace("MAPI").GetDefaultFolder(9)  
    $holidays = [regex]::Match((gc $holfile -raw),'(?ism)^\[Deutschland\].*?$(.*?)(^\[|\Z)').Groups[1].Value.Trim().Split("`n") | ?{$_ -match ','}  
    $holidays | %{
        $line = $_.Split(",")  
        $app = $calendar.Items.Add(1)
        $app.AllDayEvent = $true 
        $app.Start = get-date $line[1]
        $app.Subject = $line
        $app.ReminderSet = $false
        $app.Categories = "Feiertag"  
        $app.Location = "Deutschland"  
        $app.Save()
    }
}
write-host "Entferne Outlook-Feiertage ..."  
Remove-OutlookHolidays
write-host "Füge Outlook-Feiertage hinzu...Bitte warten..."  
Add-OutlookHolidays
Grüße Uwe
melmax
melmax 24.11.2014 um 13:43:48 Uhr
Goto Top
Hallo Uwe,

vielen Dank, Script wird bereits getestet.

Grüße Melmax
FrauMue
FrauMue 26.01.2015 um 17:38:07 Uhr
Goto Top
Hallo Uwe,

vielen Dank. Ich beschäftige mich jetzt zum ersten Mal mit PowerShell. Mir ist nicht klar was z.B. in Zeile 4 gemacht wird. In die Variable $holidays schreibst du die Feiertage aus dem Kalender...? Was macht @sql und der link?

Würde gerne nur die beiden falschen tage ersetzten, wenn sie denn existieren - komme aber mit meinen beschränkten Kenntnissen nicht weiter.

Danke im Voraus!

Grüße
colinardo
colinardo 26.01.2015 aktualisiert um 17:54:59 Uhr
Goto Top
Hallo FrauMue,
Zitat von @FrauMue:
vielen Dank. Ich beschäftige mich jetzt zum ersten Mal mit PowerShell. Mir ist nicht klar was z.B. in Zeile 4 gemacht wird.
In die Variable $holidays schreibst du die Feiertage aus dem Kalender...?
Ja damit werden auf effektive Weise alle Feiertage gefiltert um nicht alle Termine mit einer Schleife durchitterieren zu müssen.
Siehe: Items.Restrict Method (Outlook)
Was macht @sql und der link?
Das sind PropTags die intern von Outlook Verwendung finden. Diese kann man sich z.B. mit MFCMAPI anzeigen lassen.

c2bd7719325ae280103b58b1c26a5d63

Würde gerne nur die beiden falschen tage ersetzten, wenn sie denn existieren - komme aber mit meinen beschränkten
Kenntnissen nicht weiter.
Das Script entfernt alle Feiertage. Dann holst du dir das korrigierte HOL-File mit den korrigierten Feiertagen und lässt es mit der Import-Funktion wieder alle importieren. Feddich.

Grüße Uwe

/Eine Einführung in Powershell können wir hier leider nicht jedem geben...siehe dazu://

Powershell Grundlagen- und Praxisvermittlung:
colinardo
colinardo 26.01.2015, aktualisiert am 11.06.2017 um 14:17:35 Uhr
Goto Top
Zitat von @FrauMue:
Würde gerne nur die beiden falschen tage ersetzten, wenn sie denn existieren - komme aber mit meinen beschränkten
Kenntnissen nicht weiter.
Sorry hatte ich glatt überlesen, für den Fall reicht folgendes Script:
back-to-topKorrigiert Pfingstfeiertage 2015 (Pfingstsonntag und Pfingstmontag) im Standardkalender von Outlook.
  • Pfingstsonntag vom 28.05.2015 auf 24.05.2015
  • Pfingstmontag vom 29.05.2015 auf 25.05.2015
$objOL = New-Object -ComObject "Outlook.Application"  
$calendar = $objOL.GetNamespace("MAPI").GetDefaultFolder(9)  
$calendar.Items.Restrict("[Subject] = 'Pfingstsonntag' AND [Start] = '" + (get-date '28.05.2015' -Format 'g') + "'") | %{$_.Start = get-date '24.05.2015';$_.Save()}  
$calendar.Items.Restrict("[Subject] = 'Pfingstmontag' AND [Start] = '" + (get-date '29.05.2015' -Format 'g') + "'") | %{$_.Start = get-date '25.05.2015'; $_.Save()}  
Über eine kleine Spende freue ich mich immer.


Grüße Uwe
HarryK
HarryK 19.03.2015 um 14:25:51 Uhr
Goto Top
Hallo Uwe,

vorab, das Powershell Script funktioniert einwandfrei.

Das Script wird bei uns per GPO beim Logon eines Users ausgeführt.

Auf Windows 7 + Clients kein Problem, gibt es jedoch für Windows XP Clients auch eine Lösung?

Danke!
colinardo
colinardo 19.03.2015 aktualisiert um 14:32:19 Uhr
Goto Top
Hallo HarryK,
das läßt sich auch einfach als VBS umschreiben, oder du installierst die PS 2.0 auf den XP Rechnern.

Grüße Uwe
HarryK
HarryK 19.03.2015 um 14:41:03 Uhr
Goto Top
Ja, wenn man Ahnung von VB hat, ist es bestimmt einfach face-wink. Installation von PS auf den Rechnern will ich eig. vermeiden.

Ich schau mir trotzdem einmal die VBS Variante an.
colinardo
colinardo 19.03.2015 aktualisiert um 15:28:05 Uhr
Goto Top
So hier noch das Script als VBS umgeschrieben:
Set objOL = CreateObject("Outlook.Application")  
Set cal = objOL.GetNamespace("MAPI").GetDefaultFolder(9)  
Set items = cal.items.Restrict("[Subject] = 'Pfingstsonntag' AND [Start] = '" & FormatDateTime("28.05.2015", vbShortDate) & " 00:00'")  
Set itm = items.GetFirst()
If Not itm Is Nothing Then
    itm.start = CDate("24.05.2015")  
    itm.Save
End If
Set items = cal.items.Restrict("[Subject] = 'Pfingstmontag' AND [Start] = '" & FormatDateTime("29.05.2015", vbShortDate) & " 00:00'")  
Set itm = items.GetFirst()
If Not itm Is Nothing Then
    itm.start = CDate("25.05.2015")  
    itm.Save
End If
Ist ja Ende Mai sowieso obsolet face-wink

Grüße Uwe

Installation von PS auf den Rechnern will ich eig. vermeiden.
Lieber die Kisten migrieren ... ist schon längst überfällig...
HarryK
HarryK 19.03.2015 um 15:51:39 Uhr
Goto Top
Top Uwe, hat super funktioniert!
Rene12345
Rene12345 08.06.2017 aktualisiert um 12:44:09 Uhr
Goto Top
Hallo Uwe,
gibt es dazu ggf. schon einen neuen Stand?
Wollte das Skript gerade ausführen und erhalte folgende Fehlermeldungen:

Entferne Outlook-Feiertage ...

Array-Index außerhalb des zulässigen Bereichs.
In C:\Users\meinnutzername\Desktop\Neuer Ordner (5)\Feiertage.ps1:6 Zeichen:9
+         $holidays.Remove(1)
+         ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) , COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

Füge Outlook-Feiertage hinzu...Bitte warten...

Get-Date : Der Parameter "Date" kann nicht an das Ziel gebunden werden. Ausnahme beim Festlegen von   
"Date": "NULL kann nicht in den Typ "System.DateTime" konvertiert werden."  
In C:\Users\meinnutzername\Desktop\Neuer Ordner (5)\Feiertage.ps1:19 Zeichen:31
+         $app.Start = get-date $line[1]
+                               ~~~~~~~~
    + CategoryInfo          : WriteError: (:) [Get-Date], ParameterBindingException
    + FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Commands.GetDateCommand
colinardo
colinardo 08.06.2017 aktualisiert um 13:12:25 Uhr
Goto Top
Das eventuell nur an einer leeren Zeile im HOL File, habe es oben dahingehend korrigiert.

Grüße Uwe
Rene12345
Rene12345 09.06.2017 um 10:50:27 Uhr
Goto Top
Hallo Uwe,
das Problem ist damit leider noch nicht behoben.

Die outlook.hol liegt einfach auf C, der Pfad dementsprechend C:\outlook.hol und ist auch gefüllt;

[Deutschland] 11
Reformationstag, 2017/10/31
1. Weihnachtstag, 2017/12/25
1. Weihnachtstag, 2018/12/25
und so weiter

Das Skript legt nun keinen Feiertag mehr an. (Vorher nur einen mit dem Namen Deutschland) Lege ich einen Feiertag mit der Kategorie Feiertag an und führe das Skript aus, löscht er diesen, der Fehler von oben taucht jedoch wieder auf. :s

Hast du da ggf. freundlicherweise noch eine Lösung bereit?

Grüße
colinardo
colinardo 09.06.2017 aktualisiert um 11:09:29 Uhr
Goto Top
Sorry läuft hier überall einwandfrei. Du musst das original HOL File nehmen .... Nicht nur die Deutschland Section rauskopieren, wie du oben zeigst, denn das obige Regex ist darauf ausgelegt. Willst du es anders muss es angepasst werden.

p.s. In den aktuellen Jahren gibt es keine falschen Feiertage mehr. Das war nur für 2015 der Fall.
Rene12345
Rene12345 09.06.2017 um 11:14:43 Uhr
Goto Top
Danke, mit der originalen funktioniert alles einwandfrei.
Vielen Dank für die Hilfe.

Hintergrund der Termine ist übrigens, dass gewünscht ist alle freien Tage zu veröffentlichen. So haben wir bspw. am 16.06. nächste Woche auch frei.

Grüße
colinardo
colinardo 09.06.2017 aktualisiert um 11:17:18 Uhr
Goto Top
Zur Info: Habe die Regex noch so angepasst das du den Deutschlandabschnitt auch alleine in das File kopieren kannst.
Hintergrund der Termine ist übrigens, dass gewünscht ist alle freien Tage zu veröffentlichen. So haben wir bspw. am 16.06. nächste Woche auch frei.
Na dann, alles klar, zweckentfremdet quasi face-smile.

Grüße Uwe
Rene12345
Rene12345 13.06.2017 um 15:12:02 Uhr
Goto Top
Hallo Uwe,
auch wenn ich dich ungerne erneut nerven möchte, habe ich zur Zeit folgendes Problem (auf dem Client):

Nutze ich nur den Befehl zum löschen, erscheint keine Fehlermeldung. Wenn ich vorher manuell einen Feiertag mit der Kategorie "Feiertag" anlege, wird dieser auch gelöscht.

Lasse ich das Skript vollständig, erscheinen folgende Fehlermeldungen:

Get-Content : Es wurde kein Parameter gefunden, der dem Parameternamen "raw" entspricht.  
Bei C:\Users\Mueller\Desktop\Mueller\Feiertage.ps1:14 Zeichen:49
+     $holidays = [regex]::Match((gc $holfile -raw <<<< ),'(?ism)^\[Deutschland\].*?$(.*?)(^\[|\Z)').Groups[1].Value.Trim().Split("`n") | ?{$_ -match ','}  
    + CategoryInfo          : InvalidArgument: (:) [Get-Content], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetContentCommand
 
Sie können keine Methode für einen Ausdruck mit dem Wert NULL aufrufen.
Bei C:\Users\Mueller\Desktop\Mueller\Feiertage.ps1:16 Zeichen:25
+         $line = $_.Split <<<< (",")  
    + CategoryInfo          : InvalidOperation: (Split:String) , RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
In einem NULL-Array kann kein Index erstellt werden.
Bei C:\Users\Mueller\Desktop\Mueller\Feiertage.ps119 Zeichen:37
+         $app.Start = get-date $line[ <<<< 1]
    + CategoryInfo          : InvalidOperation: (1:Int32) , RuntimeException
    + FullyQualifiedErrorId : NullArray
 
In einem NULL-Array kann kein Index erstellt werden.
Bei C:\Users\Mueller\Desktop\Mueller\Feiertage.ps1:20 Zeichen:30
+         $app.Subject = $line[ <<<< 0]
    + CategoryInfo          : InvalidOperation: (0:Int32) , RuntimeException
    + FullyQualifiedErrorId : NullArray

Es wird zusätzlich ein Feiertag namens "Deutschland" angelegt.
Meine Outlook.hol Datei sieht wie folgt aus:

[Deutschland] 276
Reformationstag, 2017/10/31
1. Weihnachtstag, 2017/12/25
1. Weihnachtstag, 2018/12/25
1. Weihnachtstag, 2019/12/25
1. Weihnachtstag, 2020/12/25
1. Weihnachtstag, 2021/12/25
1. Weihnachtstag, 2022/12/25
1. Weihnachtstag, 2023/12/25
//und so weiter bis//
Tag d. Dt. Einheit, 2022/10/03
Tag d. Dt. Einheit, 2023/10/03
Tag d. Dt. Einheit, 2024/10/03
Tag d. Dt. Einheit, 2025/10/03

Dein Skript sieht wie folgt aus:
function Remove-OutlookHolidays(){
    $objOL = New-Object -ComObject "Outlook.Application"  
    $calendar = $objOL.GetNamespace("MAPI").GetDefaultFolder(9)  
    $holidays = $calendar.Items.Restrict("@SQL=""http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Keywords"" = 'Feiertag'")  
    while($holidays.Count -gt 0){
        $holidays.Remove(1)
    }
}

function Add-OutlookHolidays(){
    $holFile = "C:\Users\Mueller\Desktop\Mueller\outlook.hol"  
    $objOL = New-Object -ComObject "Outlook.Application"  
    $calendar = $objOL.GetNamespace("MAPI").GetDefaultFolder(9)  
    $holidays = [regex]::Match((gc $holfile -raw),'(?ism)^\[Deutschland\].*?$(.*?)(^\[|\Z)').Groups[1].Value.Trim().Split("`n") | ?{$_ -match ','}  
    $holidays | %{
        $line = $_.Split(",")  
        $app = $calendar.Items.Add(1)
        $app.AllDayEvent = $true 
        $app.Start = get-date $line[1]
        $app.Subject = $line
        $app.ReminderSet = $false
        $app.Categories = "Feiertag"  
        $app.Location = "Deutschland"  
        $app.Save()
    }
}


write-host "Entferne Outlook-Feiertage ..."  
Remove-OutlookHolidays
write-host "Füge Outlook-Feiertage hinzu...Bitte warten..."  
Add-OutlookHolidays

Die Outlook.hol liegt natürlich auch in dem Ordner "Mueller".

Vielen Dank für deine kommende Antwort und Grüße
René
colinardo
colinardo 13.06.2017 aktualisiert um 16:55:41 Uhr
Goto Top
Get-Content : Es wurde kein Parameter gefunden, der dem Parameternamen "raw" entspricht.
Du verwendest nicht mindestens PS 3.0 face-wink, das ist dein Fehler! Denn dort gibt es den Parameter -raw noch nicht
Wenn du tatsächlich noch die PS 2.0 verwendest, schreibst du das gc $holfile -raw um in (gc $holfile | out-string)

Grüße Uwe
Rene12345
Rene12345 13.06.2017 um 17:10:34 Uhr
Goto Top
Problem gelöst. Mein eigener Computer ist Windows 10, die Clients haben noch Windows 7...
Hatte dem Testuser schon Domänadmin Rechte und alles gegeben, vielen Dank auf jeden Fall sehr freundlich! face-smile