Как отключиться только от локального удаленного приложения, во-вторых, как выйти из приложения только на локальном удаленном рабочем столе?
Я использую следующий код, чтобы убить сеанс удаленного рабочего стола и запущенное в нем приложение. Он работает нормально, единственная проблема заключается в том, что он убивает указанный сервер приложения для всех пользователей.
Как мне сохранить это только на локальном компьютере, на котором выполняется сеанс?
У нас есть несколько пользователей, которые входят в систему и запускают это приложение с сервера на своих локальных машинах. Большинство из них работают с использованием рабочих ресурсов, но некоторые используют удаленный рабочий стол.
Независимо от того, как они вошли в систему, когда я запускаю свой код, все пользователи теряют свои сеансы.
private void btnCloseSession_Click(object sender, EventArgs e) { if (!runningExclusiveProcess) { runningExclusiveProcess = true; btnCloseSession.Enabled = false; //check and close Labware if running if (chkCloseLabware.Checked == true) { if (chkExit.Checked == true) { KillLabWare(); Close(); } else { KillLabWare(); } } Process[] my = Process.GetProcessesByName("mstsc"); //loop thru list to get selected item(s) ListBox.SelectedObjectCollection selectedItems = new ListBox.SelectedObjectCollection(lstOpenSessions); selectedItems = lstOpenSessions.SelectedItems; try { //remove credentials string szTestx = "/delete:XXXX.NET/" + cboServer.Text; ProcessStartInfo infox = new ProcessStartInfo("cmdkey.exe", szTestx); Process procx = new Process(); procx.StartInfo = infox; procx.Start(); if (lstOpenSessions.SelectedIndex != -1) { for (int i = selectedItems.Count - 1; i >= 0; i--) { //loop thru process to match process vs. list selection(s) foreach (Process remote in my) { if (remote.MainWindowTitle == selectedItems[i].ToString()) { KillRS(remote.MainWindowTitle); lstOpenSessions.Items.Remove(selectedItems[i]); } } if (lstOpenSessions.Items.Contains(selectedItems[i].ToString())) { lstOpenSessions.Items.Remove(selectedItems[i]); } } } } catch (Exception ex) { Console.WriteLine("{0} Exception caught.", ex); } // If your task is synchronous, then undo your flag here: runningExclusiveProcess = false; btnCloseSession.Enabled = true; } } public void KillLabWare() { ConnectionOptions con = new ConnectionOptions(); con.Username = cboUserName.Text; con.Password = txtPassWord.Text; string strIPAddress = cboServer.Text; ManagementScope scope = new ManagementScope(@"\\" + strIPAddress + @"\root\cimv2", con); scope.Connect(); ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Process WHERE Name='Labware.exe'"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); ManagementObjectCollection objectCollection = searcher.Get(); foreach (ManagementObject managementObject in objectCollection) { managementObject.InvokeMethod("Terminate", null); } } private void KillRS(string rwt) { foreach (Process p in Process.GetProcesses()) { if (p.MainWindowTitle == rwt) { p.Kill(); } } } public static void KillRemoteProcess(Process p, string user, string password) { new Process { StartInfo = new ProcessStartInfo { FileName = "TaskKill.exe", Arguments = string.Format("/pid {0} /s {1} /u {2} /p {3}", p.Id, p.MachineName, user, password), WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true } }.Start(); }
Что я уже пробовал:
Я попробовал приведенный выше код и попытался изменить область действия запроса.
Также опубликовал это на Stack Overflow, без ответа.
Richard MacCutchan
Не используйте TaskKill, так как это может повлиять на связанные процессы. Вы должны использовать изящный выход, который позволяет удаленному приложению продолжать работу, когда клиент отключается.
#realJSOP
Если вы убьете приложение, почему вы ожидаете какого-то другого результата?
jrdnoland
Я пытаюсь остановить приложение, а также сеанс удаленного рабочего стола для этого локального клиента. Вы хотите сказать, что это невозможно?
Dave Kreskowiak
Ваш код никак не может определить, какой процесс является локальным, а какой разрушается из удаленного сеанса, который все еще является локальным для сервера!
Процессы убийства - это не тот путь, по которому нужно идти.