Получить список членов группы WinNT
Есть несколько вопросов, подобных этому при переполнении стека, но не совсем одинаковых.
Я хочу открыть или создать локальную группу на компьютере win xp и добавить к ней членов, домен, локальные и известные учетные записи. Я также хочу проверить, является ли пользователь уже членом, так что я не добавляю одну и ту же учетную запись дважды и предположительно получаю исключение.
До сих пор я начал использовать объект DirectoryEntry с поставщиком WinNT://
. Это нормально, но я зациклился на том, как получить список членов группы?
Кто-нибудь знает, как это сделать? Или обеспечить лучшее решение, чем использование DirectoryEntry?
Ответы
Ответ 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
, который представляет группу.