当前位置: 首页 > 知识库问答 >
问题:

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

巫坚白
2023-03-14

我正在使用以下代码终止远程桌面会话和其中运行的应用程序。它工作正常,唯一的问题是它会为所有用户终止指定的应用程序。

如何让本地机器只运行一个会话?

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

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

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

共有1个答案

景稳
2023-03-14

听起来你是在强迫某个特定用户注销?这是不是因为你发现用户忘记了注销,并且经常使用许可证?

LabWare应用程序允许为每个用户设置一个超时间隔(以分钟为单位),在此间隔过后,用户将注销(不再使用许可证)。有关更多信息,请参阅《LabWare 7技术手册》第204页。

Alternativley如果这是针对调度程序(服务或集群实例)会话的,那么它也可以由应用程序控制。您可以手动更改Services表上实例记录上的shutdown和keep alive标志(如果使用Service Manager),也可以编写LIMS基本事件触发器/自动化脚本或计划的子例程(或者将其作为可视化工作流上的按钮)来执行此操作。

嗯。

 类似资料:
  • 问题内容: 我需要在远程服务器上执行数据库的mysqldump,但该服务器未安装mysqldump。我想在我的机器上使用mysqldump连接到远程数据库并在我的机器上进行转储。 我试图创建一个ssh隧道,然后进行转储,但这似乎不起作用。我试过了: 隧道创建成功。如果我做 我得到一些显示正确服务器mysql版本的内容。但是,执行以下操作似乎尝试在本地连接 问题答案: 正如我在serverfault

  • 问题内容: 我将开发环境设置为vmware中的Ubuntu服务器(安装了LAMP)。vmware在我的本地Windows 7计算机上运行。当我尝试通过HeidiSQL程序访问我的mysql服务器时,连接失败。我得到: 但是,我可以通过PhpMyAdmin访问数据库服务器。MySQL正在运行,我的连接凭据和端口均正确。 我读到您应该输入要连接的计算机的IP地址,作为my.cnf文件中的“绑定地址”。

  • 问题内容: 我正在制作一个对等即时消息传递应用程序。 当前,如果UserA.pool.net对UserB.pool.net说“你好”,则用户A看到“你:你好”,而用户B看到“ UserA.pool.net:你好”。 我希望他们不要看到用户A的名称,而是希望他们看到自己计算机的主机名,以便用户A看到与用户B相同的文本。 问题答案: 简短的答案是,如果您 确实 希望用户A和用户B看到相同的文本,则不能

  • 所以有几个网站会为你计算你的链接本地ipv6地址,就像这里的这个。 尽管如此,它并没有给出任何有用的关于这个地址是如何计算的,也没有输入参数是什么。那么,如果一个人知道自己的ipv4地址、子网掩码和网关地址,计算链路本地ipv6地址的过程(或算法)是什么?我正在使用SCTP套接字做一个项目,该项目使用ISATAP网络隧道和LL ipv6地址用于构建ISATAP地址。

  • 问题内容: 我想检查请求url的状态码但获取代码 这是我的代码 堆栈跟踪 问题答案: 我认为,此问题是由Java尝试使用IPV6地址引起的,原因是您的操作系统不支持IPV6地址,或者您的操作系统没有正确设置IPV6地址来处理它。 您可以强制Java使用具有以下属性的IPV4地址: -Djava.net.preferIPv4Stack = true