如何仅针对本地计算机终止远程桌面会话

4

我正在使用以下代码关闭远程桌面会话以及其中运行的应用程序。它可以正常工作,唯一的问题是会关闭所有用户的特定应用程序。

如何仅限于在本地运行会话的计算机上进行操作?

我们有多个用户从服务器登录并在其本地计算机上运行此应用程序。大多数使用工作资源运行,但有些使用远程桌面。

无论他们如何登录,当我运行我的代码时,所有用户都会失去会话。

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

我只是不知道如何修改这段代码,让它告诉它仅断开与我的本地远程桌面的连接? - jrdnoland
我仍在努力弄清楚这个问题,有没有人知道如何杀掉本地应用程序/会话而不杀死所有会话? - jrdnoland
2个回答

1
听起来你想强制让特定用户注销?这是因为你发现用户忘记注销并不断消耗许可证吗?
LabWare应用程序允许在每个用户上设置一个超时时间间隔(以分钟为单位),在此间隔过去后,用户将被注销(许可证不再消耗)。有关更多信息,请参见LabWare 7技术手册的第204页。
或者,如果这是针对调度程序(服务或集群实例)会话,则也可以通过应用程序进行控制。您可以手动更改Services表上的实例记录上的关闭和保持活动标志(如果使用Service Manager),或者编写LIMS Basic事件触发器/自动化脚本或计划的子程序(或将其作为Visual工作流程上的按钮)来执行此操作。
希望对你有所帮助。

1
如果您打算宣传您的产品,您需要披露与该产品的关系。 - Scott Chamberlain
嗨,斯科特!我不确定我会称之为广告?- 我检查了提供的代码,问题明确涉及LabWare.exe。正如您可以从我的个人资料中看到的那样,我是LabWare Australia的实施顾问。 - Jade Charles

0
如果您想要终止远程桌面会话或断开当前的 RDP 会话,请阅读本文:WTSDisconnectSession function
但是,如果您注销当前用户,也会断开 RDP 会话,以下是代码:
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;

class Program
{
  [DllImport("wtsapi32.dll", SetLastError = true)]
  static extern bool WTSDisconnectSession(IntPtr hServer, int sessionId, bool bWait);

  const int WTS_CURRENT_SESSION = -1;
  static readonly IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;

  static void Main(string[] args)
  {
    if (!WTSDisconnectSession(WTS_CURRENT_SERVER_HANDLE,
         WTS_CURRENT_SESSION, false))
      throw new Win32Exception();
  }
}

希望它能正常工作,如需更多信息请随时联系,欢迎评论
祝编码愉快


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接