列舉使用者
不同於 Windows NT 4.0 網域,Windows 2000 使用者可以放在網域中的任何容器或組織單位(OU)以及網域的根目錄中。 這表示用戶可以在檔案目錄階層中的各種位置。 因此,您有兩個列舉用戶的選項:
列舉直接包含在容器、OU 或網域根目錄的使用者:
明確系結至包含您有興趣列舉的使用者的容器物件,設定一個包含「user」類別的篩選,使用 IADsContainer.Filter 屬性,然後使用 IADsContainer::get__NewEnum 方法來列舉使用者物件。
這項技術可用來列舉直接包含在容器或 OU 物件中的使用者。 如果容器包含可能包含其他使用者的其他容器,您必須系結至這些容器,並以遞歸方式列舉這些容器上的使用者。 如果您不需要操作用戶物件,而且只需要讀取特定屬性,請使用選項 2 中描述的深層搜尋。
由於列舉會傳回代表每個用戶物件的 ADSI COM 物件的指標,因此您可以呼叫 QueryInterface 來取得 IADs、IADsUser,以及 IADsPropertyList 使用者物件的介面指標。 這表示您可以取得容器中每個列舉用戶物件的介面指標,而不需要逐一綁定到每個使用者物件。 若要直接在容器內對所有使用者執行作業,列舉可避免必須系結至每個使用者,以呼叫 IADs 或 IADsUser 方法。 若要從使用者擷取特定屬性,請使用 IDirectorySearch,如選項 2 中所述。
執行深度搜尋 (&(objectClass=user)(objectCategory=person)) 以尋找樹結構中的所有使用者:
首先,系結至要開始搜尋的容器物件。 例如,若要尋找網域中的所有使用者,請系結至網域的根目錄;若要尋找樹系中的所有使用者,請系結至全域編錄,並從 GC 的根目錄進行搜尋。
然後使用 IDirectorySearch,運用包含 (&(objectClass=user)(objectCategory=person) ) 的搜尋篩選進行查詢,並設定 ADS_SCOPE_SUBTREE 作為搜尋偏好。
您可以使用 ADS_SCOPE_ONELEVEL 的搜尋喜好設定來執行搜尋,將搜尋限制為您系結之容器物件的直接內容。
IDirectorySearch 只會從使用者擷取特定屬性的值。 若要擷取值,請使用 IDirectorySearch。 若要操作從搜尋結果傳回的用戶物件,也就是說如果您想要使用 IADs 或 IADsUser 方法,您必須明確地將它們系結起來。 若要這樣做,請將 distinguishedName 指定為從搜尋傳回的屬性之一,並使用傳回的辨別名稱系結至搜尋中傳回的每個使用者。
只會擷取特定屬性。 您無法在未明確指定使用者類別的每個可能屬性的情況下擷取所有屬性。