我如何从活动目录获取用户列表?
我如何从活动目录获取用户列表? 有没有办法拉用户名,名字,姓? 我看到一个类似的post,在这里使用:
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");
我从来没有做过任何活动目录,所以我完全失去了。 任何帮助将不胜感激!
如果您不熟悉Active Directory,则build议您应该了解Active Directory如何先存储数据。
Active Directory实际上是一个LDAP服务器。 存储在LDAP服务器中的对象分层存储。 这与将文件存储在文件系统中非常相似。 这就是为什么它有名称目录服务器和Active Directory
Active Directory上的容器和对象可以由distinguished name
指定。 专有名称是这样的CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com
。 与传统的关系数据库一样,您可以针对LDAP服务器运行查询。 这就是所谓的LDAP查询。
在.NET中运行LDAP查询有很多种方法。 您可以使用System.DirectoryServices
DirectorySearcher或System.DirectoryServices
SearchRequest 。
对于你的问题,因为你要求特别find用户主体对象,我认为最直观的方法是使用System.DirectoryServices.AccountManagement
PrincipalSearcher 。 你可以很容易地从谷歌find很多不同的例子。 这是一个正在做你正在要求的样品。
using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com")) { using (var searcher = new PrincipalSearcher(new UserPrincipal(context))) { foreach (var result in searcher.FindAll()) { DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry; Console.WriteLine("First Name: " + de.Properties["givenName"].Value); Console.WriteLine("Last Name : " + de.Properties["sn"].Value); Console.WriteLine("SAM account name : " + de.Properties["samAccountName"].Value); Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value); Console.WriteLine(); } } } Console.ReadLine();
请注意,在AD用户对象上有许多属性。 特别是givenName
会给你First Name
, sn
会给你Last Name
。 关于用户名。 我认为你的意思是用户login名。 请注意AD用户对象上有两个login名称。 一个是samAccountName
,它也被称为Windows 2000以前的用户login名。 userPrincipalName
通常在Windows 2000之后使用。
如果你想过滤y活跃账户,请将此添加到Harvey的代码中:
UserPrincipal userPrin = new UserPrincipal(context); userPrin.Enabled = true;
第一次使用后。 然后添加
searcher.QueryFilter = userPrin;
在find之前。 这应该让你活跃的。
包括System.DirectoryServices.dll,然后使用下面的代码:
DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName); string userNames="<strong class="highlight">Users</strong> : "; foreach (DirectoryEntry child in directoryEntry.Children) { if (child.SchemaClassName == "User") { userNames += child.Name + Environment.NewLine ; } } MessageBox.Show(userNames);