2010年11月23日 星期二

PHP撈AD資料

其實PHP撈AD資料已經想很久了,只是一直沒空去做(就是懶啦...)。

最近想到要做分機表,從AD上既有的通訊錄去撈出來做是最快的,因此花了兩天的時間,完成此次作品。

在寫此程式前,請先到php.ini檔,打開php_ldap.dll的功能(預設是關閉的),否則執行時會出現未定義函數的錯誤訊息。(打開後記得要重啟apache服務,功能才會生效)


在範例檔中,前面的連線程式屬於制式化的寫法,沒有什麼問題。花我最多時間的就是AD欄位名稱的查詢,以及資料的撈出。

PHP撈AD有兩種模式(應該是),我選擇類似資料庫的模式,也就是將資料一筆一筆撈出(ldap_first_entry / ldap_next_entry),然後將每一筆資料的欄位屬性解析出來(ldap_get_values)。

這次收穫蠻多的,除了使用PHP撈AD資料外,還學會如何查AD的欄位名稱。參考這篇如何查詢AD欄位屬性


//連到AD Server的帳號密碼
$account="帳號";
$password="密碼";
$server="Server IP";
//連線到AD server
$conn=ldap_connect($server) or die("Could not connect to LDAP server");
//以下兩行務必加上,否則AD無法在不指定OU下,作搜尋的動作
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
//連線bind帳號密碼
$ldap_bd=ldap_bind($conn,$account,$password);
//檢查帳號密碼是否正確
if ($ldap_bd) {
    echo "Auth passed!";
} else {
    echo "Auth failed!";
}


//設定AD搜尋範圍
$dn="ou=Users,dc=abc,dc=com,dc=tw";//查詢的路徑
$filter = "CN=欲查詢的姓名";//過濾物件
$result = ldap_search($conn,$dn,$filter);//查詢LDAP資訊
//計算找到幾筆資料
$count=ldap_count_entries($conn,$result);
echo $count;
//取得 ldap_search搜尋結果第一筆ID資料
$entry = ldap_first_entry($conn, $result);
if ($entry)
{
    $attr = array("description","displayName","title","mail","telephoneNumber","mobile","ipPhone","department");
 do
 {
        foreach ($attr as $attribute)
  {
            $val=ldap_get_values($conn, $entry, $attribute);
            echo "$attribute: $val[0]
";
        }
        echo "<hr>";
    }
 while ($entry = ldap_next_entry($conn, $entry));
}
//關閉ldap連線
ldap_close($conn);


最後感謝一整天大大,因為參考他的大作,才能將原始程式碼刊出,不再使用圖片方式張貼。
http://272586.blogspot.com/2009/01/blogspot.html