每次偶尔,我都看到有人要求一种跟踪改变的方法。它让我想起了一个脚本,我写了一次,以跟踪在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中删除

我知道经常有审计日志可以告诉你发生了哪些变化,谁正在进行更改。但是使用这种方法使您的环境变化的日常或每周摘要报告。

使用你的想象力,如果你找到了一种使用它的创造性方式,请告诉我。我很乐意听到它。