Подтвердить что ты не робот

Получить список членов группы WinNT

Есть несколько вопросов, подобных этому при переполнении стека, но не совсем одинаковых.

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

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

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

4b9b3361

Ответ 1

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

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

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

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

EDIT от Tim: добавлена ​​версия 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

Ответ 2

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

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

UPDATE: я тестировал его на своей машине - он работает. Но, возможно, я неправильно понял ваш вопрос.

Вот пример из отличной статьи 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;
}

Ответ 3

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