使用Register-WmiEvent在脚本开始执行时通知

时间:2012-06-10 14:50:56

标签: powershell wmi powershell-v2.0

我是PS的新手,我一直试图想出一种方法来检测一个脚本,比如Foo。(ps1 | pl | py | bar)开始执行,这样我就可以运行一个PowerShell脚本在那件事上。我开始使用MSDN中的以下示例,我添加了一个if语句来过滤除PS执行之外的所有内容。

$Query = 'SELECT * FROM Win32_ProcessStartTrace'            
$action = {            
    $e = $Event.SourceEventArgs.NewEvent 
    if($e.ProcessName -eq "powershell.exe") {           
        $fmt = 'ProcessStarted: (ID={0,5}, Parent={1,5}, Time={2,20}, Name="{3}")'            
        $msg = $fmt -f $e.ProcessId, $e.ParentProcessId, $event.TimeGenerated, $e.ProcessName            
        Write-host -ForegroundColor Red $msg            
    }
}            
Register-WmiEvent -Query $Query -SourceIdentifier ProcessStart -Action $Action  

代码现在检测powershell实例何时启动,但我没有找到一种方法来访问和过滤传递给实例的参数。我想确保我只对Foo脚本采取行动而不是任何其他PS脚本。有没有办法访问已启动的PowerShell进程的参数?

1 个答案:

答案 0 :(得分:6)

尝试一下,您可以尝试将脚本与新进程的CommandLine属性匹配:

Register-WmiEvent -Query "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance isa 'Win32_Process'" -SourceIdentifier NewPSProcess -Action {
    $e = $EventArgs.NewEvent.TargetInstance
    if($e.Name -eq 'powershell.exe')
    {
        #if($e.CommandLine -match 'yourScript') { ... }
        Write-host $e.CommandLine
    }
}

sleep 5
powershell -file c:\test.ps1

<强>更新
这是一个更新代码,仅捕获powershell.exe进程创建(在查询级别上)并将commandLine值写入文本文件。我能够查看写入文件的所有powershell进程创建(由cmd创建)。

$query = 'Select * From __InstanceCreationEvent Within 2 Where TargetInstance Isa "Win32_Process" And TargetInstance.Name = "powershell.exe"'
Register-WMIEvent -Query $query -SourceIdentifier NewPSProcess -Action {
   $EventArgs.NewEvent.TargetInstance.CommandLine | Out-File D:\scripts\temp\psevent.txt -Append
}