2010-08-12 5 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

+0

Windows 7에서 같은 문제가 발생했지만 WinXP에서 정상적으로 작동합니다. Thankfully 히 나의 동료는 나에게이 지위를 보내었다. 감사. – Ghazaly

0

검색중인 쿼리 priveleges를 사용하여 도메인 계정을 실행하도록 IIS 응용 프로그램 풀을 변경할 수도 있습니다.

은 나뿐만 아니라 몇 가지 다른 의견이 :

  1. 이하여 DirectoryEntry 생성자의 첫 번째 항목뿐만 아니라 사용자 컨테이너를 포함해야합니다. 이렇게하면 DirectorySearcher가 더 안정적으로 작동하는 데 도움이됩니다.
  2. DirectoryEntry 생성자의 두 번째 매개 변수는 AD 쿼리 경로가 아니라 사용자 이름이어야한다고 생각합니다.
  3. AuthenticationType 속성도 설정해야합니다. Server 2008의 경우 기본적으로 AuthenticationTypes.Secure | AuthenticationTypes.ServerBind | AuthenticationTypes.Sealing. 나는 2008R2가 simliar 요구 사항을 가지고 있다고 생각한다.
0

에서 사용자 이름 매개 변수 DNS 스타일과 반대되는 사용자 이름의 LDAP 스타일을 실제로 사용할 수 있음을 언급하십시오. 이것은 나를 위해 잘 작동합니다 :

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); 

MyAdminAdministrators 역할의 구성원입니다.

SSL을 통해 통신하지 않으려면 AuthenticationTypes.None 매개 변수가 필요합니다. 분명히 프로덕션 환경에서이 작업을 수행하려고하지만 개발 목적으로는 암호화를 건너 뛰어도됩니다.

환경 : 활성 디렉토리를 조회하려고 할 때 윈도우 7

0

나는이 예외를 얻고 있었다 :

SearchResult result = srch.FindOne(); 

그냥 Security.RunWithElevatedPrivileges() 내부에 위의 코드를 넣어,이 문제를 해결하려면.

최종 해결책 : 작동

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
    result = srch.FindOne(); 
}); 
관련 문제