Obtenir une liste des membres d'un groupe WinNT
-
05-07-2019 - |
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?
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.