喵喵笨兔 の 喵喵的家~遊戲天地 - 首頁(上版面)
喵喵笨兔 の 喵喵的家~遊戲天地 - 首頁(左版面)
首  頁 最新消息 遊戲攻略 遊戲影片 遊戲圖片 下載區 學習分享 留言板 FB粉絲團
 喵喵笨兔 の 喵喵的家~遊戲天地 - PHP 連接 Microsoft AD (Active Directory) Server 伺服器資料庫,LDAP 驗證帳號密碼,以及取得 AD 資料庫的資料顯示於網頁上!

PHP 連接 Microsoft AD (Active Directory) Server 伺服器資料庫,LDAP 驗證帳號密碼,以及取得 AD 資料庫的資料顯示於網頁上!

php 連接 Microsoft AD (Active Directory) 驗證

假設 Win Server 的 AD 資訊如下:

  • 網域名稱: TEST-1
  • AD 使用者帳號: vvv
  • AD 使用者密碼: 1234
  • AD 伺服器(IP): 192.168.1.5
範例程式碼:
  1. 若不更改變數名稱,基本上您可直接複製所有程式碼,另存成一個 php 檔,把相關名稱資料(紅色字部份)改成您的資料,即可進行驗證是否連線成功。
  2. 連線時若出現以下錯誤訊息 "Fatal error: Call to undefined function ldap_connect()" ,解決方法如下,一個個去試,皆須重新啟動 Apache 服務才可,應就可解決問題,Lucky to U!
    (1) 打開 PHP 目錄下的 php.ini 找以下,把前面的 ; 去掉。
     ;extension=php_imap.dll
     ;extension=php_ldap.dll
    (2) Copy PHP 目錄下的 libsasl.dll 到 apache 目錄的 bin 資料夾中
    (3) Copy PHP 目錄下的 libeay32.dll 及 ssleay32.dll 到 C:\Windows\System32 中
<?php
	//連到AD Server的帳號密碼
	$account = "TEST-1\\vvv";
	$password = "1234";
	$server = '192.168.1.5';
	
	//連線到AD server
	$conn=ldap_connect($server) or die("Could not connect to LDAP server");

  //以下兩行務必加上,否則AD無法在不指定OU下,作搜尋的動作
      @ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
      @ldap_set_option($conn, LDAP_OPT_REFERRALS, 0);

  //連線bind帳號密碼
      if(ldap_bind($conn,$account,$password)){
      echo '驗證成功';
      }
      else{
      echo '驗證失敗';
      } 
?>

範例結果:若是連線成功會顯示【驗證成功】,失敗則顯示【驗證失敗】

 


相關語法簡述說明:

  • 連上 LDAP 伺服器語法:ldap_connect(hostname,port)
    說明:port 可省略,預設是389。執行若無錯誤則返回鏈接代號,發生錯誤則返回 false。也就是測連 hostname 是否有通。
  • 輸出信息並退出當前腳本語法:die(status)
    說明:退出並顯示status信息。相當於 exit()。
    例:$conn=ldap_connect(192.168.1.5) or die("Could not connect to LDAP server");連 192.168.1.5,若 LDAP 有效,帶入 $conn,若沒效、則帶入 die("Could not connect to LDAP server") 。
  • 以特定的LDAP內的帳號密碼驗證連入ldap目錄語法:ldap_bind(con,user,pw)
    說明:con 是連上 LDAP 伺服器 若驗證成功則返回 ture。 user和pw可省略,則繫住匿名用戶。

 


User 登入畫面,連接 AD 進行帳號密碼驗證,以及撈取 AD 資料

範例程式碼:
  1. 此範例讓 User 經由登入畫面輸入 AD 的帳號密碼,驗證後、撈取該名 User 在 AD 內的相關資料並用 session 記錄。
  2. 若不更改變數名稱,基本上您可直接複製所有程式碼,另存成一個 php 檔,把相關名稱資料(紅、綠色字部份)改成您的資料,即可使用及撈取資料囉!^ ^
  3. 綠色字部份是 AD 內的相關名稱,可用 MS 的 AD 小工具 AdExplorer 來查詢較為方便哦!詳見最下方的軟體簡述。
<?php
      session_start();

      //帳密不能空白
      if(isset($_POST['account'])){
      if($_POST['account']=='' || $_POST['password']==''){
      echo '<script>history.go(-1);  </script>';
      }

if($_POST['account']!=''){
      //連到 AD Server 的帳密
      $account = 'TEST-1\\'.$_POST['account'];
      $password = $_POST['password'];
      $server = '192.168.1.5';

      //連線到 AD server
      $conn=ldap_connect($server) or die("Could not connect to LDAP server");

      //以下兩行務必加上,否則AD無法在不指定OU下,作搜尋的動作
      ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
      ldap_set_option($conn, LDAP_OPT_REFERRALS, 0);

      //連線bind帳號密,加@是強制不顯示錯誤訊息
      if(@ldap_bind($conn,$account,$password)){
         //驗證成功,記錄帳號
         $_SESSION['account'] = $_POST['account'];  
         //此行可記錄帳號並把英文都轉大寫 $_SESSION['account'] = strtoupper($_POST['account']);
         }
         else{
             //驗證失敗,回到上頁
             echo '<script>alert("帳號或密碼錯誤");history.go(-1);  </script>';
             }
         }

       $attr_array = array();

       //設定AD搜尋範圍
      $dn="ou=高興,ou=Kk1,dc=kK1,dc=com,dc=tw";  //查詢的路徑,可利用MS的AD小工具AdExplorer查
      $filter = "sAMAccountName=".$_POST['account'];  //過濾物件(用 user 帳號來過濾)
      $result = ldap_search($conn,$dn,$filter);       //查詢LDAP資訊

      //計算找到幾筆資料
      $count=ldap_count_entries($conn,$result);
      $sqlArray = array();

      //取得 ldap_search搜尋結果第一筆ID資料
      $entry = ldap_first_entry($conn, $result);

      if ($entry)
      {
          $attr = array("cn","mail","department");  //筆者撈三個資料為例
        do
        {
            foreach ($attr as $attribute)  //欄位逐一迴圈搜尋
          {
              $val=ldap_get_values($conn, $entry, $attribute);

              //此行可即時顯示資料  echo "$attribute: $val[0]";

              //全部欄位逐一記錄
              $_SESSION[$attribute] = $val[0];

              //此行可記錄單一條件欄位 if($attribute=='cn'){$_SESSION['cn'] = $val[0]; }
           }
        }
        while ($entry = ldap_next_entry($conn, $entry));
      }

      //關閉ldap連線
      ldap_close($conn);
}
      //此行可清除  session session_destroy();
?>
<html>
<head>
</head>
<body>
    <div>
      <form action="" method="post">
      <p>請輸入帳號:<input type="text" name="account" autofocus /></p>
      <p>請輸入密碼:<input type="password" name="password" /></p>
      <p><input type="submit" /></p>
      </form>
    </div>

    <div>
      <?php
        //測試顯示
        echo '姓名:'.$_SESSION['cn'].'<br>';
        echo 'E-mail:'.$_SESSION['mail'].'<br>';
        echo '部門:'.$_SESSION['department'].'<br>';
      ?>
    </div>
</body>
</html>

範例結果:因沒實際 AD 伺服器可連接,所以怎麼輸入都是無作用唄!>"<

請輸入帳號:

請輸入密碼:

姓名:
E-mail:
部門:

Microsoft Active Directory Explorer (AdExplorer) 簡易操作說明:

微軟網站下載 (v1.44): https://docs.microsoft.com/en-us/sysinternals/downloads/adexplorer

本小站下載: Active Directory Explorer (AdExplorer) v1.44

  1. 下載解壓後,在您的網域內,直接執行 ADExplorer.exe 進入登入畫面,輸入您的網域名稱和 AD 帳密即可。

  2. 接著就是找找您要查詢的路徑 (path),及要撈取的 Attribute 名稱囉!^ ^

笨兔隨手筆記於 2017/10/19

喵喵笨兔 の 喵喵的家~遊戲天地
http://vv0817.tk
http://vvv.lionfree.net
http://qo3op.asuscomm.com/vvv
https://uoedgpkhyfwzmd7zua8myg-on.drv.tw/vvv