Laden...

[C#]Auf freigegebenes Exchange-Postfach zugreifen

Erstellt von xasz vor 12 Jahren Letzter Beitrag vor 12 Jahren 4.057 Views
X
xasz Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren
[C#]Auf freigegebenes Exchange-Postfach zugreifen

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

G
538 Beiträge seit 2008
vor 12 Jahren

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)

X
xasz Themenstarter:in
11 Beiträge seit 2011
vor 12 Jahren

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 ?

G
538 Beiträge seit 2008
vor 12 Jahren

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)

T
156 Beiträge seit 2010
vor 12 Jahren

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