Pregunta

Hay un par de preguntas similares a esto en el desbordamiento de pila pero no son exactamente las mismas.

Quiero abrir o crear un grupo local en una computadora con Windows XP y agregar miembros, cuentas de dominio, locales y conocidas. También quiero verificar si un usuario ya es miembro para no agregar la misma cuenta dos veces y, probablemente, obtener una excepción.

Hasta ahora comencé a usar el objeto DirectoryEntry con el proveedor WinNT: // . Esto va bien, pero ¿estoy atascado en cómo obtener una lista de miembros de un grupo?

¿Alguien sabe cómo hacer esto? ¿O proporcionar una solución mejor que usar DirectoryEntry?

¿Fue útil?

Solución

Está bien, ha tardado un rato, en probar diferentes soluciones, pero a continuación se detalla la que mejor se adapta a mi pregunta original. No puedo conseguir que el objeto DirectoryEntry acceda a los miembros de un grupo local utilizando los métodos "estándar", la única forma de hacerlo es enumerar a los miembros utilizando el método Invoke para llamar al método de los miembros nativos de los objetos.

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.

Esperemos que esto ayude a alguien más también. Keith.

EDIT por Tim: se ha agregado 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

Otros consejos

Microsoft .NET Framework proporciona una biblioteca estándar para trabajar con Active Directory: espacio de nombres System.DirectoryServices en System.DirectoryServices.dll.

Microsoft recomienda usar dos clases principales del espacio de nombres System.DirectoryServices: DirectoryEntry y DirectorySearcher . En la mayoría de los casos, es suficiente usar solo la clase DirectorySearcher.

  

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 en 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;
}

Debería poder encontrar esta información dentro de " miembro " atributo en el DirectoryEntry que representa al grupo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top