获取进程的所有者,向他们发送消息框,然后终止进程

Get a process's owners, send them messagebox and then kill the processes

我试图获取一个用户列表,他们是 运行 一个应用程序,例如 chrome.exe。然后向他们发送一条消息并将倒数计时器设置为 300 秒,之后我需要停止这些进程。我尝试了以下 PowerShell.

$owners = @{} 
gwmi win32_process | % {
    $owners[$_.handle] = $_.getowner().user
}
get-process | select processname,Id,@{l="Owner";e={$owners[$_.id.tostring()]}}

答案已关闭。下面你可以看到一个解决方案:

$USERLIST = (Get-WmiObject -Class Win32_Process -Filter "Name='tsappldr.exe'" -ComputerName "SRUS270137C").getowner().user
ForEach ($computer in $USERLIST) {
$CmdMessage = {C:\windows\system32\msg.exe   $computer  /v 'Cancel your session'} $CmdMessage | Invoke-Expression 
}
Start-Sleep -m 5  #time-out for 5 minutes

get-process tsappldr, tpedrte  | stop-process -force

使用此代码您可以获得进程所有者

$(Get-WmiObject -Class Win32_Process -Filter "Name='chrome.exe'" -ComputerName client).GetOwner()

使用此代码,您可以显示一个消息框。

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[System.Windows.Forms.MessageBox]::Show("Message")

并且使用 Stop-process 可以终止进程

当你的代码有一些错误时post在这里,我会尽力帮助

Chrome 即使只打开一个选项卡,通常也会启动多个进程。您需要 select 唯一的用户名以避免出现多个弹出消息。您可以使用:

(Get-WmiObject -Class Win32_Process -Filter "Name='chrome.exe'" -ComputerName "TargetPCName").getowner().user|select -Unique

你能提供更多关于你的场景的信息吗?

感谢所有帮助过我的人,所以我写下了当前代码:

$USERLIST = (Get-WmiObject -Class Win32_Process -Filter "Name='tsappldr.exe'" -ComputerName "SRUS270137C").getowner().user
ForEach ($computer in $USERLIST) {
$CmdMessage = {C:\windows\system32\msg.exe   $computer  /v 'Cancel your session'} $CmdMessage | Invoke-Expression 
}
Start-Sleep -m 5  #time-out for 5 minutes

get-process tsappldr, tpedrte  | stop-process -force

它工作正常!