[C#][1.1] Comment accéder à Exchange ?
Bonjour tout le monde,
Voilà j'ai un souci, je souhaiterais depuis une application ASP.NET pouvoir accéder à une boîte aux lettres d'un serveur Exchange. Mais la particularité c'est que ça peut-être pour n'importe quel compte (et pas seulement celui associé au profil connecté qu'utilise IIS).
Donc je me suis dis qu'il fallait dans un premier temps usurper le profil Windows avant de se connecter à Exchange.
J'ai donc fait cette classe pour usurper mon profil :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
using System;
using System.Runtime.InteropServices; // DllImport
using System.Security.Principal; // WindowsImpersonationContext
using System.Security.Permissions; // PermissionSetAttribute
public class Impersonation
{
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext impersonationContext;
[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
public static extern int LogonUser(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
public extern static int DuplicateToken(IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);
public Impersonation()
{
}
public bool impersonateValidUser(String userName, String domain, String password)
{
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if(LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if(DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
impersonationContext = tempWindowsIdentity.Impersonate();
if (impersonationContext != null)
return true;
else
return false;
}
else
return false;
}
else
return false;
}
public void undoImpersonation()
{
impersonationContext.Undo();
}
} |
et après j'utilise CDO pour la connexion :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
Impersonation oImperso = new Impersonation();
objSession = new MAPI.SessionClass();
objSession.Logon("monDomaine\\compteUsurpé", "motdepasse", false, true, 0, true, "serveurExchange" + (char)10 + "nomDuCompteExchange");
oImperso.impersonateValidUser("compteUsurpé", "domaine", "motdepasse");
try
{
MAPI.Folder oFolder = (MAPI.Folder)objSession.Inbox;
//...
}
finally
{
oImperso.undoImpersonation();
} |
Et mon problème c'est que ça plante sur le objSession en me sortant une erreur MAPI_E_NOT_FOUND.
Est-ce qu'il arrive à usurper totalement le profil utilisateur ? ou cela vient-il d'autre chose ?
Une idée ??
J'ai fait le tour du Ouaibe rien trouvé pour m'aider :cry: ... Si quelqu'un à une idée.. ou une autre solution pour contourner le problème.
Merci d'avance :P