我是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进程的参数?
答案 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
}