You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:54:06