Tema: Exchange Web Services (EWS)
Pregunta: Cómo realizar la impersonación para poder tener acceso a los buzones de los usuarios sin disponer de sus contraseñas.
Respuesta:
Hola a Tod@s !!
Tras sufrir de lo lindo últimamente con Exchange 2007, me he decidido a postear algo que muy dificilmente encontrareis por la red de redes.....
He estado trabajando este último año con Exchange 2007 y probablemente necesiteis realizar impersonación a la hora de atacar Exchange, así que aquí os dejo la información necesaria para ello.
En primer lugar:
Para invocar a los Web Services propios de Exchange 2007 es necesario crear un usuario de servicio que cuente con permisos de impersonación sobre las mailbox databases. Para cada entorno se creará el usuario llamado ExchangeWSuser (sin incluir en ningún grupo de seguridad, únicamente en “domain user” ) y desde el servidor de Exchange 2007 se deberán ejecutar estas dos sentencia en PowerShell. Estos comandos será preciso ejecutarse cada vez que se cree una BBDD de Exchange 2007.
Get-MailboxDatabase | ForEach-Object {Add-ADPermission -Identity $_.DistinguishedName -User ExchangeWSUser -ExtendedRights ms-Exch-EPI-May-Impersonate}
Add-ADPermission -Identity (get-exchangeserver -Identity SERVER_NAME).DistinguishedName -User (Get-User -Identity ExchangeWSUser | select-object).identity -extendedRight ms-Exch-EPI-Impersonation
El documento referencia es el siguiente:
http://msdn.microsoft.com/en-us/library/bb204095.aspx
Una vez tenemos el usuario ExchangeWSUser creado, debemos utilizarle al instanciar nuestro ExchangeServiceBinding de la siguiente forma:
Código:
ExchangeServiceBinding esb = new ExchangeServiceBinding();
private static string usuarioEx;
/// <summary>
/// Método privado para crear el Objeto de enlace con Exchange 2007
/// </summary>
/// <param name="UserName">Nombre de Usuario sobre el que se van a realizar las operaciones.</param>
/// <param name="Domain">Dominio del usuario</param>
/// <param name="Url">Url De Exchange. Este parámetro es opcional. Se cogerá la Url por defecto en caso de llegar vacío.</param>
private void CreateExchangeServiceBinding(string UserName, string Domain, string Url)
{
usuarioEx = UserName;
esb.ExchangeImpersonation = new ExchangeImpersonationType();
ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
// Replace this line with code to validate server certificate.
return true;
};
esb.ExchangeImpersonation.ConnectingSID = new ConnectingSIDType();
esb.ExchangeImpersonation.ConnectingSID.PrimarySmtpAddress = UserName + "@" + Domain;
if (Url != null && Url != string.Empty)
{
esb.Url = Url;
}
else
{
esb.Url = ConfigurationManager.AppSettings["EWSUrl"].ToString();
}
// Identificamos el enlace del servicio y el usuario Exchange que reealizará la impersonación
esb.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["ExchangeWsUser"].ToString(), ConfigurationManager.AppSettings["ExchangeWsPass"].ToString(), ConfigurationManager.AppSettings["ExchangeWsUserDomain"].ToString());
}
Como veis accedemos al config en algunos casos:
Cita: ConfigurationManager.AppSettings["ExchangeWsUser"]
Obteniendo el username, pass y domain al que pertenece el usuario impersonador.
Espero que les sirve de ayuda.
Un saludooo!!!