获取WinNT组的成员列表

时间:2008-10-31 08:33:04

标签: c# .net active-directory active-directory-group windows-security

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

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

到目前为止,我开始将DirectoryEntry对象与WinNT://提供程序一起使用。这样可以,但我仍然坚持如何获得一个组成员列表?

任何人都知道如何做到这一点?或者提供比使用DirectoryEntry更好的解决方案?

3 个答案:

答案 0 :(得分:30)

好的,花了一段时间,乱用不同的解决方案,但最符合我原来问题的解决方案如下。我无法使用“标准”方法获取DirectoryEntry对象来访问本地组的成员,我只能通过使用Invoke方法调用本机对象的成员方法来枚举成员。

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.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

答案 1 :(得分:7)

Microsoft .NET Framework提供了一个标准库,用于在Active.DirectoryServices.dll中使用Active Directory: System.DirectoryServices namespace

Microsoft建议使用System.DirectoryServices命名空间中的两个主要类: DirectoryEntry DirectorySearcher 。在大多数情况下,仅使用DirectorySearcher类就足够了。

  

更新:我在我的机器上测试过 - 它有效。但也许我误会了   你的问题。

以下是优秀CodeProject article

的示例

获取属于特定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;
}

答案 2 :(得分:1)

您应该可以在代表该群组的DirectoryEntry上的"member" attribute内找到此信息。