1

我正在 powershell 中编写一个脚本,它将等待 Windows 7 中的特定事件。安全日志中的事件 ID 4776。该脚本将在计算机锁定时运行。

该脚本应该在空闲状态下运行,本质上是一个 while(true) 循环,它将等待事件的“审核失败”发生。一旦事件发生,它将向计数器添加一个。一旦事件在“审核成功”状态下发生,它将从循环中中断,从而使用脚本完成。

我最初的想法是获取事件的日期并与运行时间的日期进行比较,如果匹配,则等等。

到目前为止我所拥有的:

$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
     }
}

我意识到我可以简单地创建一个计划任务并完成它,但我真的需要它是独立的。此脚本将在计算机锁定后运行,并在计算机解锁后停止执行。

在 Windows XP 中,有一种方法可以让脚本等待事件发生然后运行某种指令,这正是我所需要的,这被称为 eventtriggers.exe,当 vista 出现并替换计划任务时它被删除但是,计划任务通过 powershell 脚本的工作方式不同。

除了我这样做的方式之外,还有其他方法吗?有没有办法让 eventtriggers.exe 恢复或至少类似的东西?帮助我 StackOverflow 的人,你我唯一的希望。

4

2 回答 2

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'
        }
    }
}
于 2013-04-12T08:08:19.760 回答
0

您可以使用Microsoft 文档SytemEvents中描述的其中一种。

您将在锁定计算机之前或解锁计算机后运行脚本 (Windows 7/Vista/XP)中找到启动和停止脚本的方法。

于 2013-04-12T05:16:55.330 回答