Accediendo al directorio activo de la organización desde .NET (III)

login

En vista a que bastante gente me ha pedido si puedo publicar ya el código del proyecto de ejemplo, he decidido publicarlo ahora en lugar de esperar al último post de la serie. En caso que se realicen variaciones en el código, las publicaré posteriormente.

Aquí lo teneis, publicado en skydrive (*):

(*) En ocasiones, al realizar cross-posting a otros blogs desde el original de geeks.ms, tal vez no aparezca correctamente el enlace a skydrive. Si es así, os recomiendo que visitéis el post original en geeks.ms y realicéis la descarga desde éste.

En el post anterior, os dije que en el siguiente (este post) mostraríamos cómo realizar la suplantación (Impersonate) de usuario de Windows para ejecutar nuestra aplicación con otras credenciales. Sin embargo, como ésto ya lo mostré en otro post de una serie anterior, lo doy por explicado y así avanzamos un poco más.

System.Net.NetworkInformation

Antes de entrar al trapo, un pequeño apunte. Apuntaros este espacio de nombres, que hemos utilizado para obtener algunos datos básicos para el proyecto, y que contiene un montón de métodos que devuelven información muy interesante sobre el tráfico y estadísticas de red.

System.Net.NetworkInformation

LDAPServices

Vamos a ir comentando algunas de los métodos que proporciona esta clase. Como os comenté son todos estáticos, por lo que no es necesario instanciar un objeto para invocarlos. Empecemos:

sIDtoString - Trabajando con el AD constantemente vamos a encontrarnos con los llamados SID (identificadores de seguridad). Este método se encarga de transformar un SID (array de bytes) en una cadena de texto que pueda ser mostrada al usuario.

public static string 
    sIDtoString(byte[] sidBinary)
{
    SecurityIdentifier sid = new SecurityIdentifier(sidBinary, 0);
    return sid.ToString();
}

getNTAccountName - Devuelve el nombre del objeto dentro del AD a partir de su SID. Por ejemplo, a partir de un identificador de seguridad como {S-1-5-12-7623811015-3361044348-030300820-1013} retorna un string con formato: 'DOMINIO\NombreObjeto'.

public static string 
    getNTAccountName(string wksid)
{
    SecurityIdentifier sid = new SecurityIdentifier(wksid);
    NTAccount account = (NTAccount)sid.Translate(typeof(NTAccount));
    return account.Value;
}

getADUserMemberOf - Devuelve un diccionario con los grupos a los que pertenece un usuario. Espera un argumento de tipo token de seguridad (habitualmente utilizaremos el WindowsIdentity.GetCurrent().Token) y el diccionario genérico devuelto es de tipo <string, IdentityReference>.

public static Dictionary<string, IdentityReference> 
    getADUserMemberOf(IntPtr logonToken) 
{
    Dictionary<string, IdentityReference> groups =
        new Dictionary<string, IdentityReference>();
    WindowsIdentity user = new WindowsIdentity(logonToken); 
    IdentityReferenceCollection irc = user.Groups; 
    foreach (IdentityReference ir in irc) 
    {
        groups.Add(getNTAccountName(ir.Value), ir);
    }
    return groups; 
}

(*) Al ir escribiendo el artículo me he dado cuenta de que esta función podría ser optimizada, aprovechando algunas de las nuevas características de C# 3.0, incorporadas en Visual Studio 2008. De modo que podría ser re-escrita del siguiente modo ¡en tan sólo 3 líneas!

public static Dictionary<string, IdentityReference>
    getADUserMemberOf2(IntPtr logonToken)
{
    WindowsIdentity user = new WindowsIdentity(logonToken);
    var groups = from g in user.Groups select g;
    return groups.ToDictionary(p => getNTAccountName(p.Value));
}

¿Menudo cambio, verdad? Observar el uso de:

  1. Inferencia de tipos (var)
  2. Palabras clave de consulta (from, in, select)
  3. Expresiones lambda en la llamada al método extensor ToDictionary (p => getNTAccountName(p.Value))

getADUserMemberOf2

La verdad es que en cuanto empiezas a usar estas mejoras te 'enganchan'. No sabeis la cara de bobo que se me queda cuando a veces abro el editor de VB6.0 (si, habéis oído bien) para realizar alguna modificación en aplicaciones que todavía no se han migrado a .NET (y lo que les queda... :-P).

Hasta aquí algunos de los métodos que contiene la clase LDAPServices. En el próximo post veremos cómo obtener la lista de propiedades de un objeto user dentro del directorio activo, así cómo realizar búsquedas de objetos dentro del directorio.

wally_simpsons

No vemos pronto,

Published 4/7/2008 16:45 por Lluis Franco
Comparte este post:

Comentarios

# re: Accediendo al directorio activo de la organización desde .NET (III)

Tuesday, September 16, 2008 10:13 PM por migue

desde los angeles chile

mira estoy haciendo mi practica y encontre esto ke lastima ke nadie deje

su comentario

pero muchas gracias

la gente no valora, lo importante que es

hasta la proxima

# re: Accediendo al directorio activo de la organización desde .NET (III)

Thursday, January 28, 2010 2:32 PM por Alejox

Brother muchas gracias por esta informacion... en realidad no se como llegar a la parte IV pero igual seguire buscando.

Buen dia