Active Directory 列出group所有member


在Active Directory內可以將人員帳號加入群組,同時也可以將群組加入群組中 ( 當然也許還可以再加入其他的物件,只是這邊僅接觸到帳號與群組兩種 ) 。




現在有Group1, GroupA, Group甲三個群組,另外有person1帳號,

我們將person1帳號加入Group甲群組中,並且將Group甲加入GroupA,再將GroupA加入Group1。

Group1 =>GroupA => Group甲 =>  person1

=> 表示member

現在我們只有拿到Group1群組,我們要怎麼找到所有包含在Group1內的成員呢?

群組的成員可能有一般人員帳號與群組,而群組可能又有一般人員帳號與群組,如此不斷延伸到最後沒有群組可以搜尋為止,原先程式部分原本考慮用遞迴暴力搜尋,但這方法相當耗時與耗能,效果不好,找了一段時間終於找到相關文章,原來這類的群組架構稱為Nested Group,稱為巢狀群組,如果沒掌握到這個關鍵字我可能永遠都找不到更好的搜尋方式,畢竟我並不熟Active Directory,有了這關鍵字再去搜尋,終於找到透過filter的方式列出所有群組內的成員方法,方法如下:

(memberOf:1.2.840.113556.1.4.1941:=要搜尋群組DN)

參考官網的說法,matching rule OID為1.2.840.113556.1.4.1941為LDAP_MATCHING_RULE_IN_CHAIN,說明為

This rule is limited to filters that apply to the DN. This is a special "extended" match operator that walks the chain of ancestry in objects all the way to the root until it finds a match.

下方又有補充一段說明
The LDAP_MATCHING_RULE_IN_CHAIN is a matching rule OID that is designed to provide a method to look up the ancestry of an object.

意思就是加上這個matching rule,搜尋會不斷的往上層(ancestry)搜尋,直至沒有符合結果為止。

用(memberOf:1.2.840.113556.1.4.1941:=CN=GROUP1, DC=XX,DC=xx)的例子來看,
從search base開始搜尋,會找出所有memberOf 最上層為 CN=GROUP1, DC=XX,DC=xx的所有成員,因此就會找出person1, group甲, groupA三個結果。

所以這段指令就是根據search base,列出所有Group1下的成員,包含群組與帳號,當然如果只要帳號可以額外再過濾。

不過下方文章下方還有一另一個用法,如果現在要找所有包含person1的群組,該怎麼找呢?


(member:1.2.840.113556.1.4.1941:=CN=person1,OU=xxx,DC=XX,DC=xx)

其實就是把person1想成是最上層,透過member屬性找出所有群組。
用這個方式,可以列出person1所有包含到的群組,包含Group甲、GroupA與Group1。



參考網址:
Nesting groups
Search Filter Syntax
ldap nested group membership


沒有留言:

張貼留言

Java Spring Framework 筆記 - Autowiring (2)

這篇記錄透過 Annotation來做到 Spring的 autowiring。