2013-04-11 4 views
1

Windows 7의 특정 이벤트를 기다리는 스크립트를 powershell에 작성했습니다. 보안 로그에 이벤트 ID 4776이 있습니다. 컴퓨터가 잠길 때 스크립트가 실행됩니다.Powershell에서 특정 이벤트를 기다리는 중

스크립트는 유휴 상태, 본질적으로 while (true) 루프에서 실행되어야하며 이벤트의 "실패한 감사"가 발생할 때까지 대기합니다. 이벤트가 발생하면 카운터에 이벤트가 추가됩니다. "Success Audit"상태에서 이벤트가 발생하면 루프에서 빠져 나와 스크립트로 완료됩니다.

내 초기 아이디어는 이벤트의 날짜를 가지고 실행 시간의 날짜 비교하는 그것은, 다음 등

내가 지금까지이 일치하는 경우 :

$i=0 
while(true){  
    $date = Get-Date -format G 
    $eventtime_fail=Get-EventLog Security | ? {$_.EventId -eq 4776} | where {$_.entrytype -eq "FailureAudit"} | Select-Object -expand TimeGenerated | Select -first 1 
    $eventtime_success=Get-EventLog Security | ? {$_.EventId -eq 4776} | where {$_.entrytype -eq "SuccessAudit"} | Select-Object -expand TimeGenerated | Select -first 1 

    if($date -eq $eventtime_fail){ 
     $i++ 
    } 
    else if($date -eq $eventtime_success){ 
      break 
    } 
} 

I을 그냥 예약 된 작업을 만들어서 끝낼 수는 있지만 실제로는 독립 실행 형이어야한다고 생각합니다. 이 스크립트는 컴퓨터가 잠기면 실행되고 컴퓨터가 잠금 해제되면 실행을 중지합니다.

Windows XP에서는 스크립트가 이벤트가 발생하기를 기다렸다가 일종의 명령을 실행하는 방법이있었습니다.이 스크립트는 eventtriggers.exe라고하며, Vista가 나왔을 때 제거되었습니다. 예약 된 작업이이를 대체했지만 예약 된 작업은 powershell 스크립트를 통해 동일한 방식으로 작동하지 않습니다.

어쨌든 내가하고있는 것 외에 다른 방법을 사용하고 있습니까? eventtriggers.exe를 다시 가져 오거나 최소한 비슷한 것을 가져올 방법이 있습니까? 내 유일한 희망 인 StackOverflow의 사람들을 도와주세요.

+0

컴퓨터가 잠길 때 스크립트가 실행되도록 예약하거나 다른 스크립트를 예약 할 수 있습니다. 그게 "독립형"으로 간주 될까요? 최소한 예약 된 작업을 구성하지 않아도됩니다. 'while (true)'루프에서 지금하고있는 방식은 많은 낭비되는 사이클을 의미합니다. –

+0

그게 사실이야. 그러나 지금까지이 스크립트의 주요 관심사는 이벤트 자체입니다. 실시간으로 이벤트를 확인하려면 어떻게합니까? 컴퓨터를 잠근 다음 잘못된 암호를 입력하면 스크립트가 그에 응답해야합니다. 하지만 내 관심사는 방법이다. 그래서 나는 시간 대 사건의 시간을 사용하여 그것을하려고 노력했다. – ShadowM82

답변

1

나는 테스트하지 않았지만 imo가 작동해야합니다. 이벤트 로그 리스너를 작성하십시오.

$seclog = Get-EventLog -List | Where-Object {$_.Log -eq 'Security'} 
Register-ObjectEvent -InputObject $seclog -SourceIdentifier NewEventLogEntry -EventName EntryWritten -Action { 

    $entry = $event.SourceEventArgs.Entry 

    if($entry.EventID -eq 4776) 
    { 
     if($entry.EntryType -eq 'SuccessAudit') 
     { 
      'code for SuccessAudit' 
     } 
     elseif($entry.EntryType -eq 'FailureAudit') 
     { 
      'code for FailureAudit' 
     } 
    } 
} 
+0

굉장합니다. 그래서 이것은 작동합니다. 이제 모든 스크립트/프로젝트와 마찬가지로 오류가 하나 더 생겼습니다. 미안하지만 이것은 Powershell을 사용하여 처음으로, 그래서 내 comments 댓글을 준비. 'while ($ true) {[your code here] \t }' "Success Audit"이 발견되면 중단하도록 루프를 설정합니다. 그러나 "Register-ObjectEvent"가 루프에 있기 때문에 PowerShell은 객체가 이미 생성되었다는 오류를 표시합니다. 루프를 포함하면 끝 부분의 오류를 제외하고는 잘 실행됩니다. 내가 그것을 제외 할 때, 아무것도. – ShadowM82

+0

새 이벤트가 기록 될 때 리스너가 호출 할 때 while 루프를 추가해야하는 이유는 무엇입니까? –

+0

그럼 'FailureAudits'의 mutilple 인스턴스를 잡으려면이 스크립트가 필요합니다. while 루프를 제거하면 스크립트가 실행될 때 아무 일도 일어나지 않습니다. 그러나 무한 while 루프 ('SuccessAudit'이 발생하면 중단되는)에서 스크립트를 실행하면 스크립트가 제대로 실행됩니다."SuccessAudit"에서 powershell 프롬프트가 빨간색으로 표시됩니다. ** Register-ObjectEvent : 이벤트를 구독 할 수 없습니다. 소스 식별자가 'NewEventLogEnter'인 구독자가 이미 있습니다. ** – ShadowM82

관련 문제