2010-12-23 7 views
2

우리 시스템에서는 Active Directory에서 두 가지 다른 방법으로 사용자 보안 그룹을 읽습니다. 한 예로 AD에서 반환 한 그룹 목록에 도메인 로컬 그룹이 없습니다. GetAuthorizationGroups()의 응답은 사용 된 PrincipalContext에 따라 다릅니다. 실패한 시나리오에서 GetAuthorizationGroups()는 글로벌 그룹 만 반환합니다. AD에서 모든 도메인 로컬 그룹이 누락되었습니다. 누구든지 이유를 설명해 주시겠습니까?Active Directory에서 사용자 권한 부여 그룹 읽기

실패 용액 : 프로세스가 "사용자 A"에 의해 실행되는이 경우

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net"); 

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB"); 

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups(); 

. "UserA"는 "our.domain.net"도메인의 구성원입니다. "UserA"는 작업 솔루션에서 특별히 식별 된 사용자와 매우 동일한 사용자입니다. PrincipalContext는 작업중인 솔루션의 PrincipalContext와 동일해야합니다. 이 솔루션의 GetAuthorizationGroups()의 응답은 AD의 도메인 로컬 그룹을 놓칩니다.

작업 용액 : 주체 컨텍스트 생성시

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net", "UserA", "PasswordA"); 

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB"); 

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups(); 

이 경우는 전화 사용자가 사용 이름 및 암호에 의해 구체적으로 식별된다. 이 경우 AD는 사용자가 속한 모든 그룹을 반환합니다. 이것은 내가 실패한 해결책에서보고 싶은 행동입니다. 어떤 경우에는 UserA의 사용자 암호가 없기 때문에 작업 솔루션이 옵션이 아닙니다.

실패한 솔루션이 사용자가 속한 모든 그룹을 반환하지 않는 이유를 이해해 주시기 바랍니다.

+0

당신은 하나 개의 도메인 이상이 있습니까? 어떤 OS를 사용하고 있습니까? 그것은 UAC와 관련이있을 수 있습니다. 나는 UAC를 끄고 다시 시도 할 것입니다 (UAC를 끄면 컴퓨터를 다시 시작해야 함). FYI, ValidateCredentials()는 GetAuthorizationGroups()가 도움이되지 않는다고 생각하는 경우에 대비하여 –

+0

응답 Harvey에게 감사드립니다. 테스트 랩에서 시스템 테스트 중에 문제가 발견되었습니다. 테스트 시스템은 하나의 단일 도메인과 다중 도메인 컨트롤러로 구성됩니다. 문제 설명의 코드는 Windows 2003 서버에서 실행됩니다. 우리 제품을 출시하기 전에 여러 도메인과 Windows 2008 서버를 지원해야합니다. Windows 서버 설치 전문가에게 UAC에 대한 실험을 일부 요청했습니다. 그는 "2008 년 기능이 아닌가"에 관해 무언가를 엉망으로 다루었습니다. 그는 어쨌든 그것을 조사 할 예정이었습니다. 나는 그의 응답을 곧 게시 할 것이다. 안부, Gunnar – Gunnar

답변

1

마지막으로 문제가 발견되었습니다. 코딩 문제가 전혀 발생하지 않았습니다. 이상한 동작은 Active Directory에서 지루한 도메인 수준이 원인이었습니다.

도메인 수준 "2003 기능 수준"예상대로 이제

모든 행위에 설정했다. 당신은 아마 foreach 루프 결과 groups를 반복하고 있고 사용자가 읽기 액세스 권한이 나던 그룹 중 하나에 대해 그 시점 그것을 NoMatchingPrincipalException 예외를 받고 있기 때문에

1

"그것은 AD에서 도메인 로컬 그룹이 골대를 벗어났습니다" 나머지 그룹을 얻지 못하고 반복을 멈 춥니 다. 당신이 그룹의 모든 나머지를 얻기 위해 다음의 반복자합니다 (foreach 구조 뒤에 코드)를 사용할 수있는 솔루션으로

:

var enumerator = groups.GetEnumerator();     
while (enumerator.MoveNext()) 
{ 
    try 
    { 
     var e = enumerator.Current; 
     listView1.Items.Add(e.Name); 
    } 
    catch (NoMatchingPrincipalException) 
    { 
    } 
} 
관련 문제