ldap_search() [function.ldap-search]: Search: Operatio_n_s error [

來源:互聯網
上載者:User
LDAP AD網域驗證...

我採用普通的模式都可以,包括查詢使用者..
但是今天寫一個類,報 ldap_search() [function.ldap-search]: Search: Operatio_n_s error

類的代碼如下

$ldapDN,這個是正確的...
ldapBind() 也是可以驗證使用者名稱跟密碼...
但是查詢此使用者的詳細資料會報錯, 網上都提示是因為AD域不支援匿名,但是我加上驗證在search...也還報錯...

不用類的時候,ldap_bind()後, 是可以的...看後面一段代碼

class userldap {    private $ldapHost; //AD伺服器位址    private $ldapPort; //AD伺服器連接埠    private $ldapDomin; //AD網域    private $ldapDN = "OU=Users,OU=xxx,OU=abc,DC=adv,DC=ccc,DC=com"; //使用者列表位置    private $userName;    private $passWord;    public function __construct($ldapDomin, $ldapHost, $ldapPort, $userName, $passWord) {        $this->ldapDomin = $ldapDomin;        $this->ldapHost = $ldapHost;        $this->ldapPort = $ldapPort;        $this->userName = $userName;        $this->passWord = $passWord;    }    private function ldapConnect() {        if (!$this->ldapConn = ldap_connect($this->ldapHost, $this->ldapPort)) {            $this->showerror = ldap_error($this->ldapConn);        } else {            $this->ldapConn = ldap_connect($this->ldapHost, $this->ldapPort);        }        return $this->ldapConn;    }    public function ldapBind() {        if (@ldap_bind($this->ldapConnect(), $this->ldapDomin . '\\' . $this->userName, $this->passWord)) {            ldap_bind($this->ldapConnect(), $this->ldapDomin . '\\' . $this->userName, $this->passWord);            return TRUE;        } else {            return FALSE;        }    }    public function getUserinfo() {        if ($this->ldapBind()) {            ldap_bind($this->ldapConnect(), $this->ldapDomin . '\\' . $this->userName, $this->passWord);            $this->adResult = ldap_search($this->ldapConnect(), $this->ldapDN, "(sAMAccountName=$this->userName)");            $this->userInfo = ldap_get_entries($this->ldapConnect(), $this->adResult); //獲得查詢結果        } else {            $this->userInfo = "NA";        }        return $this->userInfo;    }}



 if (!$ldap_conn = ldap_connect($ldap_host, $ldap_port)) {        $tip = "LADP HOST" . $ldap_host . " CANNOT CONNECT";    } else {        if (@ldap_bind($ldap_conn, $doMain . '\\' . $userName, $passWord)) {            $query = $db->select("bp_user", "userFullname", "where userNT='$userName'");            if ($row = $db->fetch_array($query)) {                $_SESSION['userName'] = $row['0'];                $_SESSION['passWord'] = $passwordDb;                $db->update("bp_user", "userPassword = '$passwordDb', userLogin=userLogin+1, userLoginip=INET_ATON('$lastip'),userUpdate='$nowtime'", "where userNT='$userName'");                ldap_unbind($ldap_conn) or die("Can't unbind from LDAP server.");                $msg = "USERNAME " . $row[0] . " Login In OK";                unset($query);                unset($row);                Get_admin_msg($lastUrl, $msg, 'main');            } else {                $base_dn =  "OU=Users,OU=xxx,OU=abc,DC=adv,DC=ccc,DC=com";;                $filter_col = "sAMAccountName"; //定義用於查詢的列                $filter_val = $userName; //定義用於匹配的值                $result = ldap_search($ldap_conn, $base_dn, "($filter_col=$filter_val)"); //執行查詢                $entry = ldap_get_entries($ldap_conn, $result); //獲得查詢結果                $userFullname = strtoupper($entry[0]['cn'][0]);                $userEmail = $entry[0]['mail'][0];                $userDept = $entry[0]['department'][0];                $userCustomer = $entry[0]['roomnumber'][0];                $entry = NULL;                $result = NULL;                ldap_unbind($ldap_conn) or die("Can't unbind from LDAP server.");                $query = NULL;                $row = NULL;}


回複討論(解決方案)

那你就看看用類之後,參數是不是正確傳遞了,就是參數對不對

參數都是一樣的....
所以很奇怪...

問題解決掉咯...
還是那個認證的問題...

我不知道是不是可以說成是線程的問題...
調用ldap_search之前必須要滿足連結到ldap server並且通過ldap_bind的認證...

而在function裡面,ldap_bind後,再進行Ldap_search的時候,再一次連結ldap server,產生的resource ID不一樣...並且這個resouce ID沒有進行ldap_bind認證...

所以修改的辦法就是
調用getUserinfo的這個function的時候,需要再次重新連結ldap伺服器並通過認證再擷取使用者資訊,這樣就不會報錯...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.