如何禁用在RDP(终端服务)上运行的应用程序的多个实例?

时间:2018-10-16 19:17:58

标签: c# .net wpf rdp terminal-services

我有一个c#/ WPF应用程序,该应用程序在某些客户端站点上是通过RPD运行的,即该应用程序驻留在客户端服务器上,并且用户可以通过终端服务会话进行访问。

我遇到的问题是我无法防止意外打开应用程序的多个实例。当应用程序在计算机上本地运行时,我可以使用以下命令阻止多个实例:

var processName = Process.GetCurrentProcess().ProcessName;   
                if (Process.GetProcesses().Count(p => p.ProcessName.Equals(processName)) > 1)
                {
                    this.Log.LogInfo(this.GetType(), "Process already running. Shutting down.");
                    Application.Current.Shutdown();
                    Process.GetCurrentProcess().Kill();
                }    

但是,在RPP上这将不起作用,因为应用程序的其他实例可能在不同的RDP会话上运行。

有人知道如何禁用在同一RDP会话中运行的第二个应用程序实例吗?



2 个答案:

答案 0 :(得分:1)

过去,我是使用Mutex完成此操作的。创建互斥锁时,可以使用命名约定 Global \\ MutexName 处理终端服务方案。

// declare in your program
private static Mutex mutex = null;

bool createdNew;  
mutex = new Mutex(true, "Global\\MutexName", out createdNew); 

if (!createdNew)
{
    // Application is already running, so shutdown
    Application.Current.Shutdown();     
}

答案 1 :(得分:0)

我想每个远程连接都来自另一个用户。您可以使用以下内容确定谁是进程的所有者:How do I determine the owner of a process in C#?