Hallo Leute,
ich schreibe gerade an einem kleinen Tool für Exchange.
Ich bin jetzt soweit, dass ich auf meine Order, bzw die Ordner des angemeldeten Benutzers zugreifen kann.
Mein Code sieht wie folgt aus:
public class ExchangeConnector
{
.....
public void connectWithEmail(string email)
{
try
{
service = new ExchangeService(eVersion);
// service.Credentials = new NetworkCredential("banane", "1234");
service.AutodiscoverUrl(email);
}
catch (Exception ex)
{
service = null;
throw ex;
}
public CustomTreeItem getFolderTreeForEmail(string email,WellKnownFolderName folderoption)
{
if (service == null)
throw new Exception("Not connected");
CustomTreeItem tree = new CustomTreeItem();
tree.CText = email;
tree.type = "folder";
FolderView fview = new FolderView(1000);
FindFoldersResults fresult = service.FindFolders(folderoption, fview);
foreach (Folder f in fresult.ToList())
{
tree.childs.Add(getFolderSubTree(f));
}
return tree;
}
...
Benutzen tue ich das ganze wie folgt:
ExchangeConnector ec = new ExchangeConnector(host);
ec.connectWithEmail(email);
CustomTreeItem tree = ec.getFolderTreeForEmail(email, WellKnownFolderName.Inbox);
CustomTreeItem publictree = ec.getFolderTreeForEmail("Public Folder",WellKnownFolderName.PublicFoldersRoot);
Mein Problem ist jetzt, dass ich immer die Ordnerstruktur, des am PC angemeldeten Benutzers bekomme, egal welche E-Mail-Adresse ich an die Funktion, connectWithMail übergeben. Ich habe mir einen Testbenutzer "banane" mit EMail angelegt.
Wenn ich diese Zeile:
// service.Credentials = new NetworkCredential("banane", "1234");
einkommentiere, dann werden mir die EMails von banane angezeigt.
Allerdings habe ich "Vollzugriff" auf das Postfach mit meinem eigenen Benutzer,
und ich fände es am besten, wenn ich sozusagen die Anmeldedaten vom Benutzer "banane" nicht bräuchte, sondern über die freigabe darauf zugreifen kann.
Vielen Dank für euere Ideen
grüße xasz
Also zunächst mal meldest du dich ja am EWS als ein bestimmter Benutzer an - wenn du nichts angibst, dann ist das per "Integrated Authentication" und das heißt in deinem Fall als der angemeldete Benutzer.
Wenn du die NetworkCredentials übergibst, siehst du natürlich das von Banane.
Das Auto-Discover sieht im übrigen für alle Emailadressen sehr ähnlich aus ...
Wenn du nun aber ohne Kennwort auf Banane zugreifen möchtest, wirst du wohl auf "Constrained Delegation" zurückgreifen müssen.
Dann kann man per WindowsIdentity(String UPN) mit dem UPN des Benutzers ein Kerberos-Ticket bekommen und Impersonieren, so dass der Code im Benutzerkontext des angegebenen UPN läuft.
(Das erfordert ein wenig Konfiguration von SPNs und einigen anderen Dingen in der AD - die MSDN weiß ganz viel dazu)
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
Hallo Grumbler85,
vielen Dank schonmal für die Antwort, ich habe mal kurz ein bisschen gegoogelt und in der msdn geschaut. Ich werde gleich noch weitersuchen, es wäre nur Klasse wenn du ein kleines Code-Example posten könntest, falls du zufällig eins hast.
Danke xasz.
Edit: Ich habe jezt gerade gesehen, dass man für die "Constrained Delegation" ja ein paar Sachen direkt am AD Einstellen muss. Das ist jetzt eigentlich nicht mein Plan gewesen. Ich habe ja mit m einem Postfach und User "test" Vollzugriff auf das Postfach des Benutzers "banane". Gibt es denn keine Möglichkeit da irgendwie drauf zuzugreifen ohne groß was umzustellen ?
Hm - ich sehe grade ich greife auch auf ein Postfach "von jmd anders zu" (ein Funktionspostfach in dem Fall) ...
Hier schau mal:
public class Mail
{
/// <summary>
/// Sends an Email via an Exchange Functional Mailbox
/// </summary>
/// <param name="Recipient">The recipient's address</param>
/// <param name="MailNotificationSubject">The mail's subject</param>
/// <param name="MailNotificationBody">The body of the email</param>
/// <param name="SenderMail">The sending Email address</param>
/// <param name="OutboxName">The name of an Sent-Elements subfolder where sent mails will besaved</param>
/// <returns>True if the mail was sent, false otherwise</returns>
public static Boolean SendMail(String Recipient, String MailNotificationSubject, String MailNotificationBody, String SenderMail, String OutboxName)
{
try
{
//Initialize Service
ExchangeService service = new ExchangeService();
//Use Integrated Authentification
service.UseDefaultCredentials = true;
//Autodiscover Settings
service.AutodiscoverUrl(SenderMail);
//Find SentItems Folder
Folder folder = Folder.Bind(service, new FolderId(WellKnownFolderName.SentItems, new Mailbox(SenderMail)));
FindFoldersResults searchResults = folder.FindFolders(new FolderView(100));
//Find OutBox by OutboxName (used to save copies of sent mail)
FolderId Outbox = null;
foreach (Folder resultFolder in searchResults.Folders)
{
if (resultFolder.DisplayName == OutboxName)
{
Outbox = resultFolder.Id;
break;
}
}
//Prepare Message
EmailMessage message = new EmailMessage(service);
message.Subject = MailNotificationSubject;
message.Body = new MessageBody(
BodyType.Text,
MailNotificationBody);
message.ToRecipients.Add(Recipient);
//Send and save message (functional mailboxes require saving of sent mails)
message.SendAndSaveCopy(Outbox);
return true;
}
catch { }
return false;
}
}
Vielleicht hilfts ....
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
Hallo,
genau das gleiche Problem hatte ich auch mal mit dem Exchange-Webservice.
Abhilfe hatte eine Assembly namens "ewsutil" geschafft, womit ich es dann geschafft hatte, mich an einen anderen Postfach anzumelden.
Die Assembly kannst Du hier runterladen: http://msgdev.mvps.org/exdevblog/ewsutil.zip
Beispielcode findet sich dazu ziemlich viel im Netz (wenn auch viel für die Powershell, aber das lässt sich ja schnell mal in C# umsetzen).
LG, Marko