在Powershell中使用Get-EventSubscriber cmdlet

时间:2013-04-16 06:14:32

标签: windows events powershell scripting

我正在处理我正在处理的脚本的问题,我必须已经花了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脚本,所以请原谅我在代码中看到的任何可怕的事情。谢谢。

2 个答案:

答案 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)    
}
相关问题