1

我正在处理的脚本有问题,我必须已经花了 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: could not createsubscriber for SourceIdentifier, one exists。这是错误的图片:链接到我的保管箱,我在其中托管图片。

我还没有足够的代表来发布图片。

我需要它在无限循环中运行,所以在敲了一天头之后,我认为可能有一种方法可以检查所有当前创建的事件,看看我是否可以检查 SourceIdentifier 是否已经在使用中,因此,我们不会创建新实例。从而解决问题。我想我可以通过Get-EventSubscriber命令完成这项工作,但我不太确定。这是我的第一个 powershell 脚本,所以请原谅我在我的代码中看到的任何可怕的东西。谢谢你。

4

2 回答 2

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子句中,并且每次从事件日志中获取记录时,您应该传入您之前阅读过的最新记录的日期和时间.

希望这可以帮助。

于 2013-05-31T17:47:09.550 回答
0

TBH,我不确定我是否正确理解了这个问题,但你可以使用下面的代码来检查源是否存在,如果不存在则创建它?

    if (-not([System.Diagnostics.EventLog]::SourceExists($source))) {
    ## Write-Host "$source does not exist. Creating new one" 
    [System.Diagnostics.EventLog]::CreateEventSource($source,$logname)    
}
于 2013-04-16T12:58:19.027 回答