多个Windows用户帐户上的一个实例应用程序

时间:2012-10-15 15:12:54

标签: c# .net vb.net mutex user-accounts

我使用Mutex的解决方案禁止同时打开我的应用程序的多个实例

但是,当我在Windows中使用Switch User并打开另一个用户,并尝试打开该应用程序时,它正常打开并且无法检测到它正在其他帐户上运行

我怎么能解决这样的问题并禁止在登录Windows用户帐户中打开应用程序

我正在使用像这样的代码

Dim onlyInstance As Boolean = False
_mutex = New Mutex(True, "Application Name", onlyInstance)
If Not onlyInstance Then
   MessageBox.Show("Application is already running.", "Error.")
   System.Diagnostics.Process.GetCurrentProcess.Kill()
   System.Diagnostics.Process.GetCurrentProcess.WaitForExit()
End If

4 个答案:

答案 0 :(得分:4)

如果您将互斥锁设为全局互联网,则所有用户都可以看到它:

mutexName = String.Format("Global\\{{{0}}}", "Application Name"); 

来自documentation

  

命名系统互斥锁可以有两个级别的可见性。如果它的名字   以前缀“Global \”开头,互斥锁在所有终端中都可见   服务器会话。如果其名称以前缀“Local”开头,则为   互斥锁仅在终端服务器会话中可见   创建。在这种情况下,可以存在具有相同名称的单独互斥锁   在服务器上的每个其他终端服务器会话中。如果你这样做   在创建命名互斥锁时不指定前缀,它需要   前缀“Local”。在终端服务器会话中,有两个互斥锁   名称的区别仅在于它们的前缀是单独的互斥锁,两者都是   对终端服务器会话中的所有进程可见。那就是   前缀名称“Global”和“Local”描述了互斥锁的范围   相对于终端服务器会话的名称,而不是与进程相关的名称。

答案 1 :(得分:1)

我使用了30年的技术就是让App尝试在启动时打开(并保持打开)已知文件以进行独占访问,然后在无法打开该文件时退出。

我知道它严重低技术和复古,但它很简单,始终受到支持,并且在字面上无处不在。我已经在半打操作系统和十几种不同编程语言的生产代码中成功使用它。

答案 2 :(得分:0)

我不认为其他非管理员用户可以看到其他用户的流程。

我建议编写一个在系统空间中运行的Windows服务。然后,您的程序可以连接到它并确定是否启动。

答案 3 :(得分:0)

看一下this solution for WPF applications,它利用Mutex建立唯一性,但也使用WCF允许新实例与主实例通信。