Question

Il y a quelques questions similaires à ceci sur le dépassement de capacité de la pile mais pas tout à fait les mêmes.

Je souhaite ouvrir ou créer un groupe local sur un ordinateur win xp et y ajouter des membres, ainsi que des comptes de domaine, locaux et bien connus. Je souhaite également vérifier si un utilisateur est déjà membre afin d'éviter d'ajouter le même compte deux fois et d'obtenir une exception.

Jusqu'à présent, j'ai commencé à utiliser l'objet DirectoryEntry avec le fournisseur WinNT: // . Ça va, mais je suis bloqué sur la façon d'obtenir une liste des membres d'un groupe?

Quelqu'un sait comment faire cela? Ou fournissez-vous une meilleure solution que d’utiliser DirectoryEntry?

Était-ce utile?

La solution

D'accord, cela a pris un certain temps, mais nous avons présenté ci-dessous celle qui correspond le mieux à ma question initiale. Je ne parviens pas à faire que l'objet DirectoryEntry accède aux membres d'un groupe local à l'aide des méthodes "standard". La seule façon de l'obtenir pour énumérer les membres était d'utiliser la méthode Invoke pour appeler la méthode des objets natifs Members.

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

J'ai également utilisé une technique similaire pour ajouter et supprimer des membres du groupe local.

J'espère que cela aidera aussi quelqu'un d'autre. Keith.

EDIT de Tim: ajout de la version 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

Autres conseils

Microsoft .NET Framework fournit une bibliothèque standard pour travailler avec Active Directory: Espace de noms System.DirectoryServices dans System.DirectoryServices.dll.

Microsoft recommande d'utiliser deux classes principales de l'espace de noms System.DirectoryServices: DirectoryEntry et DirectorySearcher . Dans la plupart des cas, il suffit d’utiliser la classe DirectorySearcher uniquement.

  

UPDATE: je l’ai testé sur ma machine - cela fonctionne. Mais peut-être que j'ai mal compris   votre question.

Voici un exemple tiré d'un excellent article de CodeProject :

Obtenir une liste des utilisateurs appartenant à un groupe d'annonces particulier

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

Vous devriez pouvoir trouver ces informations dans le Attribut " membre sur DirectoryEntry qui représente le groupe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top