2010-11-30 3 views
7

System.DirectoryServicesC#을 사용하여 Active Directory에서 그룹 가져 오기

을 통해 Active Directory에서 그룹을 가져 오는 데 문제가 있습니다. 원래 도메인에 등록 된 컴퓨터에서 응용 프로그램을 시작했지만 라이브 도메인 이었기 때문에 AD에 무엇을 쓰고 싶지 않았습니다. 그래서 저는 Windows XP가 설치된 운영 체제를 호스트 컴퓨터에 설치하고 Windows Server 2003을 VM에 설치했습니다.

시스템에 다른 이더넷 포트를 추가하고 스위치를 설정하면 1 이더넷 포트는 VM 전용이고 다른 포트는 호스트 전용입니다.

통신을 위해 IP 주소를 구성한 후 호스트 컴퓨터에 응용 프로그램을 전송하고 해고했지만 DirectoryServicesCOMException가 나타납니다.

사용자 이름과 암호가 유효하지 않다는 메시지가 나타납니다. (활성 디렉토리가 아닌지 확인하기 위해 세 번째 가상 컴퓨터를 만들고 Windows XP를 설치했습니다.이 Windows XP는 APP에 테스트 된 자격 증명을 사용하여 도메인에 추가했습니다.

그래서 응용 프로그램이 실행중인 컴퓨터가 도메인에 속해 있지 않아야한다고 생각했습니다.

문제의 원인이 된 코드 블록을 찾아보십시오.

public CredentialValidation(String Domain, String Username, String Password, Boolean Secure) 
{ 
    //Validate the Domain! 
    try 
    { 
     PrincipalContext Context = new PrincipalContext(ContextType.Domain, Domain); //Throws Exception 
     _IsValidDomain = true; 

     //Test the user login 
     _IsValidLogin = Context.ValidateCredentials(Username, Password); 

     //Check the Group Admin is within this user 
     //******HERE 
     var Results = UserPrincipal.FindByIdentity(Context, Username).GetGroups(Context); 

     foreach(Principal Result in Results) 
     { 
      if (Result.SamAccountName == "Domain Admins") 
      { 
       _IsAdminGroup = true; 
       break; 
      } 
     } 
     Results.Dispose(); 
     Context.Dispose(); 
    } 
    catch (PrincipalServerDownException) 
    { 
     _IsValidDomain = false; 
    } 
} 

로그인 대화 상자의 정보가 다음과 같이 입력되었습니다.

Domain: test.internal 
Username: testaccount 
Password: Password01 

누군가가이 오류에서 약간의 빛을 비출 수 있기를 바랍니다 ..


업데이트 :

보안 로그를 확인한 후 서버에서 내 로그인 시도가 성공했음을 알 수 있지만 다음과 같습니다.

_IsValidLogin = Context.ValidateCredentials(Username, Password); 

그룹을 확인하는 메니저가 오류를 일으키는 곳의 줄로 인해 주요 문제는 다음과 같습니다. 아래 코드 줄이 네트워크에 연결되지 않은 컴퓨터에서 제대로 작동하지 않는 것입니다.

var Results = UserPrincipal.FindByIdentity(Context, Username).GetGroups(Context); 
+0

주어진 사용자를 인증하려고 시도하는 주어진 도메인에 대해이 방법으로 입력 한 사용자 자격 증명이 올바른지 확인하십시오. 이 사용자는 실제로 존재합니까? 'System.DirectoryServices' 네임 스페이스에서'DirectoryEntry'와'DirectorySearcher' 클래스를 사용하여 구식 접근법을 시도해 보셨습니까? 오직 제안 만, 나는 Principal 객체에 대해서는 정말로 모른다. –

+0

사용자가 동일한 자격 증명으로 네트워크에 다른 VM XP 시스템을 배치 한 상태로 AD에 사용자를 볼 수 있으며 cmd에서 'start \\ server1' 명령을 실행하여 자격 증명 대화 상자를 가져와 인증 할 수 있습니다 그것을 통해, 이것은 네트워크의 일부인 기계에서 100 % 작동합니다. – RobertPitt

답변

2

코드 조각에 따르면 ValidateCredentials를 호출하기 전에 PrincipalContext를 만들려고하면 오류가 발생합니다. 이 시점에서 코드를 실행하는 스레드는 여전히 로컬 ID (웹 프로세스에있는 경우) 또는 시스템에 로그인 한 ID (Windows 프로세스의 경우)에서 작동합니다. 이들 중 하나는 test.internal 도메인에 존재하지 않습니다.

생성자에 사용자 이름과 암호가 포함 된 PrincipalContext의 오버로드를 시도 할 수 있습니다. http://msdn.microsoft.com/en-us/library/bb341016.aspx

+0

알 겠어.하지만 PrincipleContext가 서버 로그의 내 보안 로그에 어떻게 들어오지 않으면 클라이언트 PC에서 오는 사용자 이름으로 로그인이 성공한 것을 볼 수있다. 로컬 윈도우 아이덴티티하지만 나는 시도 : 테스트/testaccount' 및'testaccount @ test' 또한'testaccount @ test.internal' 그리고 모두 같은 실패 .. 또한 내가 원리 컨텍스트 방법에 대한 과부하 다시 업데이트하십시오. – RobertPitt

+0

Wahhh, 확실하게 테스트했습니다 : /, 'PrincipalContext (ContextType.Domain, Domain);' 사용자 이름과 암호를 보유하도록 업데이트되어 현재 잘 작동하는 것 같습니다. – RobertPitt

2

저는 C# .NET을 통해 상당히 많은 사용자 관리 작업을 했었습니다. 방금 시도 할 수있는 몇 가지 방법을 파헤 쳤습니다.

다음 두 가지 메서드는 지정된 SAM 계정 이름에 대한 DirectoryEntry 개체를 가져옵니다. 계정 검색을 시작하려는 OU의 루트 인 DirectoryEntry를 사용합니다.

다른 하나는 사용자가 속한 그룹의 고유 이름 목록을 제공합니다. 그런 다음 해당 DN을 사용하여 AD를 검색하고 DirectoryEntry 객체를 가져올 수 있습니다.

public List<string> GetMemberOf(DirectoryEntry de) 
{ 
    List<string> memberof = new List<string>(); 

    foreach (object oMember in de.Properties["memberOf"]) 
    { 
    memberof.Add(oMember.ToString()); 
    } 

    return memberof; 
} 

public DirectoryEntry GetObjectBySAM(string sam, DirectoryEntry root) 
{ 
    using (DirectorySearcher searcher = new DirectorySearcher(root, string.Format("(sAMAccountName={0})", sam))) 
    { 
    SearchResult sr = searcher.FindOne(); 

    if (!(sr == null)) return sr.GetDirectoryEntry(); 
    else 
     return null; 
    } 
} 
+0

이것은 인증 프로세스에 사용하고 싶지 않은 디렉토리 엔트리를 사용하고 있으며,'DirectoryServices'는'AccountManagement'라는 처리를위한 네임 스페이스를 가지고 있습니다. – RobertPitt

+0

예, 사용자가 어떤 그룹에 속해 있는지 귀하의 질문 제목을 기반으로합니다. –

관련 문제