2013-07-24 112 views
0

我對LDAP和Active Directory很新穎,我認爲這應該是一個簡單的問題。我連接到AD使用以下代碼:使用LDAP和PHP檢查Active Directory中的組成員資格

$ad = ldap_connect("domain.com") or die("Could not connect to AD"); 
//bind to the server 
$uname = $uid . "@domain.com"; 
if (!ldap_bind($ad, "$uname", "$pwd") and $uid != "guest") { 
    code... 
} 

,我需要檢查是否該用戶是三組之一的成員:ECSDocket_Admin,ECSDocket_User,或ECSDocket_Viewer。我一直在四處搜索,大部分答案都是在他們的查詢中使用了CN =和DN =和DC =,但我不知道它們的含義。如果有人能夠解釋它是如何工作的,以及我需要做些什麼來弄清楚組員的身份,那就太棒了!

+0

的http:// EN .wikipedia.org/wiki/LDAP#Directory_structure –

+0

謝謝你,但我怎麼會在PHP中使用它? – JHaasie77

+0

http://php.net/manual/en/function.ldap-search.php –

回答

1

我不熟悉PHP訪問LDAP/Active Directory的實現,所以我無法幫到你。我可以幫助你的是可能理解從域結構中獲取信息的位置,以便連貫地組合所有這些CN,OU的DN事物。

登錄到您的某個域控制器的控制檯並打開「Active Directory用戶和計算機」管理員工具。

在頂部的左側窗格中將顯示您的域名,例如:somedomain.com 請記下您的域名。

現在您需要在您的域結構中找到ECSDocket_Admin,ECSDocket_User和ECSDocket_Viewer組對象的位置。

單擊域名旁邊的+(加號)(如果還沒有)。你應該看到一堆文件夾(實際上是OU和Directory,但我會保持簡單)。您正在尋找的組將位於其中一個「文件夾」內,很可能位於名爲「用戶」的組中,因此開始尋找。

請注意從「somedomain.com」頂部開始並通過文件夾向下找到組的「路徑」。例如:somedomain.com/users/etc/ECSDocket_Admin

要查詢組對象,您需要知道它的可分辨名稱(DN)。使用您收集的有關您的域名和位置的信息,您可以將 的DN組裝成如下所示的組:

注意:我正在使用一組示例路徑:somedomain.com/users/etc/ECSDocket_Admin

DN值是:CN = ECSDocket_Admin,OU =等,OU =用戶,DC = somedomain,DC = COM

--notice我們正在開始與對象名稱ECSDocket_Admin'和以樹的方式工作(當我看到你寫下的路徑時,倒序)!

--notice,只是組名稱的前綴是CN =

--notice所有的「文件夾」的名稱的前綴爲OU,我們在我們的拆分域名=

--notice圓點分隔符和前綴每一個DC的部分=

--notice在DN值,一切都以逗號分隔(,)

值,你可能會需要其他的項目有:

「搜索基地」或目錄內的點開始搜索,使用somedomain.com的域名作爲一個例子,將是:DC = somedomain,DC = COM

搜索範圍將是:sub它只是說在所有那些'文件夾'下面看起來也是好的起點

一旦你弄清楚如何查詢一個組對象,你所特別感興趣的屬性值被稱爲'會員'。此屬性包含多個值,每個用戶都是該組的成員。這些值將是用戶帳戶的DN。您將感興趣的部分將是CN = SOMEUSER部分,因爲這是用戶帳戶名稱。剩下的就是這個帳戶對象存儲在域結構中的「路徑」。

希望它有幫助。

+0

謝謝!我仍然無法工作,但是這幫助我瞭解發生了什麼。我仍然有點困惑的唯一的東西是什麼類別的名稱。例如,對於用戶,我檢查字段用戶,或全名,或什麼? – JHaasie77

+0

搜索用戶時,您將使用CN來搜索它們以獲取其DN。如果你確切知道他們在目錄中的位置,那麼你可以直接使用DN。在任何一種情況下,一旦擁有DN,您就可以查詢該用戶對象以獲取所有屬性值。用戶對象的屬性是全名,電話等。在AD用戶屬性上進行谷歌搜索,你會發現很多網站列出所有可用的。提示:屬性名稱必須完全按照定義拼寫,有些看起來有點瘋狂。 – Drew

+0

謝謝!它還沒有完美運行,但搜索並沒有失敗! – JHaasie77

1

如果有人關心,我能夠做這樣的搜索:

$dn = "CN=$uid,CN=Users,DC=domain,DC=com"; 
$filter = "(memberOf=CN=ECSDocket_Admin,OU=Groups,DC=domain,DC=com)"; 
$justthese = array("memberOf"); 

$sr = ldap_search($ad, $dn, $filter, $justthese); 
$info = ldap_get_entries($ad, $sr); 
echo $info["count"]." entries returned.\n"; 

並通過檢查次數,我能夠確定所輸入的用戶名是該組的一部分 - 如果有是一個,那麼它就是該組的一部分,因爲我已經使用該用戶名下的ldap_connect來檢查它是否在AD內有效。對於過濾器,由於memberOf是一個數組,你需要指定整個路徑。例如,如果您只需要查詢SN(姓),你可能只是有類似:

$filter = "(sn=smith)"; 

一個網站,讓我知道完全正確的屬性是這樣的一個:http://www.selfadsi.org/user-attributes-w2k8.htm

相關問題