在中大型組織,會採用 AD Forest 架構(參考:組織網域樹系模型),子公司或單位各有自己的 AD 網域,整個組織的 AD 再組成一個 Forest。優點是各單位可自行管理網域,網域間又可彼此信任,可以用 Domain B 的帳號登入 Domain A 的網站,讓帳號管理單純化。

分享今天學到的新技巧 - 如何在整個 AD Forest 搜尋特定帳號?

之前我慣用的做法是輸入帳號時附帶網域名稱,先用網域名稱找到 Domain Controller (DC),再連上它查詢帳號。(類似 AD 帳號問題快篩工具的做法)

今天聽同事說,他印象中有不指定 DC,直接找到組織內任一網域帳號的程式寫法。認真研究一下,真的有耶!

在 Forest 架構中,會由 Global Catalog (GC) 負責彙整子網域資料,Knownledge Consistency Checker(KCC) 程序建立抄寫拓樸確保各子網域內容持續同步到 GC 伺服器 (Forest 第一個 Domain 的第一台 DC 是當然的 GC 伺服器,之後可視需要委派額外的 GC 伺服器)。

AD 運作過程中,有些動作要靠查詢 GC 完成,例如:

  • 登入時,搜尋 GC 找出帳號跟所在網域 (所以 A 網域的網站能直接用 B 網域或 C 網域帳號登入)
  • 通用群組可能包含跨網域成員,需查詢 GC 取得資訊
  • 以 Entire Directory 做為搜尋範圍時
  • 碰到 Ditinguished Name 隸屬其他網域時,查詢 GC 確定其真的存在

搜尋 GC 跟一般查詢 LDAP 的做法差不多,但連線對象要是 GC 伺服器,並改用 Port 3268。

參考資料:Global Catalog and LDAP Searches

了解以上基本知識,來看看怎麼跨網域查詢使用者帳號。

首先要找到 GC 伺服器,最簡單做法是使用 PowerShell 指令 - Get-ADForest,DomainNamingMaster 或 SchemaMaster 有 FQDN。(例如:Fabrikam-DC1.Fabrikam.com)

然後,PowerShell AD 相關命令加上 -Server 指定 GC 伺服器及 3268 Port,便可在整個 Forest 搜尋,就這麼簡單:

Get-ADUser AD帳號 -Server Fabrikam-DC1.Fabrikam.com:3268

一併附上 C# 範例:

<%@ Page Language="C#"%>
<%@ Import Namespace="System.DirectoryServices" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
    var u = "AD帳號";
    var dc = "LDAP://Fabrikam-DC1.Fabrikam.com:3268";
    var directorySearcher = new DirectorySearcher(new DirectoryEntry(dc));
    directorySearcher.Filter = "(SAMAccountName=" + u + ")";
    var res = directorySearcher.FindOne();
    var resProps = res.Properties;
    Response.ContentType = "text/plain";
    foreach (string key in resProps.PropertyNames) 
    {
        Response.Write(key + "=");
        foreach (var val in resProps[key]) 
        {
            Response.Write(val + "\t");
        }
        Response.Write("\n");
    }
}
</script>

Introduce the concept of AD GC and how to search AD objects in forest.


Comments

Be the first to post a comment

Post a comment