Click here to Skip to main content
14,390,171 members
Rate this:
Please Sign up or sign in to vote.
See more:
I'm using the following code to kill a remote desktop session and the application running in it. It works fine, the only problem is that it kills the specified server of the application for all users.

How do I keep this to just the local machine running a session?

We have multiple users logging in and running this application from a server on their local machines. Most are running using work resources, but some use remote desktop.

No matter how they are logged in when I run my code all users loose their sessions.

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();
    }


What I have tried:

I have tried the above code and tried changing the scope of the query.

Also posted this on Stack Overflow, with no response.
Posted
Updated 19-May-19 6:38am
v3
Comments
Richard MacCutchan 19-May-19 7:28am
   
Don't use TaskKill as it may affect connected processes. You should use a graceful exit that allows the remote application to continue when a client disconnects.
#realJSOP 19-May-19 10:11am
   
If you kill the app, why would you expect any other outcome?
jrdnoland 19-May-19 11:13am
   
What I'm trying to do is stop the application and also stop the remote desktop session for that local client. Are you telling me that is impossible?
Dave Kreskowiak 19-May-19 13:24pm
   
There is no way for your code to determine which process is local and which is ruining from a remote session, which is still local to the server!

Killing processes is not the way to go.

1 solution

Rate this:
Please Sign up or sign in to vote.

Solution 1

You're testing switches we can't see; and show a bunch of UI stuff not related to "killing a process".

I suggest you stick to actually killing just what you want "explicitly" (using "hard code"), then make it generic with all the selection gyrations ... once you have the actually killing figured out.


if (chkCloseLabware.Checked == true)
{
if (chkExit.Checked == true)
{
KillLabWare();
Close();
}
else
{
KillLabWare();
}
}
   
Comments
phil.o 19-May-19 11:53am
   
Please, use pre tags when presenting code :)

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)




CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100