1

私は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 インスタンスがいつ開始されたかを検出するようになりましたが、インスタンスに渡された引数にアクセスしてフィルター処理する方法が見つかりませんでした。他の PS スクリプトではなく、Foo スクリプトに対してのみアクションを実行するようにしたいと思います。開始された powershell プロセスの引数にアクセスする方法はありますか?

4

1 に答える 1

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
}
于 2012-06-10T15:45:59.270 に答える