| 

.NET C# Java Javascript Exception

1
Hallo

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.

Hat wer eine Idee?
News:
16.08.2011
GENiALi 2,1k 2 8
1 Antwort
2
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 };

FindItemResponseType firt = esb.FindItem(fit);
string itemID = ((ArrayOfRealItemsType)((FindItemResponseMessageType)firt.ResponseMessages.Items[0]).RootFolder.Item).Items[0].ItemId.Id;

GetItemType git = new GetItemType();
ItemIdType iit = new ItemIdType();
iit.Id = itemID;

git.ItemIds = new BaseItemIdType[] { iit };

git.ItemShape = new ItemResponseShapeType();
git.ItemShape.BaseShape = DefaultShapeNamesType.IdOnly;

PathToUnindexedFieldType []propsToFetch = new PathToUnindexedFieldType[1];
propsToFetch[0] = new PathToUnindexedFieldType();
propsToFetch[0].FieldURI = UnindexedFieldURIType.itemBody;

git.ItemShape.AdditionalProperties = propsToFetch;



GetItemResponseType girt = esb.GetItem(git);
ItemType itemOOF = ((ItemType)(((ItemInfoResponseMessageType)girt.ResponseMessages.Items[0]).Items.Items[0]));

System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument();
xDoc.LoadXml(itemOOF.Body.Value);
Console.WriteLine("OOF State: {0}", xDoc.GetElementsByTagName("OofState")[0].InnerText);




}
}
}


Siehe auch http://blogs.msdn.com/b/vikas/
17.08.2011
sgf 326 3
Das heisst, das eigene kann ich setzten, ein Fremdes aber nicht?
GENiALi 17.08.2011
PS: Weisst du das? Ist der Proxy auch mit dem 2007'er kompatiebel?
GENiALi 17.08.2011
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.
sgf 17.08.2011
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.
GENiALi 17.08.2011
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?
GENiALi 18.08.2011
1
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.
GENiALi 19.08.2011

Stelle deine Ews-Frage jetzt!