cseservice
Goto Top

ICS Import Office 365

Hallo Zusammen, benötige mal Hilfe und hoffe das ich hier ne Lösung finde:

Ich benötige ein Programm zum automatischen Import von ICS Dateien in das jeweilige Office 365 Konto !

Wir bekommen von unserem Zeiterfassungssystem pro Mitarbeiter immer eine ICS Datei ausgespielt

Jeder Mitarbeiter bei mir hat ein eigenes Office 365 Konto und wir würden uns Wünschen, das es ein Programm oder auch Batch Datei gibt, wo die jeweilige passende ICS Datei des Mitarbeiters gegen das Office 365 Konto des Mitarbeiters Synchronisiert / Importiert wird

Hat hier jemand vielleicht eine Lösungsansatz oder vielleicht auch ein passendes Programm dazu face-wink ?

Wir hatten schon so mal was aber leider hat Microsoft jetzt auf OAuth Umgestellt und wir sind in einer Sackgasse

Carsten
screenshot

Content-ID: 4466853330

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

Ausgedruckt am: 19.11.2024 um 10:11 Uhr

colinardo
Lösung colinardo 31.10.2022, aktualisiert am 18.11.2022 um 12:16:04 Uhr
Goto Top
Servus,
ja das lässt sich mit ein wenig EWS Powershell und OAuth2 Login per App-Registration realisieren.
Das Erstellen der App-Registrierung für die Application Impersonation in Azure soll hier nicht das Thema sein, wie man diese anlegt habe ich hier schon in einem Beitrag erläutert: MS 365 Exchange Service Account

Nur in Kürze wo sich die entsprechende Seiten dazu finden:

screenshot

screenshot

screenshot

screenshot

Nächster Schritt: Ist das Anlegen der App-Registration geschehen kann man mit diesen Credentials folgendes Skript laufen lassen um das zu erreichen was du dir oben vorstellst:
(Variablen im Kopf des Skripts mit den entsprechenden Werten füllen)

back-to-topimport_ics_m365_4466853330.zip


Ausschnitt der Variablen
# Variables ========================================
# tenant domain
$DOMAIN = 'domain.tld'  
# app registration identifier
$CLIENT_ID = 'xxxxxxxxxxxxxx'  
# app registration secret key
$CLIENT_KEY = 'xxxxxxxxxxxxxx'  
# Folder in which the ics files reside
$FOLDER_ICS = 'D:\data'  
# User mapping (file basename => assigned user email)
$USERMAPPING = @{
    'MM' = 'MaxMuster@domain.tld'  
    'AM' = 'AnnaMusterfrau@domain.tld'  
}
# ...

Support für persönliche Anpassung gerne per PN nach Aufwand.

Viel Erfolg.
Grüße Uwe
CSEService
CSEService 31.10.2022 um 16:03:16 Uhr
Goto Top
Hi Uwe !

Danke für deine Nachricht !

Mal ne Frage : Unter Skript meinst zum Beispiel eine Batch Datei die ich laufen lassen kann ? Also ich pack das einfach in den Aufgabenplaner dann ?

Und das wäre dann die Zuweisung der jeweiligen User ? :

$USERMAPPING = @{
'MM' = 'MaxMuster@domain.tld'
'AM' = 'AnnaMusterfrau@domain.tld'
colinardo
colinardo 31.10.2022, aktualisiert am 12.11.2022 um 13:26:59 Uhr
Goto Top
Zitat von @CSEService:
Mal ne Frage : Unter Skript meinst zum Beispiel eine Batch Datei die ich laufen lassen kann ? Also ich pack das einfach in den Aufgabenplaner dann ?
Das ist Powershell kein Batch, und "ja" das lässt sich natürlich auch per Taskplaner ausführen.
Und das wäre dann die Zuweisung der jeweiligen User ? :

$USERMAPPING = @{
'MM' = 'MaxMuster@domain.tld'
'AM' = 'AnnaMusterfrau@domain.tld'
Richtig. Das kann man entweder direkt im Skript hinterlegen oder aber auch in eine Textdatei auslagern und per ConvertFrom-StringData oder Import-Csv einlesen wenn man möchte, das wäre auch kein Problem.
CSEService
CSEService 31.10.2022 um 16:14:55 Uhr
Goto Top
OK, wird getestet !

Frage dazu noch: Wäre es denn Schlimm wenn die Dateien dann Überschrieben werden mit neuen Dateien ?
Lief vorher auch so bei der alten Anwendung
Löschen wäre natürlich Komfortabler, muss mich dann nur etwas Zurechtfinden da ich mich mit Powershell nicht so gut auskenne
colinardo
colinardo 31.10.2022 aktualisiert um 16:30:38 Uhr
Goto Top
Zitat von @CSEService:
Frage dazu noch: Wäre es denn Schlimm wenn die Dateien dann Überschrieben werden mit neuen Dateien ?
Wenn sich wirklich alle Dateien ändern und das auch immer neue Termine sind dann nicht. Würde aber bspw. nur eine nicht neu erstellt dann würde der Termin erneut importiert und ein Duplikat erzeugt, das solltest du im Hinterkopf behalten.
CSEService
CSEService 31.10.2022 um 16:31:39 Uhr
Goto Top
OK, dann muss es Gelöscht werden !
colinardo
colinardo 31.10.2022 aktualisiert um 16:36:04 Uhr
Goto Top
Zitat von @CSEService:

OK, dann muss es Gelöscht werden !
Kein Problem wenn du in einer neuen Zeile nach Zeile 109 die folgende Zeile einfügst
remove-item -LiteralPath $file.Fullname -Force
wird das jeweilige File nach Verarbeitung gelöscht.

Vielleicht mal als Wochenendlektüre empfehlenswert:
Powershell Leitfaden für Anfänger
CSEService
CSEService 31.10.2022 um 16:38:39 Uhr
Goto Top
OK !

Danke

Der Leitfaden wird auch ein Pflichtprogramm für mich
nEmEsIs
nEmEsIs 31.10.2022 um 17:18:36 Uhr
Goto Top
Hallo Carsten

Bitte schwärze mal deinen Screenshot gescheit.
Man kann auf alles schließen.
Denke das ist in eurem Interesse bzgl Spam usw.

Mit freundlichen Grüßen
Nemesis
colinardo
colinardo 31.10.2022 aktualisiert um 17:29:55 Uhr
Goto Top
Zitat von @nEmEsIs:
Bitte schwärze mal deinen Screenshot gescheit.
Habe ich gerade mal schnell übernommen.

Grüße Uwe
CSEService
CSEService 04.11.2022 um 20:24:55 Uhr
Goto Top
Ich glaub ich brauch nochmals eure Hilfe !

Bekomme bei der Ausführung des Scripts folgende Fehler und weiß nicht warum:


PS C:\Users\Netzadministrator\Desktop> C:\Users\Netzadministrator\Desktop\ICSDateien2M365KalenderCSE.ps1
Downloading and extracting required 'Microsoft.Exchange.WebServices.dll' ... Load-EWSLibrary : Error downloading required EWS Library / Error
Ausnahme beim Aufrufen von "DownloadFile" mit 2 Argument(en): "Die
zugrunde liegende Verbindung wurde geschlossen: Unerwarteter Fehler beim Senden.."
In C:\Users\Netzadministrator\Desktop\ICSDateien2M365KalenderCSE.ps1:41 Zeichen:2

back-to-topLoad-EWSLibrary

back-to-top~~~~~~~~~~~~~~~

+ CategoryInfo
NotSpecified: (face-smile [Write-Error], WriteErrorException


+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Load-EWSLibrary

Jemand ne Idee was hier das Problem ist ?
colinardo
colinardo 04.11.2022 aktualisiert um 22:46:38 Uhr
Goto Top
Jemand ne Idee was hier das Problem ist ?
Ja, du verwendest offensichtlich noch ein OS bzw. veraltetes Management Framework was per Default auf unsichere TLS Standards setzt und deswegen keine sichere SSL Verbindung für den Download der EWS Library von Nuget.org zu Stande kommt, weil deren Server nunmal alte Standards nicht mehr anbieten.
Das kannst du beheben indem du der Session sagst das sie min. TLS1.2 für SSL Verbindungen verwenden soll indem du folgende Zeile im Skript-Kopf platzierst.
[System.Net.ServicePointManager]::SecurityProtocol = 'Tls12'  
CSEService
CSEService 05.11.2022 um 06:06:15 Uhr
Goto Top
OK, Danke für die Info, es geht aber leider weiter face-wink

Habe die Zeile mit TLS12 in Zeile 6 eingefügt und es gibt die alte Fehlermeldung nicht mehr

Jetzt kommt leider diese:

PS C:\Users\Netzadministrator\Desktop> C:\Users\Netzadministrator\Desktop\ICSDateien2M365KalenderCSE.ps1
Downloading and extracting required 'Microsoft.Exchange.WebServices.dll' ... OK
ConnectTo-M365EWS : Fehler beim Aufrufen der Methode, da [Microsoft.Exchange.WebServices.Data.OAuthCredentials] keine Methode mit dem Namen "new" enthält.
In C:\Users\Netzadministrator\Desktop\ICSDateien2M365KalenderCSE.ps1:91 Zeichen:8

back-to-top$svc = ConnectTo-M365EWS -TENANT $DOMAIN -CLIENT_ID $CLIENT_ID -CLIENT_KEY $CLIE ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile [ConnectTo-M365EWS], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound,ConnectTo-M365EWS

Ein Befehl an den EWS ?
colinardo
colinardo 05.11.2022, aktualisiert am 10.11.2022 um 11:07:49 Uhr
Goto Top
Wie gesagt dein Client ist veraltet und nicht up to date, das sind nämlich genau die Fehler die kommen wenn das der Fall ist . Ich kann dir zwar jetzt alles auf den alten Kram umschreiben aber das ist ja eigentlich nicht Sinn der Sache.
D.h. z.B. alle Objekterstellungen auf New-Object umzustellen wie bspw. Zeile 52
$ews.Credentials = New-Object Microsoft.Exchange.WebServices.Data.OAuthCredentials $access_token.access_token
4514573821
4514573821 05.11.2022 aktualisiert um 09:51:10 Uhr
Goto Top
Hallo colinardo,
ich habe mich extra hier angemeldet um mich ganz herzlich für das Skript zu bedanken! Ich war schon länger auf der Suche nach sowas und das klappt wirklich hervorragend 😊🥳, also nochmal vielen vielen Dank du hast mein Wochenende gerettet!!!

Lieben Gruß von Andi
colinardo
colinardo 05.11.2022 aktualisiert um 10:52:10 Uhr
Goto Top
Hallo @4514573821 willkommen auf Administrator.de!
Danke für die Blumen, das freut mich für dich face-smile.

Ebenso lieben Gruß und ein schönes Wochenende!
Uwe
CSEService
CSEService 06.11.2022 aktualisiert um 07:32:50 Uhr
Goto Top
Hallo und guten Morgen,
muss auch erst mal Danke Sagen an @colinardo ! Habe auch sehr lange gesucht nach Aktivierung der OAuth durch MS bis ich mal auf die Idee gekommen bin hier das einzustellen

Bei mir läuft es jetzt auch fast , bin dann mal auf die glorreiche Idee gekommen das nicht auf meinem alten W2003 Server zu testen ( der ja sowieso nächstes Jahr weg muss) sondern auf einem aktuellen Terminalserver 2019 und schon liefe es !

Leider besteht aber noch ein kleine Problem, denke es ist ne Zuordnungssache wie so in jeder Schnittstelle:
Unsere ICS Dateien beinhalten Status Informationen wie CONFIRMED und CANCELED, also Erstellung des Termins bzw. Löschung des Termins

Liege ich da Richtig das dies im Script nicht berücksichtigt wird ?

Derzeit werden die neuen Urlaubstage bzw. die Gelöscht werden sollen alle auf Morgen den 7.11.22 angelegt, teils sogar als Besprechung angelegt

Hier mal eine Ausschnitt aus der ICS zur Nachvollziehbarkeit was wir da alles drin haben, bestes Beispiel ist der 16.11.+18.11:

ID:548944879
DTSTART;TZID=Europe/Berlin:20221114T080000
DTEND;TZID=Europe/Berlin:20221114T170000
DTSTAMP:20221106T071544Z
SUMMARY: Urlaub (UL)
LOCATION: keine Angabe
DESCRIPTION: Urlaub
CATEGORIES:Urlaubstag
TRANSP:OPAQUE
SEQUENCE:1
STATUS:CANCELED
END:VEVENT
BEGIN:VEVENT
CREATED:20221106T071544Z
UID:549344881
DTSTART;TZID=Europe/Berlin:20221116T080000
DTEND;TZID=Europe/Berlin:20221116T170000
DTSTAMP:20221106T071544Z
SUMMARY: Urlaub (UL)
LOCATION: keine Angabe
DESCRIPTION: Urlaub
CATEGORIES:Urlaubstag
TRANSP:OPAQUE
SEQUENCE:1
STATUS:CANCELED
END:VEVENT
BEGIN:VEVENT
CREATED:20221106T071544Z
UID:549444883
DTSTART;TZID=Europe/Berlin:20221118T080000
DTEND;TZID=Europe/Berlin:20221118T170000
DTSTAMP:20221106T071544Z
SUMMARY: Urlaub (UL)
LOCATION: keine Angabe
DESCRIPTION: Urlaub
CATEGORIES:Urlaubstag
TRANSP:OPAQUE
SEQUENCE:1
STATUS:CONFIRMED
END:VEVENT
BEGIN:VEVENT
CREATED:20221106T071544Z
UID:505844895
colinardo
colinardo 06.11.2022, aktualisiert am 10.11.2022 um 11:13:24 Uhr
Goto Top
Immer gerne.

Zitat von @CSEService:
Bei mir läuft es jetzt auch fast , bin dann mal auf die glorreiche Idee gekommen das nicht auf meinem alten W2003 Server zu testen
Autsch, wie ich vermutet hatte vollkommen veraltet 🙈.

Leider besteht aber noch ein kleine Problem, denke es ist ne Zuordnungssache wie so in jeder Schnittstelle:
Unsere ICS Dateien beinhalten Status Informationen wie CONFIRMED und CANCELED, also Erstellung des Termins bzw. Löschung des Termins

Liege ich da Richtig das dies im Script nicht berücksichtigt wird ?
Jepp, not supported, die Import-Variante oben kann nur neue Termine erstellen.des weiteren ist damit nur ein Termin/Event pro ICS File möglich.
#update# Skript wurde oben aktualisiert, so dass dies nun unterstützt wird.

Grüße Uwe
CSEService
CSEService 06.11.2022 um 13:58:21 Uhr
Goto Top
Dacht ich mir es doch richtig !

Ok, dann muss ich das morgen mit unserem Dienstleister besprechen
Serie: ICS Import Office 365
ICS Import Office 36519