Domanda

Ci sono un paio di domande simili a questa sull'overflow dello stack ma non sono le stesse.

Voglio aprire o creare un gruppo locale su un computer Win XP e aggiungere membri ad esso, dominio, account locali e ben noti. Voglio anche verificare se un utente è già membro in modo da non aggiungere lo stesso account due volte e presumibilmente ottenere un'eccezione.

Finora ho iniziato a utilizzare l'oggetto DirectoryEntry con il provider WinNT: // . Questo sta andando bene, ma sono bloccato su come ottenere un elenco dei membri di un gruppo?

Qualcuno sa come farlo? O fornire una soluzione migliore rispetto all'utilizzo di DirectoryEntry?

È stato utile?

Soluzione

Va ??bene, ci è voluto un po 'di tempo, scherzando con soluzioni diverse, ma quella che si adatta meglio alla mia domanda originale è riportata di seguito. Non riesco a ottenere l'oggetto DirectoryEntry per accedere ai membri di un gruppo locale utilizzando i metodi "standard", l'unico modo per ottenere l'enumerazione dei membri era utilizzando il metodo Invoke per chiamare il metodo Members degli oggetti nativi.

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

Ho anche usato una tecnica simile per aggiungere e rimuovere membri dal gruppo locale.

Speriamo che questo aiuti anche qualcun altro. Keith.

EDIT di Tim: aggiunta la versione 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

Altri suggerimenti

Microsoft .NET Framework fornisce una libreria standard per lavorare con Active Directory: spazio dei nomi System.DirectoryServices nel System.DirectoryServices.dll.

Microsoft consiglia di utilizzare due classi principali dallo spazio dei nomi System.DirectoryServices: DirectoryEntry e DirectorySearcher . Nella maggior parte dei casi, è sufficiente utilizzare solo la classe DirectorySearcher.

  

AGGIORNAMENTO: l'ho provato sulla mia macchina - funziona. Ma forse ho frainteso   la tua domanda.

Ecco un esempio di un eccellente Articolo di CodeProject :

Ottieni un elenco di utenti appartenenti a un particolare gruppo AD

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

Dovresti essere in grado di trovare queste informazioni all'interno di " member " attributo su DirectoryEntry che rappresenta il gruppo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top