2012-01-29 1 views
1

그물 전체를 검색했지만 허용되는 원인 또는 해결 방법을 찾지 못했습니다.GroupPrincipal.GetMembers (true) - 지정된 디렉토리 서비스 속성 또는 값이 존재하지 않습니다.

내 목표는 그룹 및 그 하위 그룹의 구성원을 얻는 콘솔 응용 프로그램을 만드는 것입니다. 나는 DirectoryServices를 사용하여 그렇게 할 수있다. 그러나 나는 새로운 코드 관리를 사용하여 코드를 크게 복잡하게 만들지 않으려합니다. 내 코드 (마스크 일부 이름/경로)

PrincipalContext insPrincipalContext = 
       new PrincipalContext(ContextType.Domain, 
        "my.grp.net", 
        "DC=my,DC=grp,DC=net", 
        "domain\\username", "Password" 
        ); 

ArrayList users = new ArrayList(); 

GroupPrincipal oGroupPrincipal = 
    GroupPrincipal.FindByIdentity(insPrincipalContext,IdentityType.SamAccountName, "My group name"); 

PrincipalSearchResult<Principal> usrs = oGroupPrincipal.GetMembers(true); 

foreach (UserPrincipal p in usrs) 
{ 
    if (p != null) 
     users.Add(p.SamAccountName); 
} 

이 코드는 몇 천 사용자를 검색 한 후 아래와 같은 오류가 발생합니다 아래로입니다. 디버그 모드에서 F5 키를 눌러 계속하면 동일한 예외를 다시 throw하기 전에 수천 명의 사용자가 반환됩니다.

System.DirectoryServices.AccountManagement.PrincipalOperationException was unhandled Message=The specified directory service attribute or value does not exist. 

    Source=System.DirectoryServices.AccountManagement ErrorCode=-2147016694 StackTrace: 
     at System.DirectoryServices.AccountManagement.ADStoreCtx.LoadDirectoryEntryAttributes(DirectoryEntry de) 
     at System.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.MoveNextMemberEnum() 
     at System.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.MoveNext() 
     at System.DirectoryServices.AccountManagement.FindResultEnumerator`1.MoveNext() 
     at System.DirectoryServices.AccountManagement.FindResultEnumerator`1.System.Collections.IEnumerator.MoveNext() 
     at ManagedActiveDirectoryTrial.Program.Main(String[] args) in C:\Khalid Naseem\Trial\ManagedActiveDirectoryTrial\ManagedActiveDirectoryTrial\Program.cs:line 77 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() InnerException: System.Runtime.InteropServices.COMException 
     Message=The specified directory service attribute or value does not exist. 

     Source=System.DirectoryServices 
     ErrorCode=-2147016694 
     StackTrace: 
      at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
      at System.DirectoryServices.DirectoryEntry.Bind() 
      at System.DirectoryServices.DirectoryEntry.RefreshCache() 
      at System.DirectoryServices.AccountManagement.ADStoreCtx.LoadDirectoryEntryAttributes(DirectoryEntry de) 

이 예외가 발생하는 사용자와 특성을 결정할 수 없어이 예외는별로 도움이되지 않습니다.

DirectoryServices API를 사용하여 동일한 그룹 및 하위 그룹의 사용자를 검색 할 수 있지만 피해야 할 코드와 회귀 코드가 많습니다.

이 문제에 대한 해결 방법을 높이 평가할 것입니다.

감사합니다 - 칼리드

+0

안녕하세요, 문제 해결 방법을 찾으셨습니까? 나는 같은 문제를 겪고있다. – Shrike

답변

2

그것은 사용자가 보안 그룹 또는 배포 목록에서 제거 할 수있는 시나리오처럼 들리 겠지만 아직 완전히 액티브 디렉토리를 통해 복제되지 않았습니다. 이 메서드를 호출하는 실행 파일에 관리자 권한이없는 경우이 예외가 throw 될 수 있습니다.

해결 방법 : 첫 번째 경우 oGroupPrincipal.GetMembers (false)를 호출하고 멤버가 그룹인지 확인하여 직접 재귀 논리를 작성한 다음 해당 개체에 대해 GetMembers를 다시 호출하려고 할 수 있습니다.

다른 관심사는 GetMembers (true)가 순환 종속성을 처리하지 않을 수 있다는 것입니다.

관련 문제