PS 脚本为多个窗口事件 ID 生成单个警报

PS 脚本为多个窗口事件 ID 生成单个警报

我创建了 PS 脚本,当 Active Directory 中的任何帐户被删除时,它会通过电子邮件通知我。我附上了包含相关事件的脚本。

在 AD 服务器上使用 ADUC(GUI),如果我删除单个用户帐户,我会收到通知,但如果我尝试通过选择两个用户帐户一次删除两个用户,脚本会为同一个用户发送两个警报,而不是为每个用户发送一个警报,例如,如果我删除两个用户 TEST1、TEST2,那么我会收到 2 条通知,但仅限于最后删除的第一个用户

在事件查看器中,我可以分别查看每个用户事件。但我注意到,可能由于事件的日期时间相同,获取事件仅获取最后一个事件。如果我逐个删除单个用户,则警报对每个用户都有效。

PS脚本:

# Script to get event details & sends email or echo output
Cls
###### Modification Starts here
$EventID = “4726”
$From = “[email protected]
$To1 = “[email protected]
$SmtpServer = “10.0.01”
###### Modification Ends here
$GetEvent = Get-EventLog -LogName “Security” -InstanceID $EventID -Newest 1
$EventTime = $GetEvent.TimeGenerated
$GetEventMessage = $GetEvent.Message
$AccountSid = $($GetEvent.ReplacementStrings[3])
$objSID = New-Object System.Security.Principal.SecurityIdentifier (“$AccountSid”)
$Account = $objSID.Translate( [System.Security.Principal.NTAccount])
$messageParametersTo1 = @{
Subject = “$EventID – $env:computername – $Account – Account DELETED”
Body = “EventID: $EventID – $env:computername – $objUser – Account DELETED on $EventTime. nnEvent Details: nn $GetEventMessage nn nn`Script Powered by XZY / MYCOMP IS Dept”
From = “$From”
To = “$To1”
SmtpServer = “$SmtpServer”
}
Send-MailMessage @messageParametersTo1

答案1

我认为解决这个问题的最佳方法是将事件信息传递给任务:

1、将您当前的计划任务导出为xml文件,并做以下修改:

在“/Task/Triggers/EventTrigger”中的“Subscription”元素后插入以下内容

 <ValueQueries>
   <Value name="IndexID">Event/System/EventRecordID</Value>
 </ValueQueries>

将元素“Task/Actions/Exec/command”和“Task/Actions/Exec/Arguments”中的行调整为以下内容,将文件路径替换为脚本的路径:

<Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command>
<Arguments>-Command <Path of Script File> '$(IndexID)'</Arguments>

将修改后的任务重新导入任务计划程序,以便脚本现在可以使用该变量

2、调整您的 powershell 脚本以接受将传递的新变量:

# Script to get event details & sends email or echo output
Cls
###### Modification Starts here
$EventID = “4726”
$From = “[email protected]
$To1 = “[email protected]
$SmtpServer = “10.0.01”
###### Modification Ends here
$GetEvent = Get-EventLog -LogName “Security” -Index $Args[0] # Modified to use index instead of -InstanceID & -newest, the newly passed through variable is inserted into an array of $Args.
$EventTime = $GetEvent.TimeGenerated
$GetEventMessage = $GetEvent.Message
$AccountSid = $($GetEvent.ReplacementStrings[3])
$objSID = New-Object System.Security.Principal.SecurityIdentifier (“$AccountSid”)
$Account = $objSID.Translate( [System.Security.Principal.NTAccount])
$messageParametersTo1 = @{
    Subject = “$EventID – $env:computername – $Account – Account DELETED”
    Body = “EventID: $EventID – $env:computername – $objUser – Account DELETED on $EventTime. nnEvent Details: nn $GetEventMessage nn nn`Script Powered by XZY / MYCOMP IS Dept”
    From = “$From”
    To = “$To1”
    SmtpServer = “$SmtpServer”
}
Send-MailMessage @messageParametersTo1

现在,这将使用事件的索引 ID(在事件中名为 EventRecordID)从事件查看器中提取正确的记录。我已注释该行$GetEvent = Get-EventLog -LogName “Security” -Index $Args[0]以解释差异。

通过这种方式拉动事件会比较慢,但它是每个触发任务的正确事件。

有关从触发事件导入数据到执行脚本的过程的更多信息,请访问以下链接:

https://michlstechblog.info/blog/windows-passing-parameters-to-event-triggered-schedule-tasks/

相关内容