Collect Active Directory information by PowerShell.
發現經常安排不過來去現場獲取基礎架構環境的信息,而客戶的維護人員有時候又不知道要幫助收集哪些信息。用韋小寶的話說,我們要運籌什麼什麼之中,決勝什麼什麼之外。所以要看看有沒有辦法不用人在現場就收集一些信息。
在寫了一段用來收集Exchange架構的PowerShell之後,由於Exchange非常依賴於AD,我感覺有必要收集更多的AD的信息。所以嘗試增加一些AD的腳本。通常來說,瞭解AD的情況,可以分爲幾個部分:林和域的情況,站點和子網的情況,複製的情況,域間信任以及組織單元。
- 林和域
收集林的情況主要需要林的名稱、根域,功能級別,主機角色和包含站點等信息。
收集域的情況主要需要域名,功能級別,主機角色等信息。
獲取五個主機角色,使用兩條命令就可以。
Get-ADForest |fl RootDomain,ForestMode,DomainNamingMaster,SchemaMaster
Get-ADDomain |fl Name,DomainMode,InfrastructureMaster,RIDMaster,PDCemulator
當然,每臺域控制器的信息也是需要的。
有點雜亂,所以只看名稱、所在域、操作系統版本(也可以加上Build Number)和所在站點。
當然,可以按照站點或者其他來記個數。
- 站點和子網
站點和子網的瞭解,往往是優化AD使用例如登錄慢、經常出錯的起點之一。而直接使用默認的Get-ADSite的命令,沒有我們想要的站點和子網的關聯關係。
因此,需要一個有技巧的操作。使用Get-ADObject,直接查詢需要的AD對象。
舉例來說,爲了查看站點及關聯的子網,我們可以直接從AD配置裏篩選對象類型是Site的AD對象,然後查看這個對象裏記錄的子網信息。
我相信任何人第一次寫的時候一定有點懵,即使你是個AD的老司機。沒關係,讓我們掏出AD的神器ADExplorer。這是大神Mark好多年前做的工具,伴隨我從青春年少,走到了油膩蒼老……
找到我們想要收集信息的站點,點擊站點對象,就能看到,其實它包含了子網的信息,這些信息在屬性siteObjectBL中,所以纔可以使用特定的過濾,把這些信息從浩如煙海的AD信息中篩選出來。
過濾器的寫法,就是'objectClass –eq "site"',爲了避免搜索整個AD,我們加上起始搜索位置,即'CN=Configuration,DC=contoso,DC=com'。DC的名稱按照實際域名修改即可。
我發現看上去結果不是很順眼,所以改從子網來顯示對應站點。這當然也沒有問題。把過濾器寫成'objectClass –eq "subnet"',然後收集屬性 siteObject即可:
Get-ADObject -Filter 'objectClass -eq "subnet"' –SearchBase 'CN=Configuration,DC=contoso,DC=Com' -Properties siteObject | FT Name,siteObject
站點鏈接的話,一條簡單的PowerShell就搞定了。可以用FormatList/fl 讓輸出看的清爽一些。
- AD複製
Get-ADReplicationConnection
Get-ADReplicationSite
Get-ADReplicationSiteLink
Get-ADReplicationSiteLinkBridge
Get-ADReplicationSubnet
Get-ADReplicationFailure
測試環境就一臺DC,先放着吧。
- 信任關係
Get-ADTrust
測試環境暫時沒做多域,先放着吧。
- 組織單元
想起十幾年前,用VB腳本加上遞歸查詢OU了……通常在初步瞭解AD信息時,其實很少馬上收集OU、用戶、組等信息,因爲數量太大。如果需要收集的話,當然也不是沒辦法。
先用複雜的,上ADObject,使用過濾器只顯示類型是Organizational Unit的對象。於是我們得到了所有的OU的清單。
相同的,直接使用簡單的Get-ADOrganizationalUnit,同樣可以得到一致的結果。
Get-ADObject -Filter 'objectclass -eq "organizationalunit"' –SearchBase 'DC=contoso,DC=Com' |fl DistinguishedName
Get-ADOrganizationalUnit -Filter * |fl DistinguishedName
- 其他
理論上AD裏需要的信息,都可以通過Get-ADObject來拿到。只是需要提前想好使用怎樣的過濾器,提取怎樣的對象屬性而已。
我想起以前部署System Center Configuration Manager架構的時候,需要在AD的System下確認一個容器。以前很難跟不瞭解AD的去描述,所以大多需要自己動手使用工具查看。現在簡單了。
舉個例子,我們要確認CN=System下有沒有CN=RpcServices的容器,簡單一條命令就可以了。
Get-ADObject -Filter 'cn -eq "rpcservices"' –SearchBase 'CN=System,DC=contoso,DC=Com'
如何使用Get-ADObject的進一步信息,可以參考:https://docs.microsoft.com/en-us/powershell/module/addsadministration/get-adobject
對過濾器的使用語法,和PowerShell一致:
所以,可以使用通配符來獲得多個結果~