C#如何在关闭窗体时终止RDP后台进程 断开远程桌面连接
实现方案
你现有代码首先存在一个隐性问题:凭证写入命令cmdkey没有实际执行,你给同一个Process对象连续赋值FileName属性,直接覆盖了之前的cmdkey配置,导致凭证没有写入系统,启动RDP时还会提示输入密码,先修复这部分问题,再实现关闭窗体自动杀RDP进程的逻辑即可。
1. 全局声明RDP进程变量
在你的窗体类内部声明一个Process类型的全局变量,用来存储你启动的RDP进程实例,避免局部变量在方法执行完后无法被访问:
// 写在窗体类的成员位置,不要放在按钮点击方法内部 private Process _rdpProcess; private string _currentRdpIp; // 可选,存当前连接的IP,方便后续删凭证/匹配进程
2. 修正RDP启动逻辑
单独执行cmdkey凭证写入,等待完成后再启动RDP进程,将进程实例赋值给全局变量:
// 写入RDP凭证 Process cmdkeyProcess = new Process(); cmdkeyProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"); cmdkeyProcess.StartInfo.Arguments = $"/generic:TERMSRV/{ipaddressbox.Text} /user:{usernamebox.Text} /pass:{passwordbox.Text}"; cmdkeyProcess.StartInfo.CreateNoWindow = true; cmdkeyProcess.StartInfo.UseShellExecute = false; cmdkeyProcess.Start(); cmdkeyProcess.WaitForExit(); // 启动RDP进程,赋值给全局变量 _currentRdpIp = ipaddressbox.Text; _rdpProcess = new Process(); _rdpProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\mstsc.exe"); _rdpProcess.StartInfo.Arguments = $"/v {_currentRdpIp}"; _rdpProcess.Start();
3. 绑定窗体关闭事件,自动销毁RDP进程
给窗体添加FormClosing事件,事件触发时优先销毁你启动的RDP进程,同时可选删除系统中残留的RDP凭证:
private void YourForm_FormClosing(object sender, FormClosingEventArgs e) { // 销毁当前启动的RDP进程 if (_rdpProcess != null && !_rdpProcess.HasExited) { _rdpProcess.Kill(); _rdpProcess.WaitForExit(); _rdpProcess.Dispose(); } // 兼容逻辑:如果全局进程实例丢失,遍历所有mstsc进程匹配当前IP的进程杀掉 foreach (var process in Process.GetProcessesByName("mstsc")) { try { if (process.StartInfo.Arguments.Contains($"/v {_currentRdpIp}")) { process.Kill(); process.WaitForExit(); process.Dispose(); } } catch { // 忽略无权限访问的系统进程即可 } } // 可选:删除残留的RDP凭证,避免留在系统中 Process delCmdkeyProcess = new Process(); delCmdkeyProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"); delCmdkeyProcess.StartInfo.Arguments = $"/delete:TERMSRV/{_currentRdpIp}"; delCmdkeyProcess.StartInfo.CreateNoWindow = true; delCmdkeyProcess.StartInfo.UseShellExecute = false; delCmdkeyProcess.Start(); delCmdkeyProcess.WaitForExit(); }
注意:如果你的程序编译为32位,在64位系统下读取mstsc进程的命令行参数可能会报错,建议把项目目标平台改为x64或者Any CPU即可解决。
内容的提问来源于stack exchange,提问作者badcoder
相关产品推荐
相关产品推荐

