PowerShell / C# 跨網域搜尋 AD 帳號
| | 0 | | ![]() |
在中大型組織,會採用 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