2013-04-16 43 views
1

我遇到了一個我正在處理的腳本的問題,我必須已經爲此問題專門做了4個小時,所以現在我轉到此處。我有如下代碼,縮短給大家:在Powershell中使用Get-EventSubscriber cmdlet

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控制檯會在無限循環中說:註冊-ObjectEvent:無法爲SourceIdentifier創建訂閱者,其中一個存在。這裏是錯誤圖片:Link to my dropbox, where I am hosting the picture.

我沒有足夠的代表發佈picutres呢。

我需要這個運行在一個無限循環中,所以在整天撞我的腦袋後,我認爲可能有一種方法來檢查所有創建的當前事件,並查看我是否可以檢查SourceIdentifier是否已被使用因此,我們不會創建一個新的實例。從而解決了這個問題。我想我可以通過Get-EventSubscriber命令完成,但我不太確定。這是我的第一個powershell腳本,請原諒我在代碼中看到的任何可怕的事情。謝謝。

回答

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條款,並在每次從事件日誌中提取記錄時間整個事情,你應該通過在您之前閱讀的最新記錄的日期和時間。

希望這會有所幫助。

0

TBH,我不知道我是否正確理解問題,但可以使用類似下面的代碼來檢查源是否存在,並創建它,如果不是?

if (-not([System.Diagnostics.EventLog]::SourceExists($source))) { 
    ## Write-Host "$source does not exist. Creating new one" 
    [System.Diagnostics.EventLog]::CreateEventSource($source,$logname)  
} 
+0

這可能適用於我打算處理的另一件事,但是,我更新了這個問題,所以希望它更容易閱讀。謝謝 – ShadowM82