21

堆栈溢出有几个与此类似的问题,但并不完全相同。

我想在 win xp 计算机上打开或创建一个本地组并向其添加成员、域、本地和知名帐户。我还想检查用户是否已经是会员,这样我就不会两次添加同一个帐户,并且可能会出现异常。

到目前为止,我开始将 DirectoryEntry 对象与WinNT://提供程序一起使用。一切正常,但我不知道如何获取组成员的列表?

有人知道怎么做吗?或者提供比使用 DirectoryEntry 更好的解决方案?

4

3 回答 3

33

好的,花了一段时间,弄乱了不同的解决方案,但下面给出了最适合我最初问题的解决方案。我无法让 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
于 2008-11-24T09:59:58.453 回答
7

Microsoft .NET Framework 提供了用于使用 Active Directory 的标准库:System.DirectoryServices.dll中的 System.DirectoryServices 命名空间。

Microsoft 建议使用 System.DirectoryServices 命名空间中的两个主要类:DirectoryEntryDirectorySearcher。在大多数情况下,仅使用 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;
}
于 2008-10-31T08:43:06.537 回答
1

您应该能够在代表组的"member"属性中找到此信息。DirectoryEntry

于 2008-10-31T08:41:29.210 回答