使用 PowerShell 創建 Active Directory 登錄報告

使用PowerShell创建Active Directory登录报告。正如我们所知,在Active Directory(AD)环境中进行审计对安全至关重要。找出用户的操作以及他们登录到哪个系统是至关重要的。因此,大多数管理员如今正在处理的一个基本任务是找出用户登录到哪里。本文将逐步介绍如何利用域控制器(DC)上内置的事件查看器,找出用户的登录位置,并使用PowerShell生成全面的登录报告

因此,让我们继续阅读有关使用PowerShell创建Active Directory登录报告的文章。

创建Active Directory登录报告

前提条件

自從我們將使用事件檢視器監控數天的事件後,我們需要確保我們的事件記錄大小足夠。雖然我們可能已經啟用了這些設置,但如果其他人需要增加事件日誌大小,我們將再次檢查這些設置。

如果我們以前沒有更改過任何配置,我們事件日誌的默認大小設置應該大約為64 MB。但是,如果我們在我們的環境中處理多個DCs,增加大小可能是必要的。例如,如果我們想要追蹤數天的審核登錄,我們在事件檢視器中將需要更多的空間。

創建一個GPO

1. 準備環境的第一步是創建一個包含事件日誌大小設置的群組原則物件(GPO)。讓我們打開群組原則管理控制台(GPMC),創建一個GPO。要打開控制台,請搜索群組原則 或在執行(Ctrl+R)窗口中輸入gpmc.msc 

2. 在導航面板中,展開 森林: 森林名稱,展開 ,展開 域名稱,然後點擊 群組原則物件。接下來,點擊 動作,然後點擊 新建

3. 在新建立的 GPO 中找到以下路径:

4. 根据我们的环境和需求更改 安全 事件大小。此外,如果没有关于磁盘空间和性能的担忧,可以将设置配置为最大 4 GB。

5. 如果域控制器没有防火墙设置,则以下步骤是可选的。然而,我们必须能够从多个 域控制器 和可能的多个站点查询事件日志。因此,通过防火墙启用 远程事件 日志 监视 是明智的。

不幸的是,只能涵盖有关配置防火墙设置的一些细节。然而,下图将显示在我们的 控制器上启用 远程事件日志监视 所需的所有设置。

6.現在,將剛剛建立的GPO連接到Domain Controllers OU,並等待一些事件填充。事件取決於環境,我們可以立即開始查詢審計,或者等待幾天。現在我們已經正確設置了日誌記錄,可以繼續運行下一節文章中將要討論的PowerShell腳本。

接下來是使用PowerShell創建Active Directory登錄報告的主要部分,請繼續閱讀。

使用PowerShell創建AD登錄報告

首先,下載並將腳本複製到目錄或文件夾中。或者,如果已安裝git我們可以運行以下命令。

git clone https://github.com/InfraSOS/Get-UserLastLogon.git

腳本使用了ActiveDirectory 模組,但我們不需要手動安裝它,因為腳本會檢查系統中是否已有該模組。下載完成後,啟動 PowerShell 並導航至已下載腳本的文件夾或驅動器。

如果我們編輯下載的文件,會看到四個主要功能。這四個主要功能分別是ParamBeginProcessEnd

解釋 PowerShell 腳本

Param部分包含運行腳本所需的參數。如下面的代碼塊所示,我們需要三個參數才能使腳本運作。稍後我們將解釋這些參數。

param (
    [Parameter(Mandatory = $true)]
    [String]$User,

    [Parameter(Mandatory = $false)]
    [Array]$Server = @((Get-ADDomainController -Filter *).Name) ,

    [Parameter(Mandatory = $false)]
    [Array]$Days = 90
)

作為最佳實踐,變量和一般信息應放在Begin部分,以避免使腳本的主要部分過於擁擠。

[Array]$Table         = $null
$DomainControllers    = $Server
$AllDomainControllers = @((Get-ADDomainController -Filter *).Name)
[Array]$ExclusionList = @($User,'krbtgt')
$DCCount              = $DomainControllers.Count
$UPN                  = ((get-addomain).DNSRoot).toUpper()
$DateFilter           = "-"+$days
$DateThen             = (((Get-Date).AddDays($DateFilter)).ToString("yyyy-MM-dd"))+"T20:30:00.000Z"
$DateNow              = (Get-Date -Format yyyy-MM-dd)+"T20:30:00.999Z"
$ForestRoot           = ((Get-ADForest).rootDomain).toUpper()
$Counter              = 0

Begin部分還為查詢事件日誌制定了主要篩選器。然後,腳本將此篩選器發送到每個 DC 以收集信息。正如我們在這些行中所看到的,有一些先前討論過的變量,如$UPN$User

[xml]$FilterXML = @"


    *[System[(EventID=4769)
	and TimeCreated[@SystemTime>='$DateThen'
	and @SystemTime<='$DateNow']]]
	and*[EventData[Data[@Name='TargetUserName'] and (Data='$User@$UPN')]]


"@

過程部分是核心功能,脚本在此查询数据以生成报告。下面的代码块是foreach命令,每次登录到另一个DC查询数据时执行。

Foreach($DCName in $DomainControllers){...}

我们首先收集我们的第一个DC上的事件。然后,下一步是从每个事件中提取有价值的信息并将其保存到对象中,然后继续处理下一个事件。完成第一个DC后,脚本移动到另一个DC并重复该过程。

最后,结束部分将显示最终生成的报告。

end{
    $Table = $Table | Where-Object {($_.Location -notin $AllDomainControllers) -and ($_.Location -ne $ForestRoot) -and ($_.Location -notin $ExclusionList)}
    $Table | Sort Time | FT Time,User,Location,Domain,DC -AutoSize
}

运行PowerShell脚本

要开始,打开PowerShell并键入下面的命令以将cmdlet加载到内存中。当我们按Enter键时,可能会出现错误,指示由于PowerShell执行策略而禁用了脚本的执行,或者不会出现错误。在出现错误的情况下,以管理员权限打开PowerShell控制台,键入以下命令以允许脚本执行,然后重复前面的命令。

. .\Get-UserLastLogon.ps1

當我們按下Enter鍵時,可能會出現錯誤,指示由於PowerShell執行策略,腳本的執行被禁用,或者不會出現錯誤。如果出現錯誤,請以管理員權限打開PowerShell控制台,輸入以下命令以允許腳本執行,然後重複之前的命令。

Set-ExecutionPolicy RemoteSigned
. .\Get-UserLastLogon.ps1

現在腳本已完全載入,讓我們將其作為一個例子,找出用戶在過去15天內登錄過哪些工作站。首先,輸入用戶名,使用  –User參數和時間範圍使用–Days參數,然後按Enter

Get-UserLastLogon -User marion -Days 15

如您所記得,我們有另一個稱為-Server 參數。如果我們不向-Server參數提供值,我們將考慮所有網域控制器來填補這個參數。現在,如果我們有一個特定的DC想要針對搜索查詢,我們可以將其指定為-Server參數的值。

運行後,腳本將顯示一個進度條,通知我們其狀態以及完成所需時間。現在我們可以看到在運行腳本後生成的報告。該報告告訴我們用戶在過去15天內登錄了哪些工作站。

Time                  User   Location      Domain  DC
----                  ----   --------      ------  --
11/19/2022 7:31:11 AM marion DESKTOP-IGK57 abc.com MARION-DC01

理解PowerShell腳本

當我們運行腳本時,在一開始,它會檢查用戶帳戶是否存在。因此,顯然如果輸入的用戶名或ID不存在,我們就不需要運行剩餘的腳本。

在接下來的步驟中,我們計算所需的變量並將它們發送到DC,以及查詢我們選定用戶的事件所需的過濾器。最後,腳本向列表中的第一個域控制器發送請求,並將與選定用戶相關的查詢事件保存到一個變量中。

腳本將開始的保存事件列表,以及後續步驟將涉及從事件中收集有價值的數據。最後,腳本將提取的數據分配給一個變量,例如域、DC名稱、登錄時間和登錄工作站。

最後,腳本遍歷下一個DC並重複此過程。

一旦腳本聯繫到最後一個DC並收集其信息,它將向我們顯示一個計算機列表。

Time                  User   Location      Domain  DC
----                  ----   --------      ------  --
11/19/2022 7:31:11 AM marion DESKTOP-IGK57 abc.com MARION-DC01

感謝您閱讀使用PowerShell創建Active Directory登錄報告。我們將結束。

創建Active Directory登錄報告結論

在本指南中,我們學習了如何使用必要的事件查看器,並將其與 PowerShell 腳本結合起來,以查找用戶已登錄的工作站列表。該腳本在域中查詢所有 DC,找到結果並將其解析為可讀的格式,我們可以導出為 報告。在運行提供的腳本之前,請記得運行檢查前提條件。

Source:
https://infrasos.com/create-active-directory-logon-reports-with-powershell/