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-Key: 255392

Url: https://administrator.de/contentid/255392

Printed on: April 19, 2024 at 16:04 o'clock

Member: colinardo
Solution colinardo Nov 20, 2014, updated at Jun 09, 2017 at 09:15:07 (UTC)
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
Member: melmax
melmax Nov 24, 2014 at 12:43:48 (UTC)
Goto Top
Hallo Uwe,

vielen Dank, Script wird bereits getestet.

Grüße Melmax
Member: FrauMue
FrauMue Jan 26, 2015 at 16:38:07 (UTC)
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
Member: colinardo
colinardo Jan 26, 2015 updated at 16:54:59 (UTC)
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:
Member: colinardo
colinardo Jan 26, 2015, updated at Jun 11, 2017 at 12:17:35 (UTC)
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
Member: HarryK
HarryK Mar 19, 2015 at 13:25:51 (UTC)
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!
Member: colinardo
colinardo Mar 19, 2015 updated at 13:32:19 (UTC)
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
Member: HarryK
HarryK Mar 19, 2015 at 13:41:03 (UTC)
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.
Member: colinardo
colinardo Mar 19, 2015 updated at 14:28:05 (UTC)
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...
Member: HarryK
HarryK Mar 19, 2015 at 14:51:39 (UTC)
Goto Top
Top Uwe, hat super funktioniert!
Member: Rene12345
Rene12345 Jun 08, 2017 updated at 10:44:09 (UTC)
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
Member: colinardo
colinardo Jun 08, 2017 updated at 11:12:25 (UTC)
Goto Top
Das eventuell nur an einer leeren Zeile im HOL File, habe es oben dahingehend korrigiert.

Grüße Uwe
Member: Rene12345
Rene12345 Jun 09, 2017 at 08:50:27 (UTC)
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
Member: colinardo
colinardo Jun 09, 2017 updated at 09:09:29 (UTC)
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.
Member: Rene12345
Rene12345 Jun 09, 2017 at 09:14:43 (UTC)
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
Member: colinardo
colinardo Jun 09, 2017 updated at 09:17:18 (UTC)
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
Member: Rene12345
Rene12345 Jun 13, 2017 at 13:12:02 (UTC)
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é
Member: colinardo
colinardo Jun 13, 2017 updated at 14:55:41 (UTC)
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
Member: Rene12345
Rene12345 Jun 13, 2017 at 15:10:34 (UTC)
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