none
Termine aus Kalender auslesen mit EWS RRS feed

  • 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] rot

    Hat jemand ein Beispiel?

    Danke im Voraus

    Gruss Miller

    Sonntag, 29. Mai 2016 17:54

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.com

    In theory, there is no difference between theory and practice. In practice, there is.


    Sonntag, 29. Mai 2016 18:35
  • 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.com

    In theory, there is no difference between theory and practice. In practice, there is.

    • Als Antwort markiert MickMiller Dienstag, 31. Mai 2016 07:53
    Dienstag, 31. Mai 2016 07:20

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.com

    In theory, there is no difference between theory and practice. In practice, there is.


    Sonntag, 29. Mai 2016 18:35
  • 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,$folderiderscheint 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

    Dienstag, 31. Mai 2016 07:14
  • 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.com

    In theory, there is no difference between theory and practice. In practice, there is.

    • Als Antwort markiert MickMiller Dienstag, 31. Mai 2016 07:53
    Dienstag, 31. Mai 2016 07:20
  • Vielen Dank für deine Informationen. Das Script funktioniert mit den Zusatzangaben einwandfrei.

    Gruss Miller

    Mittwoch, 1. Juni 2016 11:07
  • 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

    Freitag, 10. Juni 2016 06:01
  • 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.com

    In theory, there is no difference between theory and practice. In practice, there is.

    Freitag, 10. Juni 2016 07:20
  • Verstehe. Ja hinsetzen und scripten ist wohl der Weg zum Ziel :-).

    Danke für deine prompte Antwort.

    Gruss Miller

    Freitag, 10. Juni 2016 11:10