2009-11-12 7 views
2

PHP를 통해 Active Directory 조회를 수행하려면 어떻게해야합니까? PHP를 다시 컴파일 할 필요없이. PHP 버전은 5.3Active Directory 조회 PHP를 통해

사용자 이름에서 사람 표시 이름을 찾고 싶습니다. 웹 서버는 IIS 6이며 PHP는 FastCGI를 사용하여 제공됩니다.

$cred = explode('\\',$_SERVER['REMOTE_USER']); 
if (count($cred) == 1) array_unshift($cred, "(no domain info - perhaps SSPIOmitDomain is On)"); 
list($domain, $user) = $cred; 
return $user; 

그래서 내가 어떻게 그 이름을 찾을 수 있습니다

내가 가진 사용자 이름을 얻을? 예 : DoeJ = 홍길동

편집 :

사용자를 조회하려고하지만, "기본 DN을"발견하는 방법을 잘. Active Directory 서버에 직접 액세스하거나 관리자 권한이 없으므로 익명으로 연결하십시오. 경고 :

<?php 

//using ldap bind anonymously 

// connect to ldap server 
$ldapconn = ldap_connect("example.co.uk") 
    or die("Could not connect to LDAP server."); 

if ($ldapconn) { 

    // binding anonymously 
    $ldapbind = ldap_bind($ldapconn); 

    if ($ldapbind) { 
     echo "LDAP bind anonymous successful..."; 

     ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION,3); 
     ldap_set_option($ldapconn, LDAP_OPT_REFERRALS,0); 

     $dn = "CN=Users"; // also tried DC=example,DC=co,DC=uk 
     $filter="(SAMAccountName=username)"; 
     $justthese = array("ou", "sn", "givenname", "mail"); 

     $sr=ldap_search($ldapconn, $dn, $filter, $justthese); 

     $info = ldap_get_entries($ds, $sr); 

     echo $info["count"]." entries returned\n"; 

    } else { 
     echo "LDAP bind anonymous failed..."; 
    } 
} 
?> 

는 ldap_search에 실패 ldap_search를() [function.ldap 검색] : 검색 : 작업 오류

답변

6

확인 - 먼저 LDAP 인터페이스를 통해 Active Directory 서버와 통신하려면 ext/ldap이 필요합니다. 분명히이 요구 사항은 PHP 설치시 충족됩니다 (그렇지 않으면 정의되지 않은 함수에 대한 오류가 발생합니다).

질문의 답은 다음과 같습니다. 어떤 Windows 서버를 코딩하고 있습니까? Windows Server 2003부터 익명 바인딩은 disabled by default입니다. 즉, 먼저 기존의 권한이 부여 된 사용자로 인증하지 않고 Active Directory 트리를 검색 할 수 없습니다. (here를 참조하십시오 익명 바인드를 사용하려면 -하지만 당신은 모든 관리자 권한을 가지고 있지 않는 한, 당신은이를 변경할 수 없습니다) 두 번째 문제는 당신 기본 실제로 내 위치 DN

당신의 검색 작업을 실행할 LDAP 트리입니다. 사용자 컨테이너의 normale 기본 DN은 CN=Users,DC=yourdomain,DC=yourtopleveldomain이어야합니다 (예 : CN=Users,DC=example,DC=local).

실제로 사용하는 필터가 정확합니다. (SAMAccountName=username)은 사용자 username에 대한 계정 항목을 찾습니다. 사용자 이름 변수를 사용하려면 다음을 할 수 있습니다.

$filter = sprintf('(SAMAccountName=%s)', $user); 

일반적인 코드 흐름이 올바른 것처럼 보입니다.

요약 : Active Directory에서 익명 바인딩을 허용하는지 먼저 확인한 다음 검색의 기본 DN을 조정해야합니다. 익명 바인드가 허용되지 않으면 Active Directory에 바인딩 할 수있는 권한이있는 사용자를 사용해야합니다.

+0

'ldapbind = ldap_bind ($ ldapconn);' true를 반환하므로 익명 바인드가 허용됩니다. 또한 '$ filter = "(sAMAccountName ='username ')'; '시도했습니다. 필터 레벨, DN 또는 '$ justthese'에서 실패한 경우 확실하지 않음 – SamWM

+0

필터 문자열에서 사용자 이름을 인용하지 마십시오 ('$ filter = "(sAMAccountName = username)"; ** NOT **' 아마도이 설명은 100 % 정확하지 않았을 것입니다. Active Directory는 익명 사용자가 루트 도메인의 절대 루트 인 'RootDSE'이외의 항목을 읽을 수 있도록 허용하지 않습니다. LDAP 트리. 그러므로'ldap_bind()'는 실제로'true'를 리턴 할 수 있습니다. 그러나 이것이 LDAP 트리에 접근하도록 허용 된 것은 아닙니다. 오류 메시지를 고려해 보면 * 기본 DN *이 해결해야 할 첫 번째 문제라고 가정합니다. –

-2

PHP는 활성 디렉토리를 조회하는 데 사용할 수있는 LDAP library 있습니다. 그래도 enabled by default이 아닙니다. 당신이 그것을 사용할 수있는 경우 해당 당신이 다시 당신이 PHP를 다시 컴파일하지 않고 LDAP extension을 활성화 할 수 있음을 의미, 윈도우에서 PHP를 실행하는 것을 의미보다 IIS를 사용하고 있기 때문에

, 당신은 ldap_search()

+0

검색을 시도했지만 검색을 수행하는 데 필요한 쿼리를 알아낼 수 없습니다. – SamWM

-2

볼 수 있습니다. 그것은 대부분의 문제를 해결해야합니다.

0

ldap_get_entries 함수의 fisrt 매개 변수가 올바르지 않습니다 :

$info = ldap_get_entries($ldapconn, $sr); 

이 방법으로 테스트와 코드가 작동합니다.

+1

이 답변은 도움이되지만 정말로 혼자가 아닙니다. 어쩌면 이것이 질문자의 코드에 적합한 지, 문제가 어떻게 해결되는지 분명히 알 수 있습니다. –