我(管理员)如何在 Windows 2008 R2 远程桌面服务上使用 powershell 在另一个用户会话中正常关闭 window 进程 运行

How do I (administrator) gracefully close a window process running in another user session using powershell on Windows 2008 R2 Remote Desktop Services

如果我 运行 在我的会话中执行以下命令...

(Get-Process -Id $pid).CloseMainWindow()

我能够优雅地关闭进程(不会出现模态 windows 或其他弹出窗口)。

但是,如果 pid 在同一台机器上的另一个用户会话中 (运行ning RDS),则进程不会关闭,并且 CloseMainWindow() returns FALSE(它 returns TRUE 如果它在我自己的会话中 运行ning)。如果我 运行 来自其他用户会话的 powershell,它也有效。

我特别需要一种方法 优雅地 关闭该程序,因为该程序需要一些重要的清理操作来保持其数据库有序。所以停止进程或 process.kill() 将不起作用。

经过长时间的研究,似乎不可能做到这一点。但是,有一个解决方案至少满足 一些 我的要求。

您可以创建一个 Windows 在会话 断开连接 时触发的计划任务。这允许您 运行 清理作业 作为用户 ,而不是作为管理员,这允许程序正常退出。

它有两个主要缺点....

  1. 即使用户只是有一个轻微的网络中断也会被调用(所以你必须在脚本中构建一个 wait() 函数来休眠一下,然后检查它是否仍然断开连接- 不是一个干净的解决方案。

  2. 它不会在 log-off 事件期间调用。为此,您需要使用由 GPO 触发的注销脚本。

希望这对以后的人有所帮助。