2010-08-12 68 views
4

我試圖在運行Windows Server 2008 R2(IIS7安裝)的ASP.Net(4.0)應用程序中查詢AD。 (當作爲2.0應用程序運行時,它也失敗)無法查詢AD(獲取DirectoryServicesCOMException)

這對我來說並不是什麼新東西,因爲我以前做過這麼多次。我寫了一個小型的ASP.Net程序,可以在我自己的機器上運行(帶有IIS6的Windows XP),但在2008年的版本中運行時失敗。

(其結果是,你看到的組列表用戶在文本框的成員)

(on button_click) 
var userName = txtUserName.Text; 

if (userName.Trim().Length == 0) 
{ 
    txtResults.Text = "-- MISSING USER NAME --"; 
    return; 
} 

var entry = new DirectoryEntry("LDAP://blah.blah/DC=blah,DC=blah", 
           "cn=acct, dc=blah, dc=blah", 
           "pass"); 

var search = new DirectorySearcher(entry); 
search.Filter = "(SAMAccountName=" + userName + ")"; 
search.PropertiesToLoad.Add("memberOf"); 

var groupsList = new StringBuilder(); 

var result = search.FindOne(); 

if (result != null) 
{ 
    int groupCount = result.Properties["memberOf"].Count; 

    for (int counter = 0; counter < groupCount; counter++) 
    { 
      groupsList.Append((string)result.Properties["memberOf"][counter]); 
      groupsList.Append("\r\n"); 
    } 
} 

txtResults.Text = groupsList.ToString(); 

當我運行這段代碼我得到search.FindOne()以下錯誤:

System.DirectoryServices.DirectoryServicesCOMException (0x8007203B): A local error has occurred. 

    at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
    at System.DirectoryServices.DirectoryEntry.Bind() 
    at System.DirectoryServices.DirectoryEntry.get_AdsObject() 
    at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne) 
    at System.DirectoryServices.DirectorySearcher.FindOne() 
    at WebApplication1._Default.btnSearch_Click(Object sender, EventArgs e) 

我們已經做了大量的研究,並調整了我們可以想到的每個IIS7設置,但目前爲止還沒有。任何線索?

回答

3

變化從 「CN = XXX,DC = YYY,DC = ZZZ」 到 「域\用戶名」

+0

這一工程!謝謝! – KevinDeus 2010-08-12 22:00:45

+0

在Windows 7上有相同的問題,但它在WinXP上正常工作。謝天謝地,我的同事給我發了這篇文章。謝謝。 – Ghazaly 2011-04-04 06:41:09

0

您還可以更改IIS應用程序池以使用正在搜索的查詢權限運行域帳戶。

我有一些其他的意見,以及:

  1. 確保爲的DirectoryEntry構造函數的第一個條目包括爲用戶的容器爲好。這應該有助於DirectorySearcher更可靠地工作。
  2. 我相信DirectoryEntry構造函數中的第二個參數應該是用戶名,而不是AD查詢路徑。
  3. 您應該設置AuthenticationType屬性。對於Server 2008,默認情況下,需要將其設置爲AuthenticationTypes.Secure | AuthenticationTypes.ServerBind | AuthenticationTypes.Sealing。我猜想2008R2有一個類似的要求。
0

我看到的問題是比較舊,但這種掙扎後,我想到了username參數要提到的確可以使用LDAP風格的用戶名(與DNS風格相反)。這很適合我:

string connString = "LDAP://MyDomain/CN=blah,DC=blah,DC=blah"; 
    string username = "CN=MyAdmin,CN=Users,CN=blah,DC=blah,DC=blah"; 
    string password = "myLittleSecret"; 
    DirectoryEntry root = new DirectoryEntry(
     connString, 
     username, 
     password, 
     AuthenticationTypes.None); 

MyAdmin是在Administrators角色的成員。

我花了一段時間才發現的一件小事是如果您不想通過SSL進行通信,則需要參數AuthenticationTypes.None。當然,你想在生產中這樣做,但爲了開發目的,跳過加密也許是可以的。

環境:Windows 7

0

我試圖查詢Active Directory時,也得到這個異常:

SearchResult result = srch.FindOne(); 

要解決這個問題,只是把上面的代碼中Security.RunWithElevatedPrivileges()

最終解決方案:

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
    result = srch.FindOne(); 
});