我正在处理我正在处理的脚本的问题,我必须已经花了4个小时才解决这个问题,所以现在我转到这里。我有以下代码,为每个人缩短了它:
while($true){
$seclog = Get-EventLog -List | Where-Object {$_.Log -eq 'Security'} ;
Register-ObjectEvent -InputObject $seclog -SourceIdentifier NewEventLogEnter -EventName EntryWritten -Action {
$entry = $event.SourceEventArgs.Entry
if($entry.EventID -eq 4776){
if($entry.EntryType -eq 'FailureAudit'){
$i++;
}
elseif($entry.EntryType -eq 'SuccessAudit'){
[System.Windows.Forms.MessageBox]::Show("$i")
break;
}
}
}
}
当我运行脚本时,它可以根据需要运行但我得到一个无限循环的powershell控制台说: Register-ObjectEvent:无法为SourceIdentifier创建订户,一个存在。以下是错误的图片:Link to my dropbox, where I am hosting the picture.
我还没有足够的代表来发布picutres。
我需要这个在无限循环中运行,所以在整天敲打我的头后,我认为可能有办法检查所有创建的当前事件,看看我是否可以检查SourceIdentifier是否已经在使用中因此,我们不会创建新实例。从而解决了这个问题。我想我可以通过 Get-EventSubscriber 命令完成这项工作,但我不太确定。这是我的第一个powershell脚本,所以请原谅我在代码中看到的任何可怕的事情。谢谢。
答案 0 :(得分:1)
我想我明白你要做的是什么,但是你混淆了一些事情。也许你在.NET事件之间有点混乱,因为异步回调(使用Register-ObjectEvent
)和事件作为日志文件中的记录。
如果我了解您的尝试,您需要计算在您取得成功之前看到的失败审核次数,在这种情况下,您会显示先前的失败审核计数。这意味着您希望使用日志文件中记录的事件类型。看看这个:
$seclog = Get-EventLog -LogName Security
foreach ($entry in $seclog) {
if($entry.EventID -eq 4776){
if($entry.EntryType -eq 'FailureAudit'){
$i++;
}
elseif($entry.EntryType -eq 'SuccessAudit'){
[System.Windows.Forms.MessageBox]::Show("$i")
break;
}
}
}
如果你想在循环中执行此操作,则必须将整个内容包装在while
子句中,并且每次从事件日志中获取记录时,都应该传递日期和时间。您之前阅读的最新记录。
希望这有帮助。
答案 1 :(得分:0)
TBH,我不确定我是否正确理解了这个问题,但您是否可以使用类似下面的代码检查源是否存在,如果不存在则创建它?
if (-not([System.Diagnostics.EventLog]::SourceExists($source))) {
## Write-Host "$source does not exist. Creating new one"
[System.Diagnostics.EventLog]::CreateEventSource($source,$logname)
}