每次偶尔,我都看到有人要求一种跟踪改变的方法。它让我想起了一个脚本,我写了一次,以跟踪在Active Directory中进行的更改。每天两次,我的团队通过电子邮件发送了一份报告,显示了更改的所有用户帐户,组成员资格和组策略。事实证明,成为一个有价值的工具,让每个人都能看到最近所做的更改。
我提醒那个脚本,因为我以一种非常通用的方式处理了那种方案,可以应用于您想要监视的许多其他事情。
高级计划
这是所有技能水平的一个很好的项目,因为核心思想是简单的构建。
- 捕获命令的状态
- 将状态与您检查的最后一次进行比较
- 报告结果
- 保存下一个比较的当前状态
然后将其设置为计划任务并让它运行。
指数
捕获状态
对于此示例,我将跟踪我系统上的服务状态。这样我就可以启动和停止服务以模拟更改。我说我们正在捕捉状态,但这只是一个奇特的方式来拯救它变成一个变量。
$currentState = Get-Service
当捕获我们在这里在此处进行的状态时,我们希望我们想要比较的每个项目的一个对象或行。服务是扁平物体,因此它们将很容易比较。
如果您的主对象在您关心的属性中有大量的值列表,则您将想要将它们压平。这将简化我们的比较,并为我们提供更有意义的比较。一个很好的例子是Active Directory组及其成员。漫步并使用组名和成员名称创建一个新对象。如果出口到CSV,创建一个看起来很好的东西。
与以前的州比较
处理鸡肉和鸡蛋的情况。我们第一次运行这个时,我们没有以前的状态。我们将最终以稍后将当前状态保存到文件中。因此,现在,我们需要从文件中加载以前的状态,如果存在。
if( Test-Path $path )
{
$previousState = Import-CliXml $path
# ...
}
如果我们有以前的状态,我们需要比较这两个州。我们可以进行完整的对象比较,但我们通常只关心特定值。我发现最好将跟踪到最低限度的属性数量。请务必排除可能导致我们不想看到的更改的嘈杂属性。
对于我们的服务,我们将使用这些属性。
$properties = @( 'DisplayName','Status','StartType' )
Compare the previous and current state using Compare-Object
.
$compare = @{
ReferenceObject = $previousState
DifferenceObject = $currentState
Property = $properties
SyncWindow = 1000
}
$results = Compare-Object @compare | Sort -Property $properties
报告结果
我的输出在几个更改后看起来像这样。
DisplayName Status StartType SideIndicator
----------- ------ --------- -------------
Group Policy Client Stopped Automatic <=
Group Policy Client Running Automatic =>
Print Spooler Stopped Automatic =>
Print Spooler Running Automatic <=
Tile Data model server Stopped Manual <=
Tile Data model server Running Manual =>
Windows Insider Service Stopped Manual =>
Windows Insider Service Running Manual <=
Our results are a typical compare object result. We can email this output as is or add a little processing to make it more meaningful. If the results are $null
, then there are no changes to report on.
保存当前状态
最后一步是保存当前状态。
$currentState | Export-CliXml $path
这让我们在下次执行时置于一个好地方。
把它整合在一起
我用一个简单的例子进行比较,但这可能是任何东西。我已经使用了这些类型的监控任务的技巧。
- 广告用户创建,禁用或主文件夹更改
- 创建的团体或成员更改
- 创建或修改的组策略对象
- 从广告中加入或删除的计算机,或者描述更改
- 创建的新VM,已更改,删除或配置
- 数据库添加或从SQL Server中删除
我知道经常有审计日志可以告诉你发生了哪些变化,谁正在进行更改。但是使用这种方法使您的环境变化的日常或每周摘要报告。
使用你的想象力,如果你找到了一种使用它的创造性方式,请告诉我。我很乐意听到它。