.NET - 您可以在流程启动后更改流程的参数吗?

时间:2017-06-05 19:08:15

标签: .net powershell winapi

最终目标是更改PowerShell.exe的进程参数以将EnableRaisingEvents设置为$ true,以便在脚本终止时/我可以捕获退出事件。

我能找到的所有示例都是首先在新的流程对象上设置属性,然后使用start方法进行programmticaly生成,但我想知道是否可以修改现有流程来完成此操作? ...就像内联更新?

如果它可以在.NET中使用,那么很简单但如果我需要使用p / invoke下载到WinAPI,如果有人知道库/函数,我也可以解决这个问题。 THX。

1 个答案:

答案 0 :(得分:3)

EnableRaisingEventsSystem.Diagnostics.Process实例的属性,而不是实际的底层操作系统进程,无论底层进程是否已在运行,您都可以轻松修改它:

$process = Start-Process notepad -PassThru

# Change EnableRaisingEvents flag after process start
$process.EnableRaisingEvents = $true

# Now the Process instance can raise the Exited event
Register-ObjectEvent -InputObject $process -EventName Exited -SourceIdentifier notepadExited -Action {
    Write-Host "Notepad exited" -ForegroundColor Red
}
$process.Kill()

如果您需要监控自己没有启动的已经运行的进程,可以使用Win32_ProcessStopTrace WMI事件类:

# Using Start-Process for this example, but could be any existing process
$process = Start-Process notepad -PassThru

# Use the query to filter events raised based on process ID
$eventQuery = "SELECT ProcessName,ExitStatus FROM Win32_ProcessStopTrace WHERE ProcessId = $($process.Id)"

# Register WMI Event listener
Register-WmiEvent -Query $eventQuery -Action {
    $traceEvent = $Event.SourceEventArgs.NewEvent
    Write-Host "$($traceEvent.ProcessName) exited with status code: $($traceEvent.ExitStatus)"
} -SourceIdentifier notepadExited
$process.Kill()