1. 程式人生 > >使用 PowerShell 收集 AD 信息

使用 PowerShell 收集 AD 信息

服務器 Windows Server

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一致:

技術分享圖片

??? 所以,可以使用通配符來獲得多個結果~

技術分享圖片

使用 PowerShell 收集 AD 信息