전 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 프로세스에 대한 인수에 액세스 할 수있는 방법이 있습니까?
+1 멋진 시작입니다. 그러나 어떤 이유로이 방법이 때로는 효과가있는 것처럼 보이지만 언제나 그런 것은 아닙니다. 나는 ps 스크립트를 호출하는 몇 가지 다른 방법을 시도했지만 여전히 매번 작동하지 않는다. 여기에 뭔가 빠졌는지 알아 내려고 :/ – Teletha
"Windows Management Instrumentation Tester"를 사용하면 cmd가 실행될 때마다 항상 cmd.exe에서 생성 된 프로세스가있는 것처럼 보입니다. – Teletha
나는 무엇이 잘못되었는지 잘 모릅니다. 새로운 powershell 콘솔을 열고 wmi 이벤트를 등록한 다음 cmd.exe를 열고 다음 두 명령을 차례로 실행했습니다. powershell -command "& {d : \ Scripts \ hello.ps1}"및 "powershell -file d : \ Scripts \ hello.ps1 "을 입력하십시오. 두 명령 모두 포착되고 powershell 콘솔에 기록됩니다. –