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

あなたがやろうとしていることは理解できると思いますが、いくつかのことを混同しています。Register-ObjectEventおそらく、非同期コールバックとしての .NET イベント (これは を使用します) と、ログ ファイル内のレコードとしてのイベントとの間で少しごちゃ混ぜになっているかもしれません。

あなたの試みを理解している場合は、成功するまでに失敗した監査の数を数えたいと考えています。成功した場合は、失敗した監査の以前のカウントを表示します。これは、ログ ファイル内のレコードであるイベントのタイプを操作する必要があることを意味します。これを見てください:

$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 に答える