Получить список членов группы WinNT - PullRequest
19 голосов
/ 31 октября 2008

Есть пара вопросов, похожих на это при переполнении стека, но не совсем то же самое.

Я хочу открыть или создать локальную группу на компьютере win xp и добавить в нее участников, домен, локальные и хорошо известные учетные записи. Я также хочу проверить, является ли пользователь уже участником, чтобы я не добавлял одну и ту же учетную запись дважды, и предположительно получаю исключение.

До сих пор я начал использовать объект DirectoryEntry с провайдером WinNT://. Все идет хорошо, но я застрял на том, как получить список членов группы?

Кто-нибудь знает, как это сделать? Или предоставить лучшее решение, чем использование DirectoryEntry?

Ответы [ 3 ]

30 голосов
/ 24 ноября 2008

Хорошо, это заняло некоторое время, возиться с различными решениями, но то, которое лучше всего подходит для моего первоначального вопроса, приведено ниже. Я не могу получить объект DirectoryEntry для доступа к членам локальной группы, используя «стандартные» методы, единственный способ, которым я мог получить его для перечисления членов, - это использовать метод Invoke для вызова нативных объектов. *

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

Я также использовал похожую технику для добавления и удаления членов из локальной группы.

Надеюсь, это поможет кому-то еще. Кит.

РЕДАКТИРОВАТЬ Тимом: добавлена ​​версия 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
7 голосов
/ 31 октября 2008

Microsoft .NET Framework предоставляет стандартную библиотеку для работы с Active Directory: пространство имен System.DirectoryServices в System.DirectoryServices.dll.

Microsoft рекомендует использовать два основных класса из пространства имен System.DirectoryServices: DirectoryEntry и DirectorySearcher . В большинстве случаев достаточно использовать только класс DirectorySearcher.

ОБНОВЛЕНИЕ: Я проверил это на своей машине - это работает. Но, может быть, я неправильно понял ваш вопрос.

Вот пример из превосходной статьи CodeProject :

Получить список пользователей, принадлежащих к определенной группе 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;
}
1 голос
/ 31 октября 2008

Вы сможете найти эту информацию в атрибуте "member" в DirectoryEntry, представляющем группу.

...