2009-01-02 26 views
3

我想爲人們創建一個快速應用程序,以便從一組憑據中解析存儲在Active Directory中的用戶的名稱。某些應用程序僅提供用戶標識,並且期望最終用戶啓動Active Directory用戶和組MMC管理單元太多。如何從使用C#的用戶名中獲取存儲在Active Directory中的真實姓名?

輸入將類似於「MYCORP \ a_user」,輸出將是「Dave Smith」,如果這是AD中存儲的內容。

我希望這能夠在我的測試域以及多森林環境中運行。

有人可以提供一個這樣做的樣本嗎?從AD等其他屬性中檢索如電話號碼是否遵循相同的模式?

目標平臺:.NET 2.0及以上版本。

回答

0

請參閱DirectorySearcher,加載屬性「DisplayName」。

+0

...並在SamAccountName上進行篩選(但只通過使用用戶名,在「domain \」部分之後)... – 2009-02-05 21:31:33

3

這是我使用的代碼,從我的驗證類採取:

string[] strUserName = username.Split("\\".ToCharArray()); 
using (var entry = new DirectoryEntry("LDAP://" + ADServer, ADServiceDomain + "\\" + ADServiceAccount, ADServicePassword)) 
using (var ds = new DirectorySearcher(entry, "sAMAccountName=" + strUserName[1])) { 
    ds.SearchScope = SearchScope.Subtree; 
    SearchResult result = ds.FindOne(); 
    string fullname = result.Properties["displayName"][0].ToString(); 
} 

的System.DirectoryServices很爛。正如你所看到的,即使是最基本的事情也需要大量的代碼。我希望看到一個用戶認證方法,不需要使用流量控制的異常。

+1

請小心,因爲如果不存在與ActiveDirectory對象相關的一些已知內存泄漏使用正確。 http://englestone.blogspot.com/2008/06/active-directory-memory-leaks-c.html - Lee – 2009-09-10 15:06:36

2

使用Active Directory是在C#有點不好受,確保3.5增加了一些新的課程,以幫助,但對於純粹的生產力,我喜歡使用PowerShell和Quest的免費PowerShell Commands for Active Directory 在這種情況下,代碼看起來像

get-qaduser userid | select PhoneNumber,DisplayName 

,如果你需要這個作爲你的C#程序的一部分運行,你可以做到這一點

public static IEnumerable<PSObject> Invoke(string script, params object[] input) 
    { 
     IList errors = null; 
     using (var run = new RunspaceInvoke()) 
     { 
      var psResults = run.Invoke(script, input, out errors); 
      if (errors != null && errors.Count > 0) 
       Debug.WriteLine(errors.Count); 
      foreach (PSObject res in psResults) 
       yield return res; 
     } 
    } 
    PSObject psUser = POSHelp.Invoke(
     @"add-pssnapin Quest.ActiveRoles.ADManagement 
     ($userid) = $input | % { $_ } 
     get-qaduser $userid", "auserid").Single(); 
    Debug.WriteLine(psUser.Properties["DisplayName"].Value); 

添加裁判Program Files文件\參考大會\微軟\ WindowsPowerShell \ V1.0 \ System.Management。 Automatio n.dll

相關問題