堆栈溢出有几个与此类似的问题,但并不完全相同。
我想在 win xp 计算机上打开或创建一个本地组并向其添加成员、域、本地和知名帐户。我还想检查用户是否已经是会员,这样我就不会两次添加同一个帐户,并且可能会出现异常。
到目前为止,我开始将 DirectoryEntry 对象与WinNT://
提供程序一起使用。一切正常,但我不知道如何获取组成员的列表?
有人知道怎么做吗?或者提供比使用 DirectoryEntry 更好的解决方案?
堆栈溢出有几个与此类似的问题,但并不完全相同。
我想在 win xp 计算机上打开或创建一个本地组并向其添加成员、域、本地和知名帐户。我还想检查用户是否已经是会员,这样我就不会两次添加同一个帐户,并且可能会出现异常。
到目前为止,我开始将 DirectoryEntry 对象与WinNT://
提供程序一起使用。一切正常,但我不知道如何获取组成员的列表?
有人知道怎么做吗?或者提供比使用 DirectoryEntry 更好的解决方案?
好的,花了一段时间,弄乱了不同的解决方案,但下面给出了最适合我最初问题的解决方案。我无法让 DirectoryEntry 对象使用“标准”方法访问本地组的成员,我可以让它枚举成员的唯一方法是使用 Invoke 方法调用本机对象的 Members 方法。
using(DirectoryEntry groupEntry = new DirectoryEntry("WinNT://./Administrators,group")) { foreach((IEnumerable) groupEntry.Invoke("Members") 中的对象成员) { 使用(目录条目成员条目 = 新目录条目(成员)) { Console.WriteLine(memberEntry.Path); } } }
我还使用了类似的技术在本地组中添加和删除成员。
希望这对其他人也有帮助。基思。
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
Microsoft .NET Framework 提供了用于使用 Active Directory 的标准库:System.DirectoryServices.dll中的 System.DirectoryServices 命名空间。
Microsoft 建议使用 System.DirectoryServices 命名空间中的两个主要类:DirectoryEntry和DirectorySearcher。在大多数情况下,仅使用 DirectorySearcher 类就足够了。
更新:我在我的机器上测试了它 - 它有效。但也许我误解了你的问题。
这是一篇出色的CodeProject 文章中的一个示例:
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