Si está en .NET 3.5 o arriba, se puede utilizar el nuevo espacio de nombres System.DirectoryServices.AccountManagement
(S.DS.AM) que hace esto mucho más fácil de lo solía ser.
leer todos los detalles aquí:
Managing Directory Security Principals in the .NET Framework 3.5
Actualización: más viejos artículos de revistas MSDN no están en línea más, por desgracia - que necesita para download the CHM for the January 2008 MSDN magazine de Microsoft y leer el artículo en ese país.
Básicamente, es necesario tener un "contexto principal" (por lo general su dominio), un principal de usuario, y luego obtener sus grupos muy fácilmente:
public List<GroupPrincipal> GetGroups(string userName)
{
List<GroupPrincipal> result = new List<GroupPrincipal>();
// establish domain context
PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);
// find your user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName);
// if found - grab its groups
if(user != null)
{
PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups();
// iterate over all groups
foreach(Principal p in groups)
{
// make sure to add only group principals
if(p is GroupPrincipal)
{
result.Add((GroupPrincipal)p);
}
}
}
return result;
}
y eso es todo lo que hay! Ahora tiene un resultado (una lista) de los grupos de autorización a los que pertenece el usuario: itere sobre ellos, imprima sus nombres o lo que necesite hacer.
Actualización: Con el fin de acceder a ciertas propiedades, que no se salieron a la superficie en el objeto UserPrincipal
, es necesario profundizar en la DirectoryEntry
subyacente:
public string GetDepartment(Principal principal)
{
string result = string.Empty;
DirectoryEntry de = (principal.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
if (de.Properties.Contains("department"))
{
result = de.Properties["department"][0].ToString();
}
}
return result;
}
Actualización # 2: parece que no debe ser demasiado difícil poner estos dos fragmentos de código juntos .... pero bien - que aquí va:
public string GetDepartment(string username)
{
string result = string.Empty;
// if you do repeated domain access, you might want to do this *once* outside this method,
// and pass it in as a second parameter!
PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);
// find the user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, username);
// if user is found
if(user != null)
{
// get DirectoryEntry underlying it
DirectoryEntry de = (user.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
if (de.Properties.Contains("department"))
{
result = de.Properties["department"][0].ToString();
}
}
}
return result;
}
@Tassisto: desafortunadamente, esa propiedad no está disponible directamente en 'UserPrincipal'; vea mi respuesta actualizada para saber cómo llegar a ella. –
Necesito dar el nombre de usuario para obtener el valor de su campo de departamento – SamekaTV
@Tassito: bien, entonces 1) crear un contexto de dominio, 2) encontrar ese usuario por su nombre, y 3) usar mi fragmento de código para obtener su departamento –