Вопрос

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

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

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

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

Это было полезно?

Решение

Ладно, это заняло некоторое время, возня с разными решениями, но то, которое лучше всего соответствует моему первоначальному вопросу, приведено ниже.Я не могу заставить объект DirectoryEntry обращаться к членам локальной группы, используя "стандартные" методы, единственный способ, которым я мог заставить его перечислять членов, - это использовать метод Invoke для вызова метода native objects 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);
        }
    }
}

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

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

Редактировать автор : Тим:добавлен VB.Сетевая версия

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top