当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 搜索 Active Directory 日志

作者:精品下载站 日期:2024-12-14 08:01:41 浏览:14 分类:玩电脑

使用 PowerShell 搜索 Active Directory 日志


[玩转系统] 使用 PowerShell 搜索 Active Directory 日志

过去几周,我一直在研究 Active Directory 并使用 PowerShell 自动执行管理任务。如果您返回一两页帖子,您会看到我分享的一些脚本和函数。今天,我想解决最近评论中出现的与跟踪 Active Directory 更改相关的问题。一个合乎逻辑的问题是“谁做出了改变?”。我还想知道“他们改变了什么?”仅靠 PowerShell 无法获得所有这些答案。如果您运行任何规模合适的 Active Directory 基础设施,我希望您投资企业级管理工具。我分享的代码适合那些别无选择只能做自己事情的小商店。或者在您需要填补空白并解决短期问题的情况下。

事件日志挖掘

要获取有关谁在 Active Directory 中进行更改的信息,您必须深入研究事件日志。具体来说,您需要查询安全事件日志。更具体地说,您需要查询可以写入 Active Directory 的域控制器上的安全事件日志。当管理员在 DOM1 上启用用户帐户时,会在安全事件日志中创建一个条目。显然,您不会在 DOM2 上的安全事件日志中看到更改。

我的前提以及我将向您展示的代码假定 Windows 服务器上的默认事件日志设置。如果您要转发日志或使用第三方解决方案管理日志,则在查看我的代码时需要考虑到这一点。我要向您展示的信息位于安全事件日志中,并且是特定于服务器的。如何管理这些日志取决于您。

在我深入挖掘之前,先做一个简短的警告。每个组织都有自己的事件日志管理政策和程序。仅当信息尚未从安全事件日志中刷新时,您才能查询与 Active Directory 相关的更改。这意味着您可能需要确保日志文件足够大以满足您的需求。在我的测试域中,我运行此命令将大小增加到 1GB。

limit-eventlog -LogName security -ComputerName dom2,dom1 -MaximumSize 1024MB

用户管理事件

我将重点关注用户管理事件。每种类型的事件都与一个事件 ID 相关联。这是我使用的一个作弊哈希表。

# a hashtable of user management event IDs for the Security event log
$ADEvent = @{
   UserChanged  = 4738
   UserCreated  = 4720
   UserDeleted  = 4726
   UserEnabled  = 4722
   UserDisabled = 4725
}

当您管理 AD 用户帐户时,您可能会获得同一活动的多个日志条目。例如,如果您创建一个用户帐户并启用它,您很可能会看到 UserCreated 和 UserEnabled 事件。可能也是 UserChanged 。记住这一点。

要查询事件日志,我建议您学习如何使用 Get-WinEvent。它提供了更多的查询灵活性,速度更快一点(我认为),当您使用 PowerShell 7 时,它是您拥有的唯一工具。我希望您能够阅读帮助和示例。同时,这是一个示例。

Get-WinEvent -FilterHashtable @{Logname = 'Security';ID=4720;Starttime="2/1/2021"} -ComputerName dom1

这是查询 DOM1 上自 2021 年 2 月 1 日以来记录的所有用户创建事件。

[玩转系统] 使用 PowerShell 搜索 Active Directory 日志

让我们深入了解消息详细信息。

[玩转系统] 使用 PowerShell 搜索 Active Directory 日志

事件日志条目将显示主题、负责活动的帐户和目标。在本例中,它看起来像 Company\Administrator 创建了 Company\L.Kuja。我不知道该帐户是在哪里创建的,但我始终可以使用 Get-ADUser 进行查找。

在介绍这一点的同时,我还想指出属性列表。修改用户帐户时,这些是事件日志中捕获的唯一属性。如果我更改用户的部门或职位,安全事件日志不会捕获该信息。如果这种审计跟踪对您很重要,这就是您寻求第三方管理产品的原因。

获取 ADUserAudit

考虑到这些限制,我编写了一个名为 Get-ADUserAudit 的 PowerShell 函数。它具有参数,用于在一个或多个域控制器上创建搜索,以查找自给定时间以来记录的不同类型的用户管理事件。

Get-ADUserAudit -event created,deleted -since "2/1/2021"

默认行为是搜索所有副本域控制器。

[玩转系统] 使用 PowerShell 搜索 Active Directory 日志

该函数将自定义对象写入具有默认自定义格式视图的管道。让我简要解释一下输出。 DomainController、Since 和 EventType 属性应该是不言而喻的。 Targets 属性是为特定事件标识的所有用户帐户的集合。 TargetCount 是查看用户帐户数量的快速方法。换句话说,自 2 月 1 日以来,在 DOM1 上创建(或至少登录)了 5 个用户帐户。管理员显示与事件关联的所有管理员帐户。因此在同一时期,Administrator、AprilS 和 ArtD 创建了帐户。结果不会告诉您哪个管理员创建了哪个用户帐户。您必须深入研究事件日志才能获取该信息。

当然,您可以根据需要自定义结果。

Get-ADUserAudit -event created,deleted,enabled,disabled -outvariable a | sort-object eventtype | format-table -GroupBy eventtype -Property since,domaincontroller,targetcount

[玩转系统] 使用 PowerShell 搜索 Active Directory 日志

或者这是总结事件的一种方法。

$a | group-object eventtype -ov b | select-object @{Name="Since";Expression={$a[0].Since}},Name,@{Name="Total";Expression = { ($_.group.targetcount | measure-object -sum).sum}}

$A 是我之前的命令保存的结果。

[玩转系统] 使用 PowerShell 搜索 Active Directory 日志

如果这是我想经常运行的东西,我会创建一个控制脚本来节省一些输入。我什至可以更进一步,因为我无法控制自己,并将其设置为计划作业来创建 HTML 版本并通过电子邮件发送。

代码在哪里?

如果您想了解我是如何完成所有这些工作的,或者获取代码以便您自己尝试一下,您可以从此 Github gist 下载文件。与此相关的是,您可能还对 Convert-EventLogRecord 命令感兴趣,它是 PSScriptTools 模块的一部分。此命令可以更轻松地从事件日志记录中解析出信息。

Get-WinEvent -FilterHashtable @{Logname = 'Security';ID=4720;Starttime="2/1/2021"} -ComputerName dom2 | 
Convert-EventLogRecord |  
Format-table -GroupBy Computername -Property ID,TimeCreated,
@{Name="Admin";Expression={"$($_.SubjectDomainName)$($_.SubjectUsername)"}},
@{Name="Account";Expression = { (Get-ADuser $_.samaccountname).DistinguishedName }}

现在我可以清楚地看到哪个管理员创建了哪个帐户。

[玩转系统] 使用 PowerShell 搜索 Active Directory 日志

让我知道您的想法或者这些内容是否有帮助。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯