jrdnoland Ответов: 1

Как отключиться только от локального удаленного приложения, во-вторых, как выйти из приложения только на локальном удаленном рабочем столе?


Я использую следующий код, чтобы убить сеанс удаленного рабочего стола и запущенное в нем приложение. Он работает нормально, единственная проблема заключается в том, что он убивает указанный сервер приложения для всех пользователей.

Как мне сохранить это только на локальном компьютере, на котором выполняется сеанс?

У нас есть несколько пользователей, которые входят в систему и запускают это приложение с сервера на своих локальных машинах. Большинство из них работают с использованием рабочих ресурсов, но некоторые используют удаленный рабочий стол.

Независимо от того, как они вошли в систему, когда я запускаю свой код, все пользователи теряют свои сеансы.

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

Ваш код никак не может определить, какой процесс является локальным, а какой разрушается из удаленного сеанса, который все еще является локальным для сервера!

Процессы убийства - это не тот путь, по которому нужно идти.

1 Ответов

Рейтинг:
0

Gerry Schmitz

Вы тестируете переключатели, которые мы не видим; и показываете кучу вещей пользовательского интерфейса, не связанных с "убийством процесса".

Я предлагаю вам придерживаться фактического убийства только того, что вы хотите "явно" (используя "жесткий код"), а затем сделать его универсальным со всеми колебаниями выбора ... как только вы действительно выясните, что такое убийство.


if (chkCloseLabware.Проверено == верно)
{
если (chkExit.Проверено == верно)
{
KillLabWare();
Закрывать();
}
еще
{
KillLabWare();
}
}


phil.o

Пожалуйста, используйте предварительные теги при представлении кода :)