如何在DropDownList控件中列出Active Directory中的所有用户

时间:2012-01-18 07:00:41

标签: c# asp.net visual-studio active-directory

我正在使用Visual Studio 2005 C#。

我正在尝试检索Active Directory中的用户列表,并将它们插入到 DropDownList 控件中。

我可以知道如何提取用户以及如何将它们插入 DropDownList 控制?


修改

我希望完成的功能有很多部分。

首先列出 DropDownList 中的所有用户,并拥有2个复选框 User Admin ,并根据分配给的角色 DDL 中的用户将选中相应的复选框。

选中并取消选中角色复选框也会相应地分配/撤销角色。

3 个答案:

答案 0 :(得分:10)

如果您使用的是.NET 3.5及更高版本,则可以使用PrincipalSearcher和“按示例查询”主体进行搜索:

// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// define a "query-by-example" principal - here, we search for all users
UserPrincipal qbeUser = new UserPrincipal(ctx);

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

// find all matches
foreach(var found in srch.FindAll())
{
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....          
}

如果您还没有 - 绝对阅读MSDN文章Managing Directory Security Principals in the .NET Framework 3.5,该文章很好地展示了如何充分利用System.DirectoryServices.AccountManagement

中的新功能

此代码可能相当慢 - 特别是如果您有大型AD,并且AD中有大量用户。但话又说回来:在一次下拉列表中列出数千名用户真的很有帮助吗?您可能需要重新考虑您的策略....

更新:如果您无法使用.NET 3.5,则必须使用“旧版”DirectorySearcher类 - 类似这样的内容:

// find your default naming context
DirectoryEntry deRoot = new DirectoryEntry("LDAP://RootDSE");
string defaultCtx = deRoot.Properties["defaultNamingContext"].Value.ToString();

// define a directory searcher for your default context
string searchRootLDAPPath = "LDAP://" + defaultCtx;
DirectoryEntry defaultDE = new DirectoryEntry(searchRootLDAPPath);

// define searcher - search through entire subtree, search for users 
// (objectCategory=Person)           
DirectorySearcher dsAllUsers = new DirectorySearcher(defaultDE);
dsAllUsers.SearchScope = SearchScope.Subtree;
dsAllUsers.Filter = "(objectCategory=Person)";

// get the results
SearchResultCollection result = dsAllUsers.FindAll();

// count the user objects found
int count = result.Count;

正如我所提到的 - 这将 在大型AD上表现得非常好,并且您可能遇到限制(例如最多返回1000个用户)和其他问题。您应该允许用户搜索用户,例如通过他们的名字或其他东西 - 而不是列出所有您的用户(取决于您的AD的大小)。

答案 1 :(得分:1)

与marc_s回答一样,我的回答也取决于.Net 3.5。但只是因为它使用LINQ,它可以转换回一些foreach循环,使得代码也可以在.Net 2.0下运行。

但由于我是DRY的粉丝这里只是the link to an old answer of myself

答案 2 :(得分:0)

对于当前域名,

DirectorySearcher AllUsers = new DirectorySearcher(Domain.GetCurrentDomain().GetDirectoryEntry());
AllUsers.SearchScope = SearchScope.Subtree;
AllUsers.Filter = "(&(objectClass=user)(objectCategory=person))";
int count = AllUsers.FindAll().Count;