使用PowerShell创建Active Directory登录报告

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

因此,让我们继续阅读文章《使用PowerShell创建活动目录登录报告》。

创建活动目录登录报告

先决条件

由于我们将使用事件查看器监视器几天的事件,我们需要确保我们的事件日志大小足够。虽然我们可能已经启用了这些设置,但如果其他人需要增加事件日志大小,我们将再次检查它们。

如果我们之前没有更改任何配置,则我们的事件日志的默认大小设置应该大约为64 MB。然而,如果我们的环境中有多个DC,可能需要增加大小,主要是因为这样做。例如,如果我们想要跟踪几天的审核登录,我们在事件查看器中需要更多的空间。

创建GPO

1. 作为准备环境的第一步,我们将创建一个包含组策略对象(GPO)的设置的事件日志大小。让我们打开组策略管理控制台(GPMC),创建一个GPO。要打开控制台,搜索组策略 或在运行(Ctrl+R)窗口中键入gpmc.msc 

2.在导航面板中,展开Forest: ForestName,展开 Domains,展开 DomainName,然后点击 Group Policy Objects。接下来,点击 Action,然后点击 New

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

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

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

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

6.现在,将我们刚刚创建的GPO连接到域控制器OU,并等待一些事件进行填充。事件取决于环境,我们可以立即开始查询审计,或者等待几天。现在我们已经正确设置了日志记录,我们可以继续运行PowerShell脚本,这将在文章的下一部分中讨论。

接下来,使用PowerShell创建Active Directory登录报告是文章标题的主要部分。请继续阅读。

还阅读尝试使用InfraSOS创建AD登录报告

使用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/