2011-03-02 71 views
71

如何從活動目錄獲取用戶列表?有沒有辦法提取用戶名,名字,姓氏?我看到了類似的帖子裏這樣使用:如何從活動目錄獲取用戶列表?

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"); 

我從來沒有做過與Active Directory,所以我完全失去了什麼。任何幫助將不勝感激!

+3

閱讀優秀的MSDN文章[管理目錄安全主體在.NET Framework 3.5(http://msdn.microsoft.com/en-us/magazine/cc135979.aspx)爲一個偉大的介紹使用AD with .NET 3.5 – 2011-03-02 05:57:38

+0

看起來像@ marc_s的文章被歸檔了,這是[更新的鏈接](http://blogs.msdn.com/b/msdnmagazine/archive/2008/01/16/7120454.aspx) – 2016-03-11 21:45:17

+0

@marc_s我很想念先生,但鏈接是死的。我試過這個https://blogs.msdn.microsoft.com/msdnmagazine/2008/01/16/managing-directory-security-principals-in-the-net-framework-3-5/,但即使是那篇文章的鏈接導致微軟雜誌的遺傳頁面 – 2017-09-07 06:25:01

回答

169

如果你是新來的Active Directory,我建議你應該先了解Active Directory如何存儲數據。

Active Directory實際上是一個LDAP服務器。存儲在LDAP服務器中的對象分層存儲。這與將文件存儲在文件系統中非常相似。這就是爲什麼它得名目錄服務器和Active 目錄

容器和Active Directory對象可通過distinguished name指定。專有名稱是這樣的CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com。就像傳統的關係數據庫一樣,您可以針對LDAP服務器運行查詢。它被稱爲LDAP查詢。

有很多方法可以在.NET中運行LDAP查詢。您可以使用DirectorySearcherSystem.DirectoryServicesSearchRequestSystem.DirectoryServices.Protocol

對於您的問題,由於您要求專門查找用戶主體對象,我認爲最直觀的方法是使用System.DirectoryServices.AccountManagement中的PrincipalSearcher。你可以很容易地從谷歌找到很多不同的例子。這是一個正在做你所要求的樣品。

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 Namesn會給你Last Name。關於用戶名。我認爲你的意思是用戶登錄名。請注意AD用戶對象上有兩個登錄名稱。一種是samAccountName,它也被稱爲Windows 2000以前的用戶登錄名。

UserPrincipal userPrin = new UserPrincipal(context); 
userPrin.Enabled = true; 
第一使用後

userPrincipalName如果要篩選Ÿ活躍賬戶將它添加到哈維的代碼通常是Windows 2000中

+2

如果服務器不包含域名 – 2013-09-27 12:02:39

+0

如何使用相同的代碼來列出AD組中的用戶? – nJoshi 2015-07-20 22:32:41

+0

有沒有一種方法使用此方法將搜索範圍縮小到僅分配給電子郵件地址的目錄? – ARidder101 2017-04-04 17:46:49

2

附上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); 
15

後使用。然後添加

searcher.QueryFilter = userPrin; 

之前找到所有。這應該讓你活躍。

+0

我不認爲你需要'searcher.QueryFilter = userPrin;'因爲我們已經在初始化時將用戶主體傳遞給主體搜索者,但是否則感謝提示僅對活動用戶進行過濾! – Andrey 2016-09-22 18:24:20

+0

是的,Andrey是正確的所以基本上這可以被替換爲在第二個使用語句中添加此屬性:'使用(var searcher = new PrincipalSearcher(新UserPrincipal(context){Enabled = true}))'' – 2017-04-05 06:49:29

1

當然可以在@Harvey Kwok這裏找到,但我只是想添加這個例子,因爲在我的情況下我想獲得一個實際的UserPrincipals列表。預先過濾此查詢可能更高效,但在我的小環境中,只需稍後從列表中抽取所有內容並根據需要進行過濾即可。

根據您的需要,您可能不需要轉換爲DirectoryEntry,但某些屬性不可用於UserPrincipal。

using (var searcher = new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Domain, Environment.UserDomainName)))) 
{ 
    List<UserPrincipal> users = searcher.FindAll().Select(u => (UserPrincipal)u).ToList(); 
    foreach(var u in users) 
     { 
      DirectoryEntry d = (DirectoryEntry)e.GetUnderlyingObject(); 
      Console.WriteLine(d.Properties["GivenName"].Value.ToString() + d.Properties["sn"].Value.ToString()); 
     } 
} 
相關問題