2010-10-21 170 views
3

这种情况是我想让用户打开该程序的多个实例,但我不想让多个登录用户一次使用该程序。因此,例如,如果程序安装在服务器上,并且多个用户可以将远程桌面安装到服务器上,我只希望一个用户能够运行该程序,但仍能够运行多个实例。我已经研究过使用互斥锁,但是从我发现的互斥锁只会允许该程序的一个实例。这是C#可能的东西吗?如何只允许一个用户运行我的C#程序,但也允许多个实例?

+0

你能更具体吗?你想限制只有一个特定的用户,或任何用户,但一次只有一个? – slugster 2010-10-21 21:27:18

+0

我希望能够允许任何用户,但只有该用户可以一次运行一个或多个实例。 – 2010-10-21 21:37:16

回答

2

我会使用一个命名的互斥体。在其保护内部,记录当前登录的用户。如果存在,并且它不是当前用户,则退出 - 否则,记录当前用户正在运行该应用程序。

+0

感谢您的建议。我最终使用了两个名为mutexes的系统,它似乎工作得很好。现在我要看看QA是否能够打破它。 – 2010-10-22 17:09:37

0

我会禁用内置的一个实例功能并编写自己的。只需单步执行所有正在运行的进程,并且如果找到了您的进程,请查看用户是否与当前用户相同。如果是,退出其中一个实例。

编辑:这将要求用户拥有管理员权限,这在您提出的情况下不太可能。可能有更好的方法来做到这一点,但你总是可以在文件或注册表中进行一些锁定......所有用户都有读写权限的区域。使用当前用户名和时间戳更新该锁定文件,每隔x秒左右。如果另一个用户试图打开该程序,那么你可以告诉他们谁打开了它。如果当前用户已经打开它,没什么大不了的。如果锁定文件已过期,请忽略它......您可以假定创建该文件的实例不再存在。

+0

这将要求所有登录到远程服务器的用户都具有管理员权限。否则,他们无法列出在不同凭据下运行的进程。 – 2010-10-21 21:14:35

+0

啊,好点!编辑我的答案... – Brad 2010-10-21 21:18:51

3

这是通常通过作为许可证管理器运行的独立应用程序处理的东西。您可以拥有提供许可证的服务,并跟踪当前的使用情况,并使您的应用程序在启动时连接到管理器。管理员可以检查凭证,并根据任何标准(包括只有1个用户(具有多个副本),最多N个用户等)来回应是否允许应用程序运行。

Windows Communication Foundation适用于实施与服务之间的通信。

+0

不幸的是,我没有选择让我们的用户安装一个单独的应用程序来运行这个应用程序。 – 2010-10-21 23:16:17

+0

@Alex:遗憾的是,没有提升权限,没有真正有效的方法来控制不同的用户(通过设计)。您可以限制一个用户登录内的应用程序数量,但不能通过没有管理员权限或主管服务的计算机。 – 2010-10-21 23:34:40

0

使用一个有名的Mutex。互斥体名称将为MyMutex_ [用户名] 这样,您将为每个用户使用不同的单个互斥体。