query - principalcontext c# active directory
Obtener una lista de miembros de un grupo de WinNT (3)
Debería poder encontrar esta información dentro del atributo "member"
en el DirectoryEntry
que representa el grupo.
Hay un par de preguntas similares a esta en el desbordamiento de la pila, pero no es lo mismo.
Quiero abrir o crear un grupo local en una computadora win xp y agregarle miembros, dominio, cuentas locales y conocidas. También quiero verificar si un usuario ya es miembro para no agregar la misma cuenta dos veces y, presumiblemente, obtener una excepción.
Hasta ahora comencé a usar el objeto DirectoryEntry con el proveedor WinNT://
. Esto está yendo bien, pero estoy atascado en cómo obtener una lista de miembros de un grupo.
Alguien sabe cómo hacer esto? ¿O proporciona una mejor solución que usar DirectoryEntry?
Microsoft .NET Framework proporciona una biblioteca estándar para trabajar con el espacio de nombres Active Directory: System.DirectoryServices en System.DirectoryServices.dll.
Microsoft recomienda utilizar dos clases principales del espacio de nombres System.DirectoryServices: DirectoryEntry y DirectorySearcher . En la mayoría de los casos, es suficiente usar la clase DirectorySearcher solamente.
ACTUALIZACIÓN: Lo probé en mi máquina, funciona. Pero tal vez he entendido mal tu pregunta.
Aquí hay un ejemplo de un excelente artículo de CodeProject :
Obtenga una lista de usuarios que pertenecen a un grupo de AD particular
using System.DirectoryServices;
ArrayList GetADGroupUsers(string groupName)
{
SearchResult result;
DirectorySearcher search = new DirectorySearcher();
search.Filter = String.Format("(cn={0})", groupName);
search.PropertiesToLoad.Add("member");
result = search.FindOne();
ArrayList userNames = new ArrayList();
if (result != null)
{
for (int counter = 0; counter <
result.Properties["member"].Count; counter++)
{
string user = (string)result.Properties["member"][counter];
userNames.Add(user);
}
}
return userNames;
}
De acuerdo, me tomó un tiempo, meterme con diferentes soluciones, pero la que mejor se ajusta a mi pregunta original se da a continuación. No puedo obtener el objeto DirectoryEntry para acceder a los miembros de un grupo local utilizando los métodos ''estándar'', la única forma en que pude obtener que enumere los miembros fue mediante el método Invoke para llamar al método Members de los objetos nativos.
using(DirectoryEntry groupEntry = new DirectoryEntry("WinNT://./Administrators,group")) { foreach(object member in (IEnumerable) groupEntry.Invoke("Members")) { using(DirectoryEntry memberEntry = new DirectoryEntry(member)) { Console.WriteLine(memberEntry.Path); } } }
También utilicé una técnica similar para agregar y eliminar miembros del grupo local.
Espero que esto ayude a alguien más también. Keith.
EDIT por Tim: se agregó la versión VB.Net
Public Function MembersOfGroup(ByVal GroupName As String) As List(Of DirectoryEntry)
Dim members As New List(Of DirectoryEntry)
Try
Using search As New DirectoryEntry("WinNT://./" & GroupName & ",group")
For Each member As Object In DirectCast(search.Invoke("Members"), IEnumerable)
Dim memberEntry As New DirectoryEntry(member)
members.Add(memberEntry)
Next
End Using
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
Return members
End Function