gpt4 book ai didi

c# - 启动远程桌面客户端。无法控制 PID 终止。启动后 PID 发生变化...WTF?

转载 作者:太空宇宙 更新时间:2023-11-03 22:21:03 25 4
gpt4 key购买 nike

我正在编写一个程序(C# Windows 窗体中的 Visual Studio 2010)跟踪远程桌面客户端的多个实例(mstsc.exe - 使用 Windows 7 版本测试)。我一直在尝试启动该程序并使用以下代码获取其 PID:

Process mstsc = Process.Start(mstscLocation, mstscConString);
int mstscProcessId = mstsc.Id;
DataRow row = openConn.NewRow();
row["RDP ID"] = mstscID;
openConn.Rows.Add(row);

这将启动客户端并返回一个 ID。问题是,如果我尝试使用以下代码终止 PID,它会失败:

int rdpID = Convert.ToInt32(dgvOpenConnections.Rows[selectedIndex].Cells["RDP ID"].Value.ToString());

try
{
// kill off mstsc
Process mstsc = Process.GetProcessById(rdpID);
mstsc.Kill();
}

我已验证从 Process.Start 记录的 PID 与从 DataGridView (dgvOpenConnections) 检索并放入 rpdID 的 PID 相同(尝试失败并命中 catch,因为原始 PID 不再存在)。此外,我在启动 MSTSC.EXE 的一个实例后在命令提示符下发出了一个“任务列表”,并且可以验证它是否更改了 PID(在此测试中,C# 记录了 4288,但任务列表显示它以 8172 运行)。

我无法杀死所有 MSTSC 进程,因为我试图控制多个进程。有没有办法追踪 MSTSC 似乎使用的第二个 PID?我的猜测是它要么启动第二个进程并摆脱第一个进程,要么这是一个子进程(尽管返回的 PID 在启动后不再存在)。

在 C# 中,如何确保我有正确的进程 ID 以便稍后监视或终止远程桌面客户端的特定实例?

最佳答案

如果您尝试在 64 位 Windows 中从 32 位应用程序运行 mstsc,就会发生这种情况。

(来源:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/22c10140-a502-4aa1-98d3-3607b8b573e8/)

在 64 位 Windows 上有两个版本的 mstsc:

  1. c:\windows\system32\mstsc.exe64位版本
  2. c:\windows\syswow64\mstsc.exe 或多或少是一个“重定向”,它将从 c:\windows\system32\mstsc.exe 打开与您的申请流程不同。

我遇到了同样的问题。我的应用程序启动了 mstsc,该进程立即退出,并且 mstsc 以不同的父进程和不同的 PID 重新出现。

发生这种情况是因为 64 位 Windows 使用文件系统重定向将对 64 位 c:\windows\system32 可执行文件的调用重定向到 c:\windows\syswow64 .

有两种解决方法:

  1. 重新编译您的应用程序为 64 位。那么您的应用程序也将使用 64 位 mstsc。
  2. 禁用文件系统重定向(参见 http://blog.tonycamilli.com/2005/07/disabling-wow64-file-system.html )并从您的 32 位应用程序访问 64 位 mstsc。

我只试过重新编译,它成功了。 :-)

编辑:如果您不希望您的用户使用正确的版本(我们正在使用 ClickOnce 部署,所以我们宁愿向每个人发送一个链接),这里有一个解决方法:

如果您正在为 mstsc 使用 .RDP 文件,只需在您的文件名中添加一个唯一标记。 mstsc 将通过类似 mstsc host_user_token.rdp 的命令行启动。

现在,在您调用 Process.Start 之后,执行 Process.WaitForExit 并短暂超时(5 秒)。如果进程没有退出,则您拥有正确的对象。

如果进程确实退出,执行一个小的轮询循环(100 毫秒间隔,5 秒超时)来检查进程是否有您的 token :

var timeout = AppSettings.GetIntValue(
Constants.SettingsKeyProcessFinderTimeout, Constants.ProcessFinderTimeoutDefault);
int elapsedTime = 0;
Process process = null;
while (elapsedTime <= timeout)
{
process =
Process.GetProcessesByName("mstsc").FirstOrDefault(p => p.StartInfo.Arguments.Contains(guid));
Logger.TraceVerbose(
string.Format(
"Elapsed time: {0}; Found process with PID {1}", elapsedTime, process == null ? -1 : process.Id));
if (process != null)
{
break;
}

Thread.Sleep(SleepInterval);
elapsedTime += SleepInterval;
}

在该循环之后,如果您仍然有 process == null,则说明出现了一些错误(未找到进程或根本未执行进程)。如果您有流程引用,那就是"new"mstsc 流程。

关于c# - 启动远程桌面客户端。无法控制 PID 终止。启动后 PID 发生变化...WTF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3101392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com