2012-06-10 3 views
1

전 PS에 완전히 익숙하지 않아 스크립트가 발견되면 Foo라고하는 방법을 생각해 냈습니다. (ps1 | pl | py | bar) 실행을 시작하여 해당 이벤트에 대한 powershell 스크립트를 실행할 수 있습니다. 나는 MSDN에서 다음 예제를 사용하여 시작했고 PS 실행을 제외한 모든 것을 필터링하기 위해 if 문을 추가했습니다. 파워 쉘 인스턴스가 시작될 때스크립트가 실행되기 시작할 때 Register-WmiEvent를 사용하여

$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 

이제 코드 탐지,하지만 난에 액세스하고 인스턴스에 전달 된 인수를 필터링 할 수있는 방법을 발견하지 않았습니다. Foo 스크립트에 대해 다른 PS 스크립트가 아닌 조치 만 취하도록하고 싶습니다. 시작된 powershell 프로세스에 대한 인수에 액세스 할 수있는 방법이 있습니까?

답변

6

이 사용 해보세요, 당신은 새로운 프로세스의 명령 줄 속성에 대해 스크립트를 일치하도록 시도 할 수 있습니다 :

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 

UPDATE 여기
만 powershell.exe를 프로세스 생성을 캡처 업데이트 코드 (의 쿼리 수준에서) 명령 줄 값을 텍스트 파일에 씁니다. 필자는 cmd로 작성된 모든 powershell 프로세스 생성물을 파일에 기록했습니다.

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

+1 멋진 시작입니다. 그러나 어떤 이유로이 방법이 때로는 효과가있는 것처럼 보이지만 언제나 그런 것은 아닙니다. 나는 ps 스크립트를 호출하는 몇 가지 다른 방법을 시도했지만 여전히 매번 작동하지 않는다. 여기에 뭔가 빠졌는지 알아 내려고 :/ – Teletha

+0

"Windows Management Instrumentation Tester"를 사용하면 cmd가 실행될 때마다 항상 cmd.exe에서 생성 된 프로세스가있는 것처럼 보입니다. – Teletha

+0

나는 무엇이 잘못되었는지 잘 모릅니다. 새로운 powershell 콘솔을 열고 wmi 이벤트를 등록한 다음 cmd.exe를 열고 다음 두 명령을 차례로 실행했습니다. powershell -command "& {d : \ Scripts \ hello.ps1}"및 "powershell -file d : \ Scripts \ hello.ps1 "을 입력하십시오. 두 명령 모두 포착되고 powershell 콘솔에 기록됩니다. –

관련 문제