2

我想CreateMutex用作将我的应用程序限制为单实例的一种手段。(具体来说,每个用户一个实例。)

MSDN 文档CreateMutex警告恶意用户首先抢夺和囤积互斥锁的可能性。但是,如果我使用会话命名空间(通过“Local\”前缀)创建互斥锁,这仍然是我需要关注的事情吗?如果是这样,在什么情况下不同的用户可以在我的会话中创建互斥锁?

4

1 回答 1

3

使用Local\命名空间将使互斥锁与当前桌面会话保持隔离,但您还应该遵循该段中的其他建议:

为防止出现这种情况,请创建一个随机命名的互斥体并将名称存储起来,以便只能由授权用户获取。或者,您可以为此目的使用文件。要将您的应用程序限制为每个用户一个实例,请在用户的配置文件目录中创建一个锁定文件。

使用CoCreateGuid之类的东西生成互斥锁名称,将其存储在注册表项中并使用它,或者将文件锁定在用户的配置文件目录中。

建议使用难以猜测的 ID 的原因是,在属于不同用户的多个进程在同一个会话中运行的不太可能的情况下,您的进程具有使用可以保护的难以猜测的密钥名称的机制通过使用注册表 ACL 机制从其他帐户获取 - 即在这种情况下阻止其他非管理用户读取该值可确保其安全。在使用锁定文件作为主目录上的默认 ACL 的情况下,您将获得类似的保护,这将阻止其他用户创建或修改文件 [*]。我再次声明,这实际上是一种不太可能发生的情况,但它是可能的(可以使用与在特定会话中登录的用户不同的用户凭据从系统服务启动进程)。

您是否试图将其限制为“每个用户一个实例”或“每个桌面会话一个实例”?

如果每个会话一个,那么Local\互斥锁是合适的。

如果它是每个用户一个(不管会话),那么锁定用户配置文件目录中的文件更合适。

您可以将 Windows 配置为允许使用相同用户名登录多个远程终端服务 - 默认情况下,每个用户一个会话。

[*] 如果用户使用您的凭据或管理员凭据运行,所有这些机制都无效,因为他们只能读取此密钥。这个想法是保护在同一会话中运行的其他帐户

于 2013-04-27T19:02:58.283 回答