최근에 .Net 4에서 4.6.1로 업그레이드 한 MVC 인트라넷 앱이 있습니다. 이 응용 프로그램은 Controller의 User.Identity 속성에서 사용할 수없는 세부 정보를로드하고 최근까지 완벽하게 처리 할 때까지 Active Directory에서 사용자 세부 정보를 쿼리합니다. 0x80005000 (비주얼 스튜디오 2015에서 디버깅 할 때UserPrincipal.FindByIdentity COM 오류가 발생합니다. 0x80005000
public static void foo()
{
var usr = LookupUser("MyDomain", "jbloggs");
...
}
private static UserPrincipal LookupUser(string domain, string username)
{
Console.WriteLine($"Lookup {domain}\\{username}");
using (var ctx = new PrincipalContext(ContextType.Domain, domain))
{
using (var user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, username))
{
if (user == null)
{
Console.WriteLine("User not found");
return;
}
Console.WriteLine($"Found {domain}\\{username}");
Console.WriteLine($"DisplayName = {user.DisplayName}");
Console.WriteLine($"Office = {user.GetString("physicalDeliveryOfficeName")}");
Console.WriteLine("");
return user;
}
}
}
코드는 잘 실행하지만 (윈도우 서버 2008 R2에 V6.1의 SP1)을 IIS 상자에서 실행중인 경우, COMException 예외 : 코드는 다음과 같이 보입니다 UserPrincipal.FindByIdentity를 호출 할 때 다음과 같이)()
웹 응용 프로그램은 전용 응용 프로그램 풀에서 실행되는, 설정이있는 다음과 같습니다
- 닷넷 프레임 워크 버전 = 4.0
- 신원 = MyDomain \ MyAppServiceUser (비 대화 형 AD 사용자 계정)
다른 모든 설정은 기본값에 따라 있습니다 거짓
이 문제를봤을 때 대부분의 대답은 AD를 쿼리하는 서비스 계정의 권한에 문제가 있음을 나타냅니다. 응용 프로그램 풀이 DOES로 실행되는 서비스 계정이 Active Directory를 쿼리 할 수있는 권한이 있는지 확인하기 위해 위의 코드를 콘솔 응용 프로그램에서 사용하고 서버와 서비스 계정 모두로 실행했습니다. 인스턴스는 잘 작동합니다. IIS에서 실행될 때만 폭탄이 터집니다.
PrincipalContext (OU 컨테이너 경로 등 포함)를 만드는 수많은 변형을 시도했지만 결과는 항상 동일합니다.
나는이 일에 열심히 노력하고 있으므로 도움을 주시면 대단히 감사하겠습니다.
업데이트 - 자세한 내용
- 예외 유형 : 함께 System.Runtime.InteropServices.COMException
- 예외 메시지 : 알 수없는 오류 (0x80005000)
- 스택 추적 :
at System.DirectoryServices.DirectoryEntry.Bind (Boolean throwIfFail) System.DirectoryServices.PropertyValueCollection..ctor에서 System.DirectoryServices.PropertyValueCollection.PopulateList()에서 System.DirectoryServices.DirectoryEntry.get_AdsObject()에서 System.DirectoryServices.DirectoryEntry.Bind() (하여 DirectoryEntry 항목, 문자열 propertyName 형식에서) System.DirectoryServices.AccountManagement에서 System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() 에서 System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() 에서 System.DirectoryServices.PropertyCollection.get_Item (문자열 propertyName 형식)에서 .PrincipalContext. System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper에서 System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() (PrincipalContext 상황, 유형 principalType, Nullable`1 identityType, 문자열 identityValue, 날짜 시간 refDate)에서에서) ( 를 초기화 System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType (PrincipalContext 컨텍스트 유형 principalType, identityType identityType, 문자열 identityValue) System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity에서 (PrincipalContext 상황, identityType identityType, 문자열 identityValue) AP = 연합 뉴스에서 ollo.Security.ActiveDirectoryUser.Find (String identityName)
이 방법이 효과가 있습니까? : http://stackoverflow.com/a/1722429/3709746 –
불행히도 - DirectorySearcher.FindOne() - 다음 주석에서 코드를 호출 할 때 같은 오류가 발생합니다. – Pete
var de = new DirectoryEntry ("LDAP : // MyDC.MyDomain.com/DC=MyDomain,DC=com ","MyDomain \\ ServiceUser ","password "); \t var ds = new DirectorySearcher (de); \t ds.Filter = $ "(& (objectClass = user) (objectCategory = user) (sAMAccountName = {userName})))"; \t ds.PropertiesToLoad.Add ("physicalDeliveryOfficeName"); \t var result = ds.FindOne(); // 여기에 불어서 – Pete