Benutzer mit den meisten Antworten
Termine aus Kalender auslesen mit EWS

Frage
-
Hallo zusammen
Ist es möglich die Termine aus einem Postfach direkt vom Exchange-Server auszulesen. Das Script läuft mit einem Exchange-Administrator, welcher auf die Postfächer Zugriff hat.
Kann das mit Powershell realisiert werden?
Das Ziel ist es die Termine (User, Datum, Beginn, Ende, Betreff, Kategorie) verschiedener Benutzer auszulesen und diese für die Ressourcenplanung weiterverwenden zu können.
Beispiel:
User1; Montag, 20160530; 10:00; 11:00; Teamsitzung; [Kategorie] rot
User2; Montag, 20160530; 10:00; 11:00; Teamsitzung; [Kategorie] rot
User3; Dienstag, 20160531; 09:00; 11:00; Besprechung; [Kategorie] rotHat jemand ein Beispiel?
Danke im Voraus
Gruss Miller
Antworten
-
Ja. Und vermutlich kriegt man das sogar mit den Admin-Berechtigungen auf das Zielpostfach hin. Allerdings wird es meistens mit Impersonation gemacht (https://technet.microsoft.com/de-de/library/dd776119%28v=exchg.150%29.aspx ).
Dann brauchst Du auf der Maschine, wo das Skript läuft, die EWS Management API (https://www.microsoft.com/en-us/download/details.aspx?id=42951)
Danach ist es easy:
$mail = 'target.user@domain.com' Add-Type -Path 'C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll' $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013 $Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion) #ACHTUNG! Der Datumsbereich darf max. 2 Jahre betragen! $ivItemView = New-Object Microsoft.Exchange.WebServices.Data.CalendarView((Get-Date '01.01.2015'),(Get-Date '31.12.2016'),1000) # die nächsten zwei Zeilen werden nur benötigt, wenn das Skript NICHT unter dem richtigen Account gestartet wird! $Service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials("adminuser","adminpassword","admindomain") $Service.UseDefaultCredentials = $false $Service.AutodiscoverUrl($mail,{$true}) Write-Host "Verwende URL: $($Service.Url.OriginalString)" $Service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $mail) $folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar,$mail) $calfolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($Service,$folderid) Write-Host "Kalender-Ordner: $($calfolder.DisplayName)" $appts = $calfolder.FindAppointments($ivItemView) foreach ($appt in $appts) { "$($appt.Subject) : $($appt.Start) - $($appt.End)" }
Evgenij Smirnov
msg services ag, Berlin -> http://www.msg-services.de
my personal blog (mostly German) -> http://it-pro-berlin.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.comIn theory, there is no difference between theory and practice. In practice, there is.
- Bearbeitet Evgenij Smirnov Sonntag, 29. Mai 2016 18:36
- Als Antwort markiert MickMiller Dienstag, 31. Mai 2016 07:53
-
Ja, Du musst dem Admin die ApplicationImpersonation-Rolle geben. Mit Vollzugriff auf das Postfach ist es nicht getan (und hat auch nichts miteinander zu tun).
New-ManagementRoleAssignment -Name "AdminName_Application_Impersonation" -Role ApplicationImpersonation -User <AdminName>
Evgenij Smirnov
msg services ag, Berlin -> http://www.msg-services.de
my personal blog (mostly German) -> http://it-pro-berlin.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.comIn theory, there is no difference between theory and practice. In practice, there is.
- Als Antwort markiert MickMiller Dienstag, 31. Mai 2016 07:53
Alle Antworten
-
Ja. Und vermutlich kriegt man das sogar mit den Admin-Berechtigungen auf das Zielpostfach hin. Allerdings wird es meistens mit Impersonation gemacht (https://technet.microsoft.com/de-de/library/dd776119%28v=exchg.150%29.aspx ).
Dann brauchst Du auf der Maschine, wo das Skript läuft, die EWS Management API (https://www.microsoft.com/en-us/download/details.aspx?id=42951)
Danach ist es easy:
$mail = 'target.user@domain.com' Add-Type -Path 'C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll' $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013 $Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion) #ACHTUNG! Der Datumsbereich darf max. 2 Jahre betragen! $ivItemView = New-Object Microsoft.Exchange.WebServices.Data.CalendarView((Get-Date '01.01.2015'),(Get-Date '31.12.2016'),1000) # die nächsten zwei Zeilen werden nur benötigt, wenn das Skript NICHT unter dem richtigen Account gestartet wird! $Service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials("adminuser","adminpassword","admindomain") $Service.UseDefaultCredentials = $false $Service.AutodiscoverUrl($mail,{$true}) Write-Host "Verwende URL: $($Service.Url.OriginalString)" $Service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $mail) $folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar,$mail) $calfolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($Service,$folderid) Write-Host "Kalender-Ordner: $($calfolder.DisplayName)" $appts = $calfolder.FindAppointments($ivItemView) foreach ($appt in $appts) { "$($appt.Subject) : $($appt.Start) - $($appt.End)" }
Evgenij Smirnov
msg services ag, Berlin -> http://www.msg-services.de
my personal blog (mostly German) -> http://it-pro-berlin.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.comIn theory, there is no difference between theory and practice. In practice, there is.
- Bearbeitet Evgenij Smirnov Sonntag, 29. Mai 2016 18:36
- Als Antwort markiert MickMiller Dienstag, 31. Mai 2016 07:53
-
Danke für dein Script. Leider erhalte ich einen Felher.
Ich habe einen User (mm_admin), welcher auf das Postfach des Users (mm@comp.com) Vollzugriff hat. Das Script starte ich direkt auf dem Exchange 2013 mit dem user (mm_admin).
$mail='mm@comp.com'
...Bei diesem Befehl
$calfolder=[Microsoft.Exchange.WebServices.Data.Folder]::Bind($Service,$folderid) erscheint folgender Fehler:Exception calling "Bind" with "2" argument(s): "The account does not have permission to impersonate the requested user."
At C:\Tools\Scripts\Read-Calendar.ps1:21 char:1
+ $calfolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($Service,$folder ...
Danke für deine Hilfe.
Gruss Miller
-
Ja, Du musst dem Admin die ApplicationImpersonation-Rolle geben. Mit Vollzugriff auf das Postfach ist es nicht getan (und hat auch nichts miteinander zu tun).
New-ManagementRoleAssignment -Name "AdminName_Application_Impersonation" -Role ApplicationImpersonation -User <AdminName>
Evgenij Smirnov
msg services ag, Berlin -> http://www.msg-services.de
my personal blog (mostly German) -> http://it-pro-berlin.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.comIn theory, there is no difference between theory and practice. In practice, there is.
- Als Antwort markiert MickMiller Dienstag, 31. Mai 2016 07:53
-
Hallo Evgenij
Wie kann ich herausfinden wie viele freie Minuten von 8 - 17 Uhr noch nicht verbucht sind.
Beispiel:
Termin1: 0800 - 0900
Termin2: 1000 - 1200
Termin3: 1400 - 1500
D.h. es sind von 9-10 (1h), 12-14(2h), 15-17(2h) freie Zeiten.
Das macht 5h.Wie finde ich das heraus?
Danke im Voraus
Gruss Mark -
Moin,
das ist zwar nicht kompliziert, es gibt aber auch keine "Abkürzung". Sprich: Du musst Tag für Tag durchgehen, dann Termin für Termin, vielleicht einen 15 Minuten-Raster oder so etwas pflegen...
Würde man sicherlich gelöst bekommen, man muss sich halt ein paar Minuten hinsetzen.
Selbst mit einer Free-/Busy-Abfrage bekämest Du ja nur Zeitabschnitte und nicht deren Gesamtdauer...
Evgenij Smirnov
msg services ag, Berlin -> http://www.msg-services.de
my personal blog (mostly German) -> http://it-pro-berlin.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.comIn theory, there is no difference between theory and practice. In practice, there is.