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

C# 多个Windows用户帐户上的一个实例应用程序,c#,.net,vb.net,mutex,user-accounts,C#,.net,Vb.net,Mutex,User Accounts,我使用了互斥的解决方案来禁止同时打开我的应用程序的多个实例 但是,当我在windows中使用Switch User并打开另一个用户并尝试打开应用程序时,它会正常打开,无法检测到它正在其他帐户上运行 我如何解决这样的问题,并禁止在登录的Windows用户帐户中打开应用程序 我正在使用这样的代码 Dim onlyInstance As Boolean = False _mutex = New Mutex(True, "Application Name", onlyInstance) If Not o

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

但是,当我在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

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


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

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

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

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


我已经使用了30年的技术是,只要让应用程序在启动时尝试打开(并保持打开)一个已知文件以进行独占访问,然后在无法打开该文件时退出


我知道它的技术含量很低,而且很复古,但它很简单,总是得到支持,在任何地方都能正常工作。我已经成功地将它应用于超过六个操作系统和十几种不同编程语言的生产代码中,它使用互斥来建立唯一性,但也使用WCF来允许新实例与主实例通信。

这实际上与海报所要求的相反