Exchange Web Services (EWS)
Microsoft Consultant Exchange & Skype for Business (m/w)
Kommen Sie zu Net at Work. Wir haben spannende Projekte bei innovativen Kunden. Unser Team arbeitet kollegial und kooperativ – ständiger Austausch und Weiterbildung sind bei uns Standard.
https://www.netatwork.de/unternehmen/karriere/
Früher war MAPI/CDO der bevorzugte Weg, um an die Inhalte eines Exchange Servers (Postfach und öffentliche Ordner) zu kommen. Allerdings hat dieser Weg in der modernen Zeit diverse Einschränkungen. Als 16/32bit Applikation bzw. COM-DLL ist der Weg in die Zukunft nicht einfach. Zudem erfolgt die Kommunikation per RPC gegen den Postfachserver. HTTPS wäre aber viel besser. Mit Exchange 2000/2003 gab es einen Zwischenschritt, da über das Protokoll WebDAV ein Zugriff auf Inhalte per HTTPS möglich wurde. Besonders elegant war dies aber auch nicht und mit Exchange 2007 wurden erstmals die Webservices bereit gestellt, welche zukünftig alle anderen APIs (WebDAV, CDO, ExOLEDB und OWA URL Commands) ersetzen sollen. Mit Exchange 2010 wurden dann eine ManagedAPI für .NET bereit gestellt, dass Entwickler sehr viel einfacher arbeiten können.
Achtung: EWS mit Exchange Online und 13. Okt 2020: BasicAuth entfällt, OAUTH erforderlich
Upcoming changes to Exchange Web Services (EWS) API for Office 365
https://blogs.technet.microsoft.com/exchange/2018/07/03/upcoming-changes-to-exchange-web-services-ews-api-for-office-365/
Starting today, Exchange Web Services
(EWS) will no longer receive feature updates
https://techcommunity.microsoft.com/t5/Exchange-Team-Blog/Upcoming-changes-to-Exchange-Web-Services-EWS-API-for-Office-365/ba-p/608055
"
However, this API is in sustaining mode, the recommended access pattern for Office 365 and Exchange online data is Microsoft Graph
Quelle:
https://GitHub.com/officedev/ews-managed-api
Funktionsumfang
Was sie mit Webservices heute schon abdecken können, zeigt ein Diagramm. Sie zeigt sehr gut, welche Funktionen schon in Exchange 2007 enthalten waren und dass Exchange 2007 SP1 den Exchange 2007 Funktionsumfang quasi komplettiert hat. Natürlich wurden die Webservices mit Exchange 2010 nochmal erweitert.
Quelle: TechEd UNC324 What's New in Exchange Web Services in Microsoft
Exchange Server 2010, Autor Albert Kooiman
Das Ernsthaftigkeit zum Einsatz von Exchange Web Services von Microsoft ist klar und deutlich: Sehr viele Produkte und Programme setzen mittlerweile auf EWS auf z.B. Entourage für Mac Web Service Edition, die TransporterSuite, Project Server 2010 für Aufgaben und immer mehr andere Tools von Microsoft und Drittherstellern. Die eigenständige Seite Webservice liefert eine allgemeine Beschreibung.
Über die Exchange Web Services ist daher ein einfacher, internettauglicher, plattformunabhängiger Zugriff auf Inhalte möglich. Per Webservice kann sich ihr Programm sogar informieren lassen, wenn sich in einem Ordner etwas ändert. Allerdings funktioniert das nur Asynchron und nur pro Ordner. Es ist daher kein Ersatz für die Storesinks von Exchange 2000/2003. Allerdings kann man über die Synchronization-API Änderungen sehr einfach ermitteln und darauf reagieren.
Exchange Web Services nutzen
Ehe es von Microsoft die "Managed API" zu den Exchange WebServices gab, muss man sich noch selbst die WSDL-Datei besorgen und sich Proxy-Klassen schreiben und sehr genau prüfen, welche Parameter an welcher Stelle eingesetzt werden sollen. All Links zum Einsatz ohne Managed API habe ich mittlerweile an das Ende der Seite verschoben. (Siehe Exchange 2007 Webservices ohne Managed API). Sie sind immer noch wichtig, wenn Sie mit Programmen auf Exchange zugreifen wollen, die nicht .NET unterstützen, z.B. Java, Unix etc. Ansonsten würde ich speziell für Einsteiger stickt dazu raten, die Managed API zu nutzen.
Die sind aber erst mal herunter zu laden und auf dem Client zu installieren, damit Sie diese auch nutzen können.
Microsoft Exchange Web Services Managed API
(Nicht mehr gültig)
Version 2.2:
http://www.microsoft.com/en-us/download/details.aspx?id=42951
Version 2.1:
http://www.microsoft.com/en-us/download/details.aspx?id=42022
Version 2.0:
http://www.microsoft.com/en-us/download/details.aspx?id=35371
Version 1.2
http://www.microsoft.com/download/en/details.aspx?id=28952
Aktuell wird die Entwicklung wohl auf GitHub
weiter geführt
https://GitHub.com/officedev/ews-managed-api
https://www.nuget.org/packages/Microsoft.Exchange.WebServices/
Die Installation erfolgt per NUGET
Register-PackageSource -provider NuGet -name nugetRepository -location https://www.nuget.org/api/v2 Install-Package Microsoft.Exchange.WebServices -Source "NuGet.org"
- Install-Package
https://docs.microsoft.com/en-us/powershell/module/packagemanagement/install-package
Exchange 2010 Service Pack 1 (SP1) Web Services
Software Development Kit (SDK)
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=d55dcd05-1dd6-4f44-956f-82f052ee7d82
Exchange API-Spotting Exchange 2010 SDK March Update
http://blogs.msdn.com/exchangedev/archive/2010/03/03/Thom-Randolph.aspx
Die Installation muss auf den System erfolgen, von dem aus der Zugriff auf die Daten erfolgen soll. Es ist nicht mehr erforderlich, eine Anwendung oder zusätzliche API auf dem Exchange Server zu installieren.
Nach Abschluss der Installation gibt es aber kein Icon im Startmenü o.ä. Sie können dann in ihrem Projekt einfach die neuen DLLs einbinden und dann basierend darauf eine neue Instanz eines Objekts zu erstellen und für Diagnosezwecke das Tracing zu aktivieren.
using Microsoft.Exchange.WebSerivces.Data; using Microsoft.Exchange.WebSerivces.Autodiscover; /* ewsserver initialisieren */ ExchangeService ewsservice= new ExchangeService; /* ewsserver initialisieren wenn Ziel Exchange 2007 ist*/ ExchangeService ewsservice= new ExchangeService(Exchange2007_SP1); /* Optional Credentials angeben */ ewsservice.Credentials = new NetworkCredential("name", "pwd", "domain"); /* bei Bedarf ein trace zum debugging einschalten */ ewsservice.traceEnabled = true; /* URL definieren ODER per Autodiscover ermitteln */ service.URL = new uri("https://servername/EWS/Exchange.asmx"); service.AutodiscoverURL("mailadresse@domain.tld");
- Test-EWS
Einfache EWS-Funktionstests mit PowerShell -
EWSEditor
Zugriff auf Postfachinhalte per Exchange Web Services - Microsoft Exchange Web Services Managed API 1.2
http://msdn.microsoft.com/en-us/library/dd633709(v=EXCHG.80).aspx - Exchange Server Developer Downloads
http://msdn.microsoft.com/en-us/exchange/aa731546.aspx - Introducing the Exchange Web Services Managed API 1.0
http://msdn.microsoft.com/en-us/library/dd637749.aspx - Exchange Server Developer Center
http://msdn.microsoft.com/en-us/exchange/default.aspx - Exchange Developer Blog
http://msdn.microsoft.com/blogs/exchangedev - Exchange API-spotting - Introducing the EWS Managed API!
http://blogs.msdn.com/exchangedev/archive/2009/04/15/introducing-the-ews-managed-api.aspx - Exchange Web Services Managed API: Unified Communications
Development für Exchange
http://channel9.msdn.com/pdc2008/BB46/ - Exchange API-spotting
http://blogs.msdn.com/exchangedev/archive/2008/05/22/exchange-developer-roadmap.aspx - Exchange Web Services - What You Didn't Know
http://blogs.technet.com/b/exchange/archive/2009/03/24/450892.aspx- EWS is Only API für next Exchange Version
- Vista and MAC Gadgets as samples using EWS
- MAC Entourage uses EWS only
- Android uses EWS für Contacts
- Managed API with next version of Exchange
- Glen Scales: Managed API Artikel
http://gsexdev.blogspot.com/search/label/EWS%20Managed%20API - Writing a simple scripted process to download attachmentts in
Exchange 2007/ 2010 using the EWS Managed API
http://gsexdev.blogspot.com/2010/01/writing-simple-scripted-process-to.html - Processing items in an Exchange folder using EWS Managed API
http://www.infinitec.de/post/2009/06/07/Processing-items-in-an-Exchange-folder-using-EWS-Managed-API.aspx - EWS Managed API and PowerShell How-To series Part 1
http://www.gsexdev.blogspot.com/2012/01/ews-managed-api-and-PowerShell-how-to.html - EWS Managed API and PowerShell How-To series Part 2 - Folders
http://www.gsexdev.blogspot.com/2012/01/ews-managed-api-and-PowerShell-how-to_23.html -
Windows Identity and Exchange Protocols Plugfest 2012: Exchange Web
Services Best Practices
Part1: https://channel9.msdn.com/Events/Open-Specifications-Plugfests/Windows-Identity-and-Exchange-Protocols-Plugfest-2012/Exchange-Web-Services-Best-Practices-Part-1
Part2: https://channel9.msdn.com/Events/Open-Specifications-Plugfests/Windows-Identity-and-Exchange-Protocols-Plugfest-2012/Exchange-Web-Services-Best-Practices-Part-2 -
6 teilige Webcast Serie
http://blogs.msdn.com/exchangedev/archive/2009/10/08/don-t-miss-the-exchange-2010-developer-webcasts.aspx
Hier die direkten Links zum Download
Exchange Server 2010 Development (Part 1 of 6): Migrating Applications to Exchange Web Services
Exchange Server 2010 Development (Part 2 of 6): A Deep Dive into using Autodiscover Service in Exchange Web Services
Exchange Server 2010 Development (Part 3 of 6): A Deep Dive into Impersonation and Delegation in Exchange Web Services
Exchange Server 2010 Development (Part 4 of 6): A Deep Dive into Exchange Web Services Notifications (Push/Pull)
Exchange Server 2010 Development (Part 5 of 6): A Deep Dive into the Exchange Web Services Managed API
Exchange Server 2010 Development (Part 6 of 6): Best Practices für Building Scalable Exchange Server Applications -
Glen Scales Einführung in EWS
EWS Managed API and PowerShell How-To Series
Part 1 Getting Started http://gsexdev.blogspot.com.au/2012/01/ews-managed-api-and-PowerShell-how-to.html
Part 2 using Folders http://gsexdev.blogspot.com.au/2012/01/ews-managed-api-and-PowerShell-how-to_23.html
Part 3 using Items http://gsexdev.blogspot.com.au/2012/02/ews-managed-api-and-PowerShell-how-to.html
Part 4 Reporting on Items of a certain Type http://gsexdev.blogspot.com.au/2012/03/how-to-series-sample-4-reporting-on.html
Part 5 Delegate Operations http://gsexdev.blogspot.com.au/2012/03/ews-managed-api-and-PowerShell-how-to.html -
Programming With Exchange Server 2007 (EWS)
Part1: http://www.codeproject.com/KB/exchange/Exchange2007EWS-Part1.aspx
Part2: http://www.codeproject.com/KB/exchange/EWSPart2.aspx
Part3: http://www.codeproject.com/KB/exchange/EWSPart3.aspx -
[MS-OXOCNTC]: Contact Object Protocol Specification 2.2.1.5.3
PidLidBirthdayEventEntryId
http://msdn.microsoft.com/en-us/library/ee217597%28EXCHG.80%29.aspx
Erinnerungen zu Kontakten können hier verlinkt werden -
Using PowerShells new-webserviceproxy with Exchange Web Services
http://blogs.msdn.com/b/rickhall/archive/2009/03/19/using-PowerShell-s-new-webserviceproxy-with-exchange-web-services.aspx
Alter Zugriff per PowerShell mit new-WebserviceProxy -
Creating folder using EWS Managed API 1.1 from PowerShell
http://blogs.msdn.com/b/akashb/archive/2011/07/23/creating-folder-using-ews-managed-api-1-1-from-PowerShell.aspx -
Stamping Retention Policy Tag using EWS Managed API 1.1 from
PowerShell(Exchange 2010)
http://blogs.msdn.com/b/akashb/archive/2011/08/11/stamping-retention-policy-tag-using-ews-managed-api-1-1-from-PowerShell-exchange-2010.aspx
Exchange Web Services Overview
https://www.youtube.com/watch?v=wOQMJhrp6GQ
EWS-Filter: Zugriff kontrollieren ab Exchange 2010 SP1
Damit nicht jeder Client nun mit einem bekannten Benutzernamen per EWS und frei verfügbaren Tools im Store tummelt, kann ein Administrator seit Exchange 2010 SP1 auch hier mehr Einstellungen vornehmen. Dazu sind die beiden folgenden Commandlets relevant. Das SP1 für Exchange 2010 hat zwei Befehle erweitert:
- Set-CASMailbox
http://technet.microsoft.com/en-us/library/bb125264.aspx - Set-OrganizationConfig
http://technet.microsoft.com/en-us/library/aa997443.aspx - Disabling EWS in Exchange 2010
http://blogs.msdn.com/b/exchangedev/archive/2011/09/15/disabling-ews-in-exchange-2010.aspx
Beide Commandlets können seit SP1 die folgenden Parameter:
- EWSEnable
Damit wird generell gesteuert, ob EWS erreichbar sein soll - EwsAllowMacOutlook".
Damit kann gesteuert werden, ob Outlook 2011 für Mac per EWS auf Exchange zugreifen kann. - EwsAllowEntourage
Gleiches ist für Entourage möglich. - EwsAllowOutlook
Steuert, ob Outlook 2007 und höher über EWS zugreifen kann - "EwsApplicationAccessPolicy " und "EwsBlockList" und
EwsAllowList
Abhängig von der Einstellung der Policy (EnforceAllowList oder EnforceBlockList) können Sie über die Liste bestimmte Clients zulassen (/Allowlist) oder bestimmte Einträge aussperren (Blocklist)
Die Felder müssen nicht mit "Wahr" oder "Falsch" gefüllt sein, sondern können auch "leer" sein. Nach meiner Erfahrung überstimmten "pro Benutzer" eingestellte Parameter die organisationsweiten Einstellungen. Wenn nichts eingestellt ist, dann ist alles "erlaubt". (Das konnte ich aber z.B. mangels Mac noch nicht testen.
EWS Authentication
Zugriffe auf das eigene Postfach oder per EWS und Impersonation ist natürlich nicht anomym möglich. Wie bei HTTP üblich, muss sich der Benutzer oder ein Service entsprechend authentifizieren. Exchange ist hier flexibel und der Administrator kann auf dem Server die erlaubten Anmeldeverfahren mit "Set-EWSVirtualDirectory" einstellen.
Interessant wird die Anmeldung an Exchange Online, da Kerberos dort nicht geht und Microsoft den Umstieg von "Basic/NLTM" auf OAUTH forciert.
- OAUTH2 / Modern Authentication
- Exchange Online Authentifizierung
- HTTP Authentication
- Test-EWS
- EWS and OAuth
https://ingogegenwarth.wordpress.com/2018/08/02/ews-and-oauth/
PowerShell und EWS
Mit dem Skript Test-EWS habe ich ein Framework geschaffen, mit dem Sie sehr schnell einen ersten Zugriff per EWS auf ihre Postfach durchspielen können.
Aus VBScript ist es nicht möglich, Managed-Code einfach aufzurufen. Aber PowerShell erlaubt dies schon sehr einfach. die folgenden Zeilen bauen eine Verbindung zum Exchange Server per EWS auf.
# Laden der Manages API-DLLs in den Prozessraum [void][Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll") # ews-Klasse instanziieren # Wenn Sie auf Exchange 2007 zugreifen, müssen Sie dies mit angeben $ews = new-object Microsoft.Exchange.WebServices.Data.ExchangeService #$ews = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1) # Dann müssen Sie die EWS-URL angeben oder per Autodicsover anhand der Mailadresse ermitteln lassen. # Ermitteln mit Mailadresse $ews.AutodiscoverURL($mailbox) # alternativ: Aktuellen User verwenden #$windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent() #$sidbind = "LDAP://<SID=" + $windowsIdentity.User.Value.ToString() + ">" #[adsi]$aceUser = [ADSI]$sidbind #$ews.AutodiscoverURL($aceUser.mail.ToString()) # Alternativ URL fest vorgeben $ews.URL = [system.URI]"https://casserver/ews/exchange.asmx" # Optional mit anderen Benutzerdaten anmelden $ews.Credentials = New-Object System.Net.NetworkCredential("Username","passwort","domain")
Danach steht die Klasse für die weitere Verwendung zur Verfügung.
- Accessing The Information Store From PowerShell
http://blogs.technet.com/b/bill_long/archive/2010/04/06/accessing-the-information-store-from-PowerShell.aspx - MSDN: Introducing the Exchange Web Services Managed
API 1.0
http://msdn.microsoft.com/en-us/library/dd637749(EXCHG.80).aspx - Introducing the Exchange Web Services Managed API
1.0 Beta
http://blogs.technet.com/b/exchange/archive/2009/04/21/451126.aspx - Using the EWS Managed API with PowerShell
http://gsexdev.blogspot.com/2009/04/using-ews-managed-api-with-PowerShell.html - Create a folder under the Inbox if one doesn't
existing using PowerShell and the EWS Managed API
http://gsexdev.blogspot.com/2010/02/create-folder-under-inbox-if-one-doesnt.html - Using EWS to calculate the age of Items and affect
of archive and retention policies in Exchange 2010
http://gsexdev.blogspot.com/2011/04/using-ews-to-calculate-age-of-items-and.html
Mail per EWS versenden
Sicher kann ich auch per SMTP eine Mail einfach versenden. Das geht per Blat oder auch über Mail per CDO Senden, aber dazu ist immer SMTP und Port 25 erforderlich. Viele Firewalls, Virenscanner etc. blocken dies und und per HTTP und EWS ist man hier zum einen flexibler und die Mail landen auch noch in "gesendete Objekte".
Import-Module -Name 'C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll' $Credential = Get-Credential $exchService = New-Object -TypeName Microsoft.Exchange.WebServices.Data.ExchangeService $exchService.Credentials = New-Object ` -TypeName Microsoft.Exchange.WebServices.Data.WebCredentials ` -ArgumentList $Credential.UserName, $Credential.GetNetworkCredential().Password $exchService.AutodiscoverUrl($Credential.UserName, {$true}) $eMail = New-Object -TypeName Microsoft.Exchange.WebServices.Data.EmailMessage -ArgumentList $exchService $eMail.Subject = 'Test EWS' $eMail.Body = 'Test EWS' $eMail.ToRecipients.Add('demouser@msxfaq.de') | Out-Null $eMail.SendAndSaveCopy()
Natürlich können Sie der Mail noch Anlagen, Formatvorlagen etc. verpassen.
- EmailMessage Class
http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.emailmessage(EXCHG.80).aspx - Creating and Sending E-Mail Messages
http://msdn.microsoft.com/en-us/library/dd633628.aspx - Exchange 2007 EWS: Sending Email
http://weblogs.asp.net/srkirkland/archive/2008/01/14/exchange-2007-ews-sending-email.aspx - Mail per SMTP versenden
http://pshscripts.blogspot.com/2009/09/send-emailmessageps1.html
Wenn ihnen EWS nicht zusagen sollte
Posteingang per EWS auslesen
Auch das Abrufen von Mails aus dem Posteingang und anderen Ordnern ist mit der Managed API sehr einfach geworden. Auch hier benötigen Sie den Initialisierungsteil und dann geht es sehr einfach weiter. Ungewohnt ist hier, dass man neben dem Ordner sich erst mal einen "View" definieren muss, damit man die gewünschten Daten bekommt. Das ist aber ganz hilfreich, denn wenn Sie wissen, nach was sie suchen, dann brauchen Sie nicht alle Inhalte anzufordern und auf dem Client zu filtern, sondern den Server kann schon filtern.
Write-Host "Bindung Inbox" $inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($ews, ` [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox) write-host "Number or unread Messages : " + $inbox.UnreadCount $view = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1) $findResults = $ews.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$view) "" "Last Mail From : " + $findResults.Items[0].From.Name "Subject : " + $findResults.Items[0].Subject "Sent : " + $findResults.Items[0].DateTimeSent
Diese Zeilen zeigt die erste Mail an.
- Test-EWS
Einfache EWS-Funktionstests mit PowerShell
Kalenderzugriff per EWS
Per EWS ist auch ein Zugriff auf Termine möglich. Hier ein paar Links zu weiterführenden Seiten:
- Erstellen von Terminen und
Besprechungen mithilfe von EWS
in Exchange 2013
https://docs.microsoft.com/de-de/exchange/client-developer/exchange-web-services/how-to-create-appointments-and-meetings-by-using-ews-in-exchange-2013 - Creating Calendar Items with
PowerShell and the EWS Managed
API
http://www.mikepfeiffer.net/2011/01/creating-calendar-items-with-PowerShell-and-the-ews-managed-api/ - Frei/Belegt-Zeiten per Graph
https://gsexdev.blogspot.com/2018/09/getting-freebusy-information-in-graph.html - FreeBusy Board for the Exchange EWS Managed API using Powershell
https://gsexdev.blogspot.com/2010/03/freebusy-board-for-exchange-ews-managed.html - Using Exchange EWS to Obtain Exchange Online Meeting Details from Room Mailboxes
https://blogs.technet.microsoft.com/mspfe/2017/10/11/using-exchange-ews-to-obtain-exchange-online-meeting-details-from-room-mailboxes/ - Using Exchange Web Services
(EWS) to add entries in a
calendar
http://www.be-com.eu/?p=2320
Kontakte mit EWS
Neben den Mails und Terminen gibt es auch Personendokumente. Hierbei müssen Sie zwischen den Kontakten im Postfach jedes einzelnen Anwenders und dem globalen Adressbuch unterscheiden. Beide Datenquellen können per EWS abgefragt werden. Allerdings sind es unterschiedliche APIs. Ich beschränkte mich hier auf Links zu anderen Seiten:
-
People and contacts in EWS in Exchange
https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/people-and-contacts-in-ews-in-exchange?redirectedfrom=MSDN -
EWS Powershell – to Access Contacts on the
Exchange Mailbox
https://smtpport25.wordpress.com/2010/10/11/ews-powershell-to-access-contacts-on-the-exchange-mailbox/ -
FindPeople operation
https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/findpeople-operation -
Retrieving all Exchange contacts (Global Address
List & User Contacts Folder) using EWS
https://stackoverflow.com/questions/51968801/retrieving-all-exchange-contacts-global-address-list-user-contacts-folder-us
Autodiscover und Umleitung
Ehe Outlook 2007 SP1 auch mit SRV-Records arbeiten konnte, konnte ein Admin also nur ein Zertifikat für "autodiscover.maildomain.tld" konfigurieren oder ohne SSL einen HTTP-Redirect machen. Das funktioniert mit Outlook 2007 schon sehr gut aber wer per Exchange Web Services darauf zugreifen will, muss eine "Callback"-Funktion einrichten, die die Rückfrage bezüglich der "Umleitung" behandelt.
Das geht mit PowerShell 1.0 schon gar nicht und mit 2.0 ist die Komplexität für die MSXFAQ eher hoch. Sie sollten dann einfach die URL manuell angeben.
$ewsservice.URL = "https://exchangeserver/EWS/exchange.asmx
Sie können diese URL auch per Browser ansurfen. Nach erfolgter Authentifizierung bekommen Sie folgende Seite bei Exchange 2016
Lassen Sie sich hier nicht davon irritieren, dass in dem Beispiel der "echte Servername" und bei Exchange 2016 mit kombinierter Frontend/Backend-Rolle auch der interne Port (444) erscheint. Als Programmierer sollten sie natürlich den richtigen öffentlichen Namen mit HTTPS über 443 nutzen. Die hier sichtbare URL ist wenn, dann nur intern erreichbar aber nie von extern. Die URL sollten sie dann auch entsprechend umschreiben:
https://exchangeserver/EWS/services.wsdl
Darauf antwortet der Exchange Server nach Authentifizierung mit einer XML-Datei zur API-Beschreibung, die auch ein Browser anzeigen kann
Diese URLs sind also ein erster Test, ob EWS schon einmal generell erreichbar ist. Sie eignen sich in Grenzen auch für ein Monitoring.
EWS und Impersonation
Bitte siehe dazu die gesonderte Seite EWS Impersonation
EWS-Header: X-AnchorMailbox u.a.
EWS nutzt HTTPS und auch wenn EWS einfach so funktioniert, gibt es Header, die ein Entwickler setzen sollte. Einige sind optional aber X-AnchorMailbox ist in vielen Stellen essentiell.
- User-Agent
Für die Fehlersuche auf dem Server ist es nützlich, wenn das eigene Skript sich gegenüber dem WebServer auch mit einem eigenen UserAgent meldet. Das geht sehr einfach aber das "UserAgent"-Property beim EWSService-Objekt und erlaubt dem Admin die direkte Suche im IISLog auf dem Server - X-ClientStatistics
Über das EWS-Property SendClientLatencies der Klasse kann der Programmierer einrichten, dass EWS entsprechende Performance Kennzahlen an den Server zurück sendet. Aktuell sammelt aber nur Exchange Online diese Daten, damit Microsoft seinen Service verbessern kann. -
X-AnchorMailbox
X-AnchorMailbox
Dieser Header ist alles andere als optional und sollte von Entwicklern aktiv genutzt werden. Dies gilt besonders, wenn ein Prozess mehrere Postfächer per Impersonation anspricht. Über die Adresse im X-AnchorMailbox wird der Bezug zum gleichen BackendServer festgezurrt. Ansonsten könnte für jeden Request ein anderer Server genutzt werden, was Mehraufwand bei Verbindungsaufbau, Authentifizierung etc. bedeutet und Performance kostet.
A high scale EWS-based application/service
that uses impersonation needs to manage affinity with the
backend Exchange server by adding an HTTP header called "X-AnchorMailbox"
to requests with the ExchangeImpersonation SOAP header. The
values of the X-AnchorMailbox HTTP header and the
ExchangeImpesonation SOAP header on the request should match.
Quelle:
https://blogs.msdn.microsoft.com/mstehle/2013/07/25/managing-affinity-for-ews-impersonation-in-exchange-2013-and-exchange-online-w15/
Weitere Informationen finden Sie auf folgenden Seiten.
- Best Practices: Important and critical headers for EWS
https://blogs.msdn.microsoft.com/webdav_101/2018/06/16/best-practices-important-and-critical-headers-for-ews/ - Best Practices – EWS Authentication and
Access Issues
https://blogs.msdn.microsoft.com/webdav_101/2015/05/11/best-practices-ews-authentication-and-access-issues/ - Instrumenting client requests for EWS and REST in Exchange
https://msdn.microsoft.com/en-us/library/office/dn720380(v=exchg.150).aspx - Instrumenting client requests for EWS
and REST in Exchange
https://docs.microsoft.com/de-de/exchange/client-developer/exchange-web-services/instrumenting-client-requests-for-ews-and-rest-in-exchange - ExchangeServiceBase.SendClientLatencies
Property
https://docs.microsoft.com/de-de/dotnet/api/microsoft.exchange.webservices.data.exchangeservicebase.sendclientlatencies?view=exchange-ews-api - EXCHANGE ONLINE MIGRATION: UNMENTIONED
PITFALLS (PART 2)
https://www.enowsoftware.com/solutions-engine/exchange-online-migration-pitfalls-part2
EWS für OOF
OOF-Einstellungen sind auch per EWS erreichbar. Hier ein paar Einstiegsadressen:
- Out of Office
- Manage Exchange 2007 Out-Of-Office
(OOF) Settings with PowerShell
and the EWS Managed API
http://www.mikepfeiffer.net/2010/07/manage-exchange-2007-out-of-office-oof-settings-with-PowerShell-and-the-ews-managed-api/ - Out of Office Tool für Exchange
2010 & 2013
http://asichel.de/2013/12/27/out-of-office-tool-fuer-exchange-2010-2013
EWS und Elementgrößen
Haben sie schon mal versucht, ein Postfach von Notes oder Exchange nach Exchange 2007/2010 zu verschieben, in dem eine Mail > 50 MB lag?. Richtig, das geht nicht, das die Migration über EWS erfolgt. Microsoft hat hier aber einen "Schutz" gegen angriffe eingebaut der ein upload von größeren Elementen verhindert. Es wäre doch Schade, wenn ein böser Prozess einen upload von 20 GB "starten" (aber eh nie abschließen) würde und Exchange dafür Platz/RAM reservieren müsste. Daher gibt es ein Limit, welches Sie aber hochsetzen können.
Das "Problem" betrifft nicht nur Migrationen sondern jede Art von Zugriff auf EWS.
Ein Attachment "vergrößert"
sich beim Einsatz von EWS
20 MB: Dateigröße auf Disk
30 MB Datei nach MIME-Konvertierung (+33%)
43 MB Datei codiert innerhalb der
XML/SOAP-Message (+36%)
Die individuellen Größen können abweichen.
Entsprechend können Sie mehrere Stellen "treffen", bei denen der IIS über Grenzen steuern. Letztlich sind es Änderungen an der "web.config".
<configuration> <system.web> <httpRuntime maxRequestLength="10240" /> <system.web> <configuration>
Der Wert wird in "Kilobyte" angegeben.
Achtung
Dies ist eine XML-Datei und Tippfehler bewirken,
dass der entsprechende Applicationpool nicht
mehr startet. Sie können viele Einstellungen
auch im IIS-Manager machen.
Danach ist der IIS mit einem IISRESET durchzustarten, damit die Einstellungen aktiv werden.
Hier eine unvollständige Liste der Parameter, mit denen ich schon mal konfrontiert worden bin.
Parameter | IIS | 2007 | 2010 | |
---|---|---|---|---|
maxRequestLength |
web.config |
4KB |
13280KB |
2097151KB |
MaxReceiveMessageSize |
web.config |
na ? |
na ? |
RTM:
13600000 |
maxAllowedContentLength |
web.config |
30 MB |
30 MB |
35 MB |
executionTimeout |
web.config |
110 Sek |
|
|
Es gibt noch weitere Grenzwerte (z.B. connectionTimeout), die aber nur bei sehr großen Anlagen über sehr langsame Leitungen zum Tragen kommen. Auch Funktionen wie "Connection Filterung" oder eine vorgelagerte Firewall können natürlich eigene Grenzen umsetzen und am Ende
-
requestLimits Element für requestFiltering [IIS 7
Settings Schema]
http://msdn.microsoft.com/en-us/library/ms689462(v=vs.90).aspx - 944981 You cannot upload files that are larger than 28 MB on a Windows Server 2008-based computer that is running Windows SharePoint Services 3.0
-
Controlling attachment size in Exchange Server 2007
Outlook Web Access (OWA)
http://blogs.technet.com/b/exchange/archive/2006/11/14/431477.aspx -
Configure Maximum Message Size in Outlook Web App
http://technet.microsoft.com/en-us/library/aa996835.aspx -
Max Message Size Increase: OWA, IMAP, EWS (maxRequestLength
and maxAllowedContentLength
http://edmckinzie.wordpress.com/2009/11/30/max-message-size-increase-owa-imap-ews-maxrequestlength-and-maxallowedcontentlength/ - Could not create one or more attachments für item \
The operation has timed out
http://blogs.technet.com/b/caseys/archive/2007/12/19/warning-could-not-create-one-or-more-attachments-for-item.aspx - MSDN:
Element
http://msdn2.microsoft.com/en-us/library/e1f13641(vs.71).aspx - Web Services, Opaque Data, and the Attachments
Problem
http://msdn.microsoft.com/en-us/library/ms996462.aspx
EWS und Notification Services
Die Webservices öffnen noch einen netten Weg: eine Anwendung kann per Webservices eine "Pushbenachrichtigung" einstellen, d.h. der Exchange Server informiert die Anwendung darüber, wenn sich in einem Postfach z.B. etwas tut. Dazu muss die Anwendung selbst auch einen Webservice bereitstellen, welcher von Exchange dann "Rückwärts" aufgerufen wird. Als Programmierer weise ich also Exchange an, von von meiner Anwendung angebotenen Webservice bei bestimmten Situationen aufzurufen.
Achtung: Die Funktion auf Push-Notifications
zu warten wurde 2007 eingeführt aber schon 2010 durch
"Streaming Notifications" abgelöst. Im Jan 2019 wurde die
Push-Notification für Angriffe missbraucht und von Microsoft
angepasst.
Exchange Fail Jan 2019 - CVE-2018-8581
SubscribePullNotification
Sie müssen aber einen Listener entwickeln, welcher dann von Exchange aufgerufen (ebenfalls WebService) wird. Details finden Sie auch hier:
- Henning Krause: Artikelserie zu Push Notifications
http://www.infinitec.de/?tag=/push+notifications - InfiniTec.Exchange.Notifications Updated to 1.5.0.0
http://www.infinitec.de/post/2009/05/23/InfiniTecExchangeNotifications-updated-to-1500.aspx - Modul auf Codeplex zur Nutzung von Nortifictions
http://www.codeplex.com/exchangenotification - Push-Notifications Surviving application restarts
'http://www.infinitec.de/post/2009/01/12/Push-Notifications-e28093-Surviving-application-restarts.aspx - Working with Streaming Notifications By using the
EWS Managed API
http://blogs.msdn.com/b/exchangedev/archive/2010/12/22/working-with-streaming-notifications-by-using-the-ews-managed-api.aspx - Using EWS Streaming notifications in PowerShell to
trigger a script when new mail arrives in Exchange 2010
SP1
http://gsexdev.blogspot.com/2011/09/using-ews-streaming-notifications-in.html - EWS Managed API and PowerShell How-To Series Part 9
EWS Notifications
http://gsexdev.blogspot.de/?view=magazine#!/2012/05/ews-managed-api-and-PowerShell-how-to_28.html
Pull, Push, Streaming für einfache "neartime" Abfragen (/Polling) ist Pull einfach und ausreichend. - EWS: Push Notification Sample
https://blogs.msdn.microsoft.com/emeamsgdev/2012/12/20/ews-push-notification-sample/ - EWS Push Notification Example (standalone
application)
https://ewspushnotification.codeplex.com/ - ExchangeService.SubscribeToPushNotifications Method
https://docs.microsoft.com/de-de/dotnet/api/microsoft.exchange.webservices.data.exchangeservice.subscribetopullnotifications?view=exchange-ews-api
Wenn Sie alles richtig gemacht haben aber ihr Webservice dennoch nicht angesprochen wird, dann sollten Sie einen Blick ins Eventlog tun:.
Event Type: Warning Event Source: MSExchange Web Services Event Category: Core Event ID: 6 Description: unable to send a notification für subscription fsdfllkn4325kjbzuvjdj2sj1jshj2dk2kj3s1fefh13g4g4sjg34as3244=. (Send attempts: 3)
Event Type: Error Event Source: MSExchange Web Services Event Category: Core Event ID: 7 Description: After 8 unsuccessful attempts to send a notification für subscription fsdfllkn4325kjbzuvjdj2sj1jshj2dk2kj3s1fefh13g4g4sjg34as3244= K8=, subscription has been removed.
Event Type: Warning Event Source: MSExchange Web Services Event Category: Core Event ID: 5 Description: unable to send a notification für subscription fsdfllkn4325kjbzuvjdj2sj1jshj2dk2kj3s1fefh13g4g4sjg34as3244= K8=. Will retry.
Die lange Zeichenkette ist in Realität eine Base64-codierte Binärdatei, die man zwar decodieren kann, aber viel mehr als den Servername und ein paar kryptische Zeichen sieht man nicht. Es ist aber zumindest ein Hinweis, wohin der Sink gehen sollte. Die Einträge sind übrigens auf dem CAS-Server hinterlegt und wenn ich den Entwicklern glauben darf gibt es keine einfache Möglichkeit eine Liste der aktiven Benachrichtigungen zu generieren.
Man kann allerdings die IIS-Logs durchsuchen, wer, wann ein "Subscribe" auf den Exchange Web Services macht, d.h. im IISLog einfach mal nach "ews/exchange.asmx?SoapAction=Subscribe" suchen.
https://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=931885&SiteID=17
For push notifications, you need to write your own web service that
implements the NotificationService.wsdl interface. Then you subscribe to
receive notifications using the EWS Subscribe web method with a
PushSubscriptionRequest sub-element. You will notice that the
PushSubscriptionRequestType surfaces a status frequency (how often you want
to be alerted of changes) and a URL which is the URL of YOUR web service.
Then EWS will call the SendNotification web method on your service with the
changes. You can unsubscribe by responding to the SendNotification web
method with a subscription status of "Unsubscribe".
Streaming Notifications
Die Bereitstellung eines WebService und diesen von Exchange aufrufen zu lassen, ist auch mit Teams ausgehend WebHooks üblich aber für Exchange nicht immer passend. Daher gibt es auch eine Streaming API. Per EWS setze ich dann einen Request ab und der Server verzögert die Antwort einfach, bis eine Antwort sinnvoll ist. Die Verbindung wird weiter vom Client aufgebaut und bleibt bestehen. Das Handling kann man der EWS.DLL überlassen und auf https://administrator.de/contentid/364117 habe ich dazu einen schönen kompakten Beispielcode gefunden. Damit er nicht verloren geht, habe ich ihn hier unverändert übernommen. Leider steht kein Autor oder Copyright im Original. Poster war der Benutzer Colinaro ( https://administrator.de/user/colinardo/). Das Skript zeigt auch schön, wie man Zertifikatfehler abfängt und mit PowerShell Events (PowerShell und Callback-Funktionen) arbeitet.
# ===== START VARS ===== $global:MAILBOX = 'max.muster@domain.tld' $global:EXSERVER = 'ex.domain.tld' $global:SUBJECTREGEX = 'SPAM' # ===== END VARS ===== $global:CONNECTIONTIMEOUT = 30 if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return} # EWS DLL laden Add-Type -Path "$PSScriptRoot\Microsoft.Exchange.WebServices.dll" -EA Stop Get-EventSubscriber | Unregister-Event -Force # Allen Zertifikaten vertrauen Add-Type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } "@ # Trust all certs policy dem ServicePointManager zuweisen [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy # EWS Objekt erstellen $global:ews = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010) $global:ews.Url = "https://$global:EXSERVER/ews/exchange.asmx" # Benutze die Credentials mit dem das Skript ausgeführt wird $global:ews.UseDefaultCredentials = $true $global:ews.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, [string]$global:MAILBOX) $global:subscription = $global:ews.SubscribeToStreamingNotifications([Microsoft.Exchange.WebServices.Data.FolderId[]](New-Object Microsoft.Exchange.WebServices.Data.FolderId ([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)),[Microsoft.Exchange.WebServices.Data.EventType]::NewMail) $global:connection = New-Object Microsoft.Exchange.WebServices.Data.StreamingSubscriptionConnection($global:ews,$global:CONNECTIONTIMEOUT) # Event das beim Eintreffen einer/mehrerer neuer Mails ausgeführt wird Register-ObjectEvent $global:connection -EventName OnNotificationEvent -SourceIdentifier NewMailNotification -Action { write-host "NewMail subscription event received." -F Green # Alle eingetroffenen Mails verarbeiten $Event.SourceEventArgs.Events | %{ # Mail-Details mit übermittelter ItemId abrufen $mail = [Microsoft.Exchange.WebServices.Data.EmailMessage]::Bind($global:ews,$_.ItemId) # Wenn die Mail gefunden wurde ... if ($mail){ # Wenn der Betreff ein bestimmten Inhalt hat ... if ($mail.Subject -match $global:SUBJECTREGEX){ write-host "New mail wich matches subject: '$($mail.Subject)'." -F Green } } } } # Event das beim Disconnect der Verbindung ausgeführt wird (Verbindung wird dann erneut hier wiederhergestellt) Register-ObjectEvent $global:connection -EventName OnDisconnect -SourceIdentifier OnDisconnectNotification -Action { write-host "Subscription-Connection disconnected, restarting connection ... " -F Yellow -NoNewline while(!$global:connection.IsOpen){ $global:connection.Open() } write-host "Connected." -F Green } # Subscription erstellen $global:connection.AddSubscription($global:subscription) # Subscription öffnen $global:connection.Open() cls write-host "Waiting for new events ..." -F Green while($true){ sleep 1 }
- Streambenachrichtigungen zu Postfachereignissen mithilfe von EWS in Exchange
https://docs.microsoft.com/de-de/exchange/client-developer/exchange-web-services/how-to-stream-notifications-about-mailbox-events-by-using-ews-in-exchange - PowerShell und Callback-Funktionen
EWS Performance Analysen über das IISLog
Sie wissen ja nun, dass die Web Services ein Teil des Webservers IIS sind. Damit landen im IISLog auch die entsprechenden Anfragen. Hier drei exemplarisch Zeile, die zur Lesbarkeit gekürzt sind.
POST /ews/Exchange.asmx - - 401 2 POST /ews/Exchange.asmx - Domain\User 500 0 POST /ews/Exchange.asmx SoapAction=FindItem;Version=0;RpcC=27;RpcL=137;LdapC=10;LdapL=58; Domain\User - 200 0
Die erste Zeile zeigt eine anonyme Anfrage, die vom Server natürlich mit einem 401.2 Fehler quittiert werden. Die zweite Zeile hingegen zeigt, dass da wohl keine gültige Abfrage aber mit gültigem Benutzer erfolgt und mit einem 500er beantwortet wird. Hier wäre ein NETMON-Mitschnitt denkbar, um den XML-Request und die Details der Antwort zu sehen.
Besonders interessant ist die Zeile einer erfolgreichen EWS-Anfragen. Hier ist nicht nur der Befehl "FindItem" sichtbar, sondern auch ein paar Werte zur internen Verarbeitung. Bislang habe ich noch keine Bestätigung aber die Zahlen dürften die Millisekunden sein, die in der entsprechenden Routine verweilt wird.
Leider gibt es keinen Parser, der diese Details genauer auswertet.
- OUTBOX: Understanding and
Fixing Slow Exchange Web
Services Code
Part1: http://blogs.msdn.com/b/mstehle/archive/2008/07/17/outbox-understanding-and-fixing-slow-exchange-web-services-code-part-1.aspx
Part2: http://blogs.msdn.com/b/mstehle/archive/2008/08/13/outbox-understanding-and-fixing-slow-exchange-web-services-code-part-2.aspx
EWS Server Log
Auch der Exchange Server selbst protokolliert neben dem IIS in seinen eigenen Protokolldateien viele Informationen. Dazu zählt eben auch EWS. Die Logs liegen per Default auf
C:\Program Files\Microsoft\Exchange Server\V15\Logging\Ews
Per PowerShell können Sie so z.B. ganz schnell mal ermitteln, welche Methoden die Clients generell einsetzen:
Get-Item "C:\Program Files\Microsoft\Exchange Server\V15\Logging\Ews\ews_20190102*-*.LOG" | %{import-csv $_} | group SoapAction –NoElement Count Name ----- ---- 208 52 SoapAction 67686 FindItem 36973 Sbsc_ConnStatus 26177 GetUnifiedGroupsSettings 3253 Subscribe 2243 Sbsc_CrteConn 6956 GetUserAvailability 15388 GetUserOofSettings 2143 Sbsc_EndConnSuccess 2143 GetStreamingEvents 1597 GetFolder 4925 GetItem 487 CreateItem 104 DeleteItem 1465 FindFolder 407 GetClientIntent 361 GetUserConfiguration 1020 8190 GetMailTips 3344 GetAppManifests 2565 GetServiceConfiguration 1229 GetAppMarketplaceUrl 7892 GetUserPhoto 1549 Sbsc_EventsAvailable 1638 Sbsc_SndNtf 2551 GetEvents 1129 EndSearchSession 1495 Sbsc_WrtRspFailed 216 GlobalActivity 6545 GetSearchSuggestions 3395 ExecuteSearch 1227 StartSearchSession 450 SyncFolderHierarchy 5520 SyncFolderItems 593 ConvertId 213 ResolveNames 46 GetClutterState 378 UpdateItem 116 Sbsc_QErr 116 Sbsc_NoSubLeft 116 Sbsc_ErrNtf 272 GetRoomLists 18 CreateFolder 6 Unsubscribe 6 FindConversation 43 SetUserOofSettings 3 UpdateFolder 44 GetAttachment 16 MoveItem 108 Sbsc_DisCntSub 1 CopyItem
Natürlich können sie auch anhand der anderen Felder und Inhalte ihre eigenen Auswertungen durchführen, z.B. EWS-Anfragen nach Client-IP oder User ermitteln und so Missbrauch oder Überbeanspruchung eingrenzen.
EWS Throttling
Neu in Exchange 2010 ist die Funktion, dass ein Client nicht den Server per Web Services voll machen. Wer also zu "verfressen" mit EWS arbeitet, wird ausgebremst. Sinnvoll ist dies bei der Entwicklung des Code zu berücksichtigen und "Paged Searches" zu verwenden.
NOTE: Even after the EWS Throttling Policy has been updated, EWS imports
will still be limited to 150MB per 5 minutes per mailbox; to achieve
higher migration throughput speeds, please migrate more users
concurrently.
https://docs.microsoft.com/de-de/exchange/client-developer/exchange-web-services/ews-throttling-in-exchange
Weitere Infos finden Sie u.a. auf:
- EWS throttling in Exchange
https://docs.microsoft.com/de-de/exchange/client-developer/exchange-web-services/ews-throttling-in-exchange - Throttling Policies and Caches
http://blogs.msdn.com/b/exchangedev/archive/2010/03/15/throttling-policies-and-caches.aspx - Throttling Policy Fallback Logic
http://blogs.msdn.com/b/exchangedev/archive/2010/03/13/throttling-policy-fallback-logic.aspx - Throttling Policies and the EWSFindCountLimit
http://blogs.msdn.com/b/exchangedev/archive/2010/03/12/throttling-policies-and-the-ewsfindcountlimit.aspx - Throttling Policies and CPUStartPercent
http://blogs.msdn.com/b/exchangedev/archive/2010/03/11/throttling-policies-and-cpustartpercent.aspx - Budget Snapshots in the IIS Logs
http://blogs.msdn.com/b/exchangedev/archive/2010/03/10/budget-snapshots-in-the-iis-logs.aspx
Exchange 2007 Webservices ohne Managed API
Eine Echtzeitverarbeitung mit der Option, eine Änderung des Clients zu verhindern oder synchron andere Funktionen durchzuführen ist mit Webservices scheinbar nicht möglich.
Hier nur eine kleine Auswahl von Links. Die MSDN-Seite ist sicher die beste Quelle.
- Exchange Web Services - What You Didn't Know
http://blogs.technet.com/b/exchange/archive/2009/03/24/450892.aspx - Exchange 2007 - Development: Overview
http://technet.microsoft.com/en-us/library/aa997614.aspx - Introduction to Exchange Web Services in Exchange 2007 (Part 1-3)
http://msdn.microsoft.com/en-us/library/bb408417.aspx
http://msdn.microsoft.com/en-us/library/bb421489.aspx
http://msdn.microsoft.com/en-us/library/bb508825.aspx - Exchange Web Services - What You Didn't Know
http://blogs.technet.com/b/exchange/archive/2009/03/24/450892.aspx - Exchange Web Services 101 : Let's get started!
http://blogs.msdn.com/vikas/archive/2009/06/20/exchange-web-services-101-let-s-get-started.aspx - Using Delegate Access with Exchange Web Services
http://msdn.microsoft.com/en-us/library/bb655860.aspx - Using SQL Server Table-Valued User-defined Functions with Exchange Web
Services
http://msdn.microsoft.com/en-us/library/bb508823.aspx - Whitepaper:Managing the Calendaring and Collaboration Process By using
Exchange Server 2007 Web Services
http://technet.microsoft.com/en-us/library/bb887629.aspx - Using SQL Server Table-Valued User-defined Functions with Exchange Web
Services
http://msdn.microsoft.com/en-us/library/bb508823.aspx - Finding Items
http://msdn.Microsoft.com/library/default.asp?URL=/library/en-us/exsdkprogtasks/html/63af1f9c-464b-4fca-9ae3-3d60f24ca93c.asp
Der Code kann noch falsch sein. Update siehe
http://forums.Microsoft.com/TechNet/ShowPost.aspx?PostID=582795&SiteID=17 - TechReady 2007 Exchange Web Services Samples
http://go.microsoft.com/?linkid=7149941
The TechReady 2007 Exchange Web Services samples show how to integrate Microsoft Exchange Server 2007 data within line-of-business applications and third-party solutions by using the new Exchange Web Services feature. - Exchange 2007 3/4: Client Zugriff und Webservices
http://techfiles.de/dmelanchthon/webcasts/1032296864.wmv - WebDAV
- MSPress Buch: Inside Microsoft Exchange Server 2007 Web Services;
ISBN 9780735623927 - TechReady 2007 Exchange Web Services Samples
http://www.microsoft.com/downloads/details.aspx?FamilyID=211d60c1-55eb-4bfd-8425-fcf980e9ceab&DisplayLang=en - Exchange Web Services Reference
http://msdn2.microsoft.com/en-us/library/bb204119(EXCHG.80).aspx - Exchange Server 2007 Web Service API für Developers!
http://blogs.msdn.com/ericlee/archive/2006/10/22/exchange-server-2007-for-developers.aspx - Exchange 2007 Web Services Around the Web
http://blogs.msdn.com/mstehle/archive/2007/01/23/fyi-exchange-2007-web-services-around-the-web.aspx - Working with Time Zones in the Exchange Web Service
http://msdn2.microsoft.com/en-us/library/bb655859.aspx - Exchange Web Services Windows Vista Gadget Sample Application
http://www.microsoft.com/downloads/details.aspx?FamilyID=F9A0D33C-C894-4EA1-AD20-4E418C715175&displaylang=en - Exchange Server 2007 SP1 Creating an Exchange Web Services Client
Application
http://msdn.microsoft.com/en-us/library/bb408521(EXCHG.80).aspx - Exchange Server 2007 SP1 Getting Started With Exchange Web Services
Proxy Programming
http://msdn.microsoft.com/en-us/library/bb408522(EXCHG.80).aspx - Exchange Server 2007 SP1 Setting up the ExchangeServiceBinding Proxy
Class
http://msdn.microsoft.com/en-us/library/bb408524(EXCHG.80).aspx - Building Rich Calendaring Experiences with Exchange Web Services
[UNC401]
http://www.msteched.com/online/view.aspx?tid=3ed2cdd6-a4d1-4517-970f-5854095 a8ee8 - Setting the Task owner on new items using Exchange WebServices
http://www.infinitec.de/post/2009/03/19/Setting-the-Task-owner-on-new-items-using-Exchange-WebServices.aspx - Saving custom data on Exchange elements with The Exchange WebServices
http://www.infinitec.de/post/2009/03/27/Saving-custom-data-on-Exchange-elements-with-The-Exchange-WebServices.aspx - Searching a meeting with a specific uID using Exchange Web Services 2007
http://www.infinitec.de/post/2009/04/13/Searching-a-meeting-with-a-specific-UID-using-Exchange-Web-Services-2007.aspx
EWS.DLL als Proxyklasse
Normalerweise nutzt ein Entwickler WSDL, um von einem Webservice die unterstützt Schnittstellen zu erfahren. Dazu muss man aber zur Entwicklungszeit natürlich zugriff auf den Webservice haben. Und nicht alle EntwicklungsUmgebungen unterstützen direkt die Einbindung der WSDL-Informationen. Man kann daher die Beschreibung in einer DLL "einpacken", so dass auch andere Umgebungen eine elegante Unterstützung bei der Entwicklung erlauben.
- Exchange API-spotting : Generating Exchange Web Services Proxy
Classes
http://blogs.msdn.com/exchangedev/archive/2007/12/07/generating-exchange-web-services-proxy-classes.aspx - ExchangeServiceBinding Class
http://msdn.microsoft.com/en-us/library/exchangewebservices.exchangeservicebinding(EXCHG.80).aspx
Eleganter weise hat Glen Scales schon wieder die Arbeit getan, die Microsoft im BLOG nicht getan hat und stellt eine EWS.DLL direkt bereit
EWS.DLL zum Download
http://msgdev.mvps.org/exdevblog/ewsutil.zip.
Mit dieser EWS ist es dann auch in PowerShell sehr einfach auf Exchange 2007 Ressourcen zuzugreifen. Hier ein Beispiel, um sich per PowerShell auf den Posteingang zu verbinden.
[void][Reflection.Assembly]::LoadFile("C:\Programme\msxfaq\EWSUtil.dll") $mbMailboxEmail = "admin@msxfaq.local" $ewc = new-object EWSUtil.EWSConnection($mbMailboxEmail,$false,$null,$null,$null,$null) $dTypeFld = new-object EWSUtil.EWS.DistinguishedFolderIdType $dTypeFld.Id = [EWSUtil.EWS.DistinguishedFolderIdNameType]::inbox $mbMailbox = new-object EWSUtil.EWS.EmailAddressType $mbMailbox.EmailAddress = $mbMailboxEmail $dTypeFld.Mailbox = $mbMailbox $fldarry = new-object EWSUtil.EWS.BaseFolderIdType[] 1 $fldarry[0] = $dTypeFld $msgList = $ewc.FindUnread($fldarry, $null, $null, "") if ($msgList.Count -ne 0){ "Inbox:" + $msgList[0].Subject.ToString() }
Sie können daher die Beschreibung in eine DLL "einpacken", so dass auch andere Umgebungen eine elegante Unterstützung bei der Entwicklung erlauben.
- Exchange API-spotting : Generating Exchange Web Services Proxy
Classes
http://blogs.msdn.com/exchangedev/archive/2007/12/07/generating-exchange-web-services-proxy-classes.aspx - ExchangeServiceBinding Class
http://msdn.microsoft.com/en-us/library/exchangewebservices.exchangeservicebinding(EXCHG.80).aspx - Finding unused mailboxes
http://www.outlookexchange.com/articles/glenscales/unreadrep.asp - Exchange 2007: Abwesenheitsnotiz per PowerShell setzen
http://gsexdev.blogspot.com/2008/02/class-library-to-help-setting-out-of.html
http://msgdev.mvps.org/setoofexamples.htm
http://www.roland-ehle.de/archives/793
Nutzt die EWS.DLL von Glen Scales - Manage Exchange 2007 Out-Of-Office (OOF) Settings
with PowerShell and the EWS Managed API
http://www.mikepfeiffer.net/2010/07/manage-exchange-2007-out-of-office-oof-settings-with-PowerShell-and-the-ews-managed-api/ - Setting Out-of-Office OOF with PowerShell and the
EWS Managed API
http://gsexdev.blogspot.com/2009/08/setting-out-of-office-oof-with.html - Exchange Web Services - What You Didn't Know
http://blogs.technet.com/b/exchange/archive/2009/03/24/450892.aspx
- EWS is Only API für next Exchange Version
- Vista and MAC Gadgets as samples using EWS
- MAC Entourage uses EWS only
- Android uses EWS für Contacts
- Managed API with next version of Exchange
Visual Studio und Webservices
Natürlich können Visual Studio 2005 und 2008 ganz einfach Webservices einbinden. Über das Projektmenü" wird ein Assistent zum einbinden eines Webservice gestartet, der dann eine "Hilfsklasse" erstellt, die in der späteren Entwicklung einfach genutzt werden kann.
Mit Visual Studio 2008 gibt es eine "Service Referenz"
Danach können Sie in Visual Studio die Webservices wie jede andere Klasse verwenden
- Exchange Server 2007 SP1 Creating a Proxy Reference by using
Visual Studio 2005
http://msdn.microsoft.com/en-us/library/bb408520(EXCHG.80).aspx
EWS und Limits
Per Default erlauben die Exchange 2007 Webservices nur Anlagen bis 10 Megabyte. Dies ist ein Schutz gegen übergroße http-Requests und sollte für die Migration temporär erhöht werden.
Dazu ist auf dem CAS-Server die WEB.CONFIG im virtuellen Verzeichnis "/EWS" der Default Webseite anzupassen. Diese liegt normalerweise auf C:\Program Files\Microsoft\Exchange Server\ClientAccess\exchweb\ews). Suchen Sie in der Datei nach dem Tag: <system.web> in dem sich folgende Zeile befindet:
<httpRuntime maxRequestLength="10240" />
Tragen Sie hier die gewünschte maximale Größe ein. Denken Sie aber daran, nach der Migration den Wert wieder auf eine für ihr unternehmen passende Größe einzustellen. ACHTUNG: Dieser Wert ist nach einem Update (Servicepack, Rollup) zu prüfen und eventuell erneut zu setzen.
Zudem sollten Sie im IIS noch die Konfiguration anpassen:
C:> cd \Windows\System32\inetsrv C:> appcmd set config "Default Web Site/ews" -section:requestFiltering -requestLimits.maxAllowedContentLength:[size in Bytes!] C:> iisreset
Danach sollten die neuen Grenzen gelten.
- Konfigurieren von clientspezifischen
Nachrichtengrößenbegrenzungen
https://technet.microsoft.com/de-de/library/hh529949(v=exchg.150).aspx - Understanding message size limits
https://technet.microsoft.com/en-us/library/bb124345.aspx - Raise your Exchange Server EWS limits prior to
starting your MigrationWiz project
https://mymicrosoftexchange.wordpress.com/2015/06/28/raise-your-exchange-server-ews-limits-prior-to-starting-your-migrationwiz-project/ - Entourage EWS Attachment Limits
http://ministry-it.blogspot.com/2009/08/entourage-ews-attachment-limits.html - HOWTO: Basics of IIS6 Troubleshooting
http://blogs.msdn.com/b/david.wang/archive/2005/12/31/howto-basics-of-iis6-troubleshooting.aspx - 820129 Http.sys registry settings für IIS
- HTTP 400 Bad Request Error When You Access an
Exchange 2007 Mailbox
http://technet.microsoft.com/en-us/library/dd159912(EXCHG.80).aspx - 832975/ Additional properties are now available für logging in the Httperr#.log file in IIS 6.0 and IIS 7.0
- Controlling attachment size in Exchange Server 2007
Outlook Web Access (OWA)
http://blogs.technet.com/b/exchange/archive/2006/11/14/431477.aspx
EWS und Memory
Bei Verschiedenen Programmen habe ich gesehen, dass diese immer auf dem Exchange Server immer mehr Speicher fressen und dann EWS die Schuld gegen wird. Genau genommen ist es aber eine unsaubere Programmierung des Clients. Exchange "cached" Daten. Der Prozess der "Garbage Collection" kann nur solche Speicherbereiche wieder freigeben, wenn die darin vorgehaltenen Objekte als "nicht mehr erforderlich" gekennzeichnet sind. Dazu gibt es extra die "Finalize"-Methode:
- .NET Framework Class Library Object.Finalize Method
http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx
Wenn Sie als Entwickler also in einen Programm z.B. die EWS-Instanz nicht wieder frei geben, sondern einfach weiter neue Instanzen öffnen, dann wird der belegte Speicher nicht frei gegeben. Zugegeben, ich bin selten in der Situation mir darüber Gedanken machen zu müssen, da meine Skripte eigentlich nicht "endlos" laufen, sondern am Ende terminieren und damit den Speicher frei geben. Das ist aber anders, wenn Sie eine permanent aktive Lösung entwickeln.
EWS Synchronisation
Je weniger Server mit Exchange 2003 und Früher arbeiten, desto eher gibt es Exchange 2007 und höher, die alle EWS anbieten und auch die Microsoft Cloud und andere Anbieter bieten EWS als einziger Weg auf die Postfächer an. MAPI und CDO sind auf dem absteigenden Asts.
Da könnte man ja auf die Idee kommen, einfach per EWS z.B. zwei Postfächer in unterschiedlichen Exchange Organisationen "Synchron" zu halten, z.B. Um eine elegante Koexistenz zu erreichen oder auch eine Stichtagmigration vorzubereiten.
Aktuell habe ich selbst noch kein "fertiges Skript" oder gar eine Lösung dazu. Sie können mir aber gerne Links und Erfahrungen mitteilen, die ich hier gerne ergänze.
- Mailbox synchronization and
EWS in Exchange
https://learn.microsoft.com/en-us/exchange/client-developer/exchange-web-services/mailbox-synchronization-and-ews-in-exchange - Synchronizing folder
hierarchy by using the EWS
Managed API
http://msdn.microsoft.com/en-us/library/ee693005(v=exchg.80).aspx - Synchronizing items by using
the EWS Managed API
http://msdn.microsoft.com/en-us/library/ee693003(v=exchg.80).aspx - Exporting and importing
items by using EWS in Exchange
https://learn.microsoft.com/en-us/exchange/client-developer/exchange-web-services/exporting-and-importing-items-by-using-ews-in-exchange - Using ExportItems and uploadItems Cmdlets
http://www.messageops.com/software/office-365-tools-and-utilities/messageops-exchange-ews-module/using-exportitems-and-uploaditems-cmdlets - Reporting and Clearing the
SyncIssues, Conflicts,
LocalFailures and ServerFailures using EWS and PowerShell
http://gsexdev.blogspot.de/2012/07/reporting-and-clearing-syncissues.html
Weitere Links
Microsoft Consultant Exchange & Skype for Business (m/w)
Kommen Sie zu Net at Work. Wir haben spannende Projekte bei innovativen Kunden. Unser Team arbeitet kollegial und kooperativ – ständiger Austausch und Weiterbildung sind bei uns Standard.
https://www.netatwork.de/unternehmen/karriere/
Hier nur eine kleine Auswahl von Links. Die MSDN-Seite ist sicher die beste Quelle.
-
EWSEditor
Zugriff auf Postfachinhalte per Exchange Web Services - Webservice
- 2449266 EWS drops the TCP connection to the EWS client application without any error message in a Microsoft Exchange Server 2010 environment
- What's New in AD DS: Active Directory Web Services
http://technet.microsoft.com/en-us/library/dd391908%28WS.10%29.aspx - Wikipedia Beschreibung
http://de.wikipedia.org/wiki/Webservice
http://en.wikipedia.org/wiki/Web_service - Web Services Activity
http://www.w3.org/2002/ws/ - WebDAV
WebDAV ist nicht WebSerivces, auch wenn bei de HTTP und XML nutzen - Exchange 2007 3/4: Client Zugriff und Webservices
http://techfiles.de/dmelanchthon/webcasts/1032296864.wmv - Exchange Server 2007 - Exchange Web Services
http://msdn2.microsoft.com/en-us/library/aa579187.aspx - Exchange Server 2007 SP1 Creating Contacts (Exchange Web Services)
http://msdn.microsoft.com/en-us/library/aa563318(EXCHG.80).aspx - Exchange Server 2007 Web Service API für Developers!
http://blogs.msdn.com/ericlee/archive/2006/10/22/exchange-server-2007-for-developers.aspx - Exchange Web Services Windows Vista Gadget Sample Application
http://www.microsoft.com/downloads/details.aspx?familyid=F9A0D33C-C894-4EA1-AD20-4E418C715175&displaylang=en - Exchange Web Services OSX Widget
http://www.codeplex.com/EWSMacWidget -
Wrapper (OpenSource), der viel von der Arbeit abnimmt, die man beim
Implementieren von Push Notifications hat.
http://www.codeplex.com/exchangenotification -
Blog-Eintrag zu Push Benachrichtigung
http://www.infinitec.de/?tag=/push+notifications -
Exchange Web Services Reference - FindMessageTrackingReport
http://msdn.microsoft.com/en-us/library/dd899448.aspx -
Outlook Communicator Phone Edition interactions with Exchange Web Services
http://communicatorteam.com/archive/2008/03/18/130.aspx -
Lotus Notes/Domino 7 Web Services
http://www.ibm.com/developerworks/lotus/library/nd7-webservices/
Seit Notes 7 gibt es auch hier Webservices -
Directory event log event 2917
http://blogs.msdn.com/b/exchangedev/archive/2010/03/16/directory-event-log-event-2917.aspx -
Introduction to Exchange Web Services
http://code.google.com/p/imap2exchange/wiki/ExchangeWebServices -
Exchange Web Services Managed API 1.1 (ca. 700kb)
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c3342fb3-fbcc-4127-becf-872c746840e1 -
MSDN: Exchange Web Services Managed API 1.2 SDK
http://msdn.microsoft.com/en-us/library/dd633710(v=EXCHG.80).aspx -
Exchange Web Services Managed API 1.2
http://www.microsoft.com/download/en/details.aspx?id=28952 -
Exchange 2010 Service Pack 1 (SP1) Web Services Software Development Kit
(SDK)
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=d55dcd05-1dd6-4f44-956f-82f052ee7d82 - 2500102 OWA Exchange 2010 created recurring meeting causes EWS clients to throw "Meeting message could not be correlated" exception
- http://exchws.wordpress.com/ews-autodiscover-diagnostic-utility/
-
Exchange Web Services (EWS) Managed API - Part 2
http://blogs.planetsoftware.com.au/paul/archive/2010/05/20/exchange-web-services-ews-managed-api-ndash-part-2.aspx -
Getting Started with the EWS Managed API
https://GitHub.com/OfficeDev/ews-managed-api/blob/master/README.md -
Start using web services in Exchange
https://msdn.microsoft.com/en-us/library/jj900168(v=exchg.80).aspx -
Exchange 2013 101 Code Samples
https://code.msdn.microsoft.com/Exchange-2013-101-Code-3c38582c -
Microsoft Exchange WebServices 2.2.0
http://www.nuget.org/packages/Microsoft.Exchange.WebServices/