Ich will über einen Pool von bestimmten EMail Adressen die Out of Office Meldung setzten. Dazu nutze ich EWS. Für meine eigene EMail ist das auch kein Problem. Aber wie kann ich das mit fremden EMails machen? Dieser Code hier scheittert mit einer 401'er Meldung beim GetUserOofSettings(.
//URL ermitteln exchangeService.AutodiscoverUrl(selectedMail); //Diverse User probiert. u.a. auch den Domain Admin. exchangeService.Credentials = new NetworkCredential(adminUserName, adminPassword, domain); //selectedMail ist die Mail auf der ich OoF setzen will. exchangeService.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, selectedMail); //System Proxy holen von wegen HTTPS exchangeService.WebProxy = WebRequest.GetSystemWebProxy(); //Hier bekomme ich, egal welche User ich verwende, immer einen 401'er OofSettings oofSettings = exchangeService.GetUserOofSettings(
Wenn ich die Webseite https://EXCHANGE/EWS/Services.wsdl im Browser aufrufe habe ich keine Probleme. Dort bekomme ich alles zurück was ich brauche.
Das Auslesen des Oof-Status geht mit Hilfe eines Workarounds, das Setzen geht nicht, da die setOof-Methode keine Impersonation unterstützt.
Auslesen:
using System; using GetOOFState.MyEWS;
namespace GetOOFState { class Program { static void Main(string[] args) {
ExchangeServiceBinding esb = new ExchangeServiceBinding(); esb.Url = "https://server/ews/exchange.asmx"; esb.Credentials = new System.Net.NetworkCredential("ServiceAccount", "Password", "Domain");
esb.ExchangeImpersonation = new ExchangeImpersonationType(); esb.ExchangeImpersonation.ConnectingSID = new ConnectingSIDType(); esb.ExchangeImpersonation.ConnectingSID.PrimarySmtpAddress = "username@domain.com";
FindItemType fit = new FindItemType(); fit.ItemShape = new ItemResponseShapeType(); fit.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties; fit.Restriction = new RestrictionType();
IsEqualToType itemMessageClass = new IsEqualToType();
PathToUnindexedFieldType msgClassProp = new PathToUnindexedFieldType(); msgClassProp.FieldURI = UnindexedFieldURIType.itemItemClass;
ConstantValueType msgClassValue = new ConstantValueType(); msgClassValue.Value = "IPM.Microsoft.OOF.UserOOFSettings";
itemMessageClass.Item = msgClassProp; itemMessageClass.FieldURIOrConstant = new FieldURIOrConstantType(); itemMessageClass.FieldURIOrConstant.Item = msgClassValue;
fit.Restriction = new RestrictionType(); fit.Restriction.Item = itemMessageClass;
DistinguishedFolderIdType rootFolder = new DistinguishedFolderIdType(); rootFolder.Id = DistinguishedFolderIdNameType.root;
fit.ParentFolderIds = new BaseFolderIdType[] { rootFolder };
Richtig, seinen eigenen Status kann man natürlich ändern. Ob und was sich am Exchange Service von Version zu Version geändert hat, weiss ich leider nicht, und einen 2007er haben wir leider auch nicht im Einsatz. Musst Du wohl einfach ausprobieren, macht ja nichts kaputt.
Jap, macht zwar nichts kaupt, aber einfach so einen 2007'er Exchange aufzuziehen wird wohl nicht drin liegen. Na ja, dass müssen dann Andere entscheiden.
Schande. Geht nicht. Bekomme immer noch eine 401'er. esb.Credentials = new NetworkCredential(adminName, adminPassword, domain); Der Admin ist so einer der auf alle Postfächer im Exchange 2010 Vollzugriff hat. Gem. Support ist das der absolute Bigboss. Und das hier: esb.ExchangeImpersonation.ConnectingSID.Item = email; Dieses Konto will ich abfragen. Bei FindItemResponseType firt = esb.FindItem(fit); bekomme ich dann den 401'er. Grrr. Was hätte ich sonst noch für möglichkeiten?
Noch eine Info. Sobald man das hier beachtet: http://msdn.microsoft.com/en-us/library/bb204095.aspx funktioniert so einiges was vorher nicht tat, und zwar mit dem Code den ich gepostet habe.