我正在編寫一個程序(C#Windows窗體中的Visual Studio 2010),用於跟蹤遠程桌面客戶端的多個實例(mstsc.exe - 經過Windows 7版本測試)。我一直在嘗試啓動該程序,並用以下代碼獲取其PID:啓動遠程桌面客戶端。無法控制PID殺死。開始後PID改變... WTF?
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不再存在)。此外,我在啓動MSTSC.EXE的一個實例後,在命令提示符下發出了一個「任務列表」,並且可以驗證它是否改變了PID(在此測試中,C#記錄了4288,但tasklist顯示它運行的是8172)。
我不能殺死所有MSTSC進程,因爲我試圖控制多個進程。有沒有辦法跟蹤第二個PID MSTSC似乎使用?我的猜測是要麼開始第二個進程,擺脫第一個或者這可能是一個子進程(雖然啓動後返回的PID不再存在)。
如何在C#中確保我有正確的進程ID,以便稍後監視或終止遠程桌面客戶端的特定實例?
什麼版本的Windows?如果那不是問題,我做錯了什麼?我知道我正在轉換int> string> int,但所有調試看起來都是正確的。我在c:\ windows \ system32版本6.1.7600.16385(日期爲7/13/2009)上的Windows 7(64位操作系統)上使用mstsc.exe。關於複製應用程序+從XP的DLL ...打賭它會工作。我會仔細檢查我的代碼,以確保它! – 2010-06-23 14:53:39
我自己使用Windows 7 x64 6.1.7600,mstsc.exe是版本6.1.7600.16385,日期爲7/14/2009(UTC)。我敢肯定還有其他的錯誤。你的代碼似乎沒有做錯什麼。 – ErikHeemskerk 2010-06-23 15:06:08