如何确保程序只在Windows Server 2012的所有会话中运行一次?

问题描述:

我在C#中创建了一个系统托盘应用程序,它只是在后台运行。它使用Exchange Web服务监听邮件服务器,并在每次收到邮件时执行一组操作。它使用了大量的Excel应用程序,如果我将程序转换为服务时不能正常工作(这就是为什么它必须是系统应用程序)。如何确保程序只在Windows Server 2012的所有会话中运行一次?

重要的是,程序不会一次运行多次。我添加了一个互斥锁,因此我无法在同一个会话中多次运行该程序。但是,当我登录Windows Server上的另一个会话(每个用户可能有两个会话)时,问题在于,该程序在系统托盘中不可见,我可以再次打开它,因此它运行两次,每次运行一次会话。我如何防止这种情况?

感谢

+0

在例如文件中创建一个具有保留名称的文件。 'C:\ temp'并保持锁定,所以实例#2会注意并退出? –

+0

这是互斥体的名称?如果互斥体名称以全局\开始,则对所有终端服务会话都是全局的。您还应该检查互斥锁权限,以便所有用户都可以访问它。 –

+0

看到这个SO问题http://*.com/questions/229565/what-is-a-good-pattern-for-using-a-global-mutex-in-c –

您将看到这一切的过程:

using System.Diagnostics; 
var allProcceses = Process.GetProcesses(); 

然后你可以,如果你的程序运行检查。

+0

但是当我运行该程序时,将始终存在一个具有该名称的进程。如果我的程序被称为mailChecker,并且在那个程序中我检查mailChecker是否打开,它将始终返回true,因为如果mailChecker打开,mailChecker会触发。或者我错了? – Spliid

+0

您可以使用GetProcessesByName并查找mailChecker。如果已经运行,您会看到两个条目,此时您的程序可以自行停止。 – Mant101

+0

对不起,延迟回复。要么@ Mant101说,并检查进程的数量。或者使用'Process.GetCurrentProcess()'获取当前进程并比较Id,如果它们与您正在查看当前程序进程的ID相同。 – MrApnea