我想使用CreateMutex
作为将我的应用程序限制为单个实例的方法。 (具体来说,每个用户一个实例。)
The MSDN documentation to CreateMutex
警告恶意用户首先抢夺和囤积互斥锁的可能性。但是,如果我使用会话命名空间(通过“Local \”前缀)创建互斥锁,那还有什么我需要关注的吗?如果是这样,在不同的用户可以在什么情况下在我的会话中创建互斥?
答案 0 :(得分:3)
使用Local\
命名空间会将互斥锁隔离到当前桌面会话,但您还应该遵循该段落中的其他建议:
要防止出现这种情况,请创建一个随机命名的互斥锁并存储该名称,以便只能由授权用户获取。或者,您可以使用文件来实现此目的。要将应用程序限制为每个用户一个实例,请在用户的配置文件目录中创建一个锁定文件。
使用CoCreateGuid之类的内容生成互斥锁名称,将其存储在注册表项中并使用它,或者将文件锁定在用户的配置文件目录中。
建议使用难以猜测的ID的原因是,在不太可能的情况下,属于不同用户的多个进程在同一会话中运行,您的进程具有使用难以猜测的密钥名称的机制可以通过使用注册表ACL机制来保护其他帐户免受攻击 - 即阻止其他非管理用户读取该值在这种情况下保持安全。在使用锁定文件的情况下,您可以获得类似的保护,因为主目录上的默认ACL会阻止其他用户创建或修改文件[*]。同样,我声明这实际上是一个不太可能的情况,但它是可能的(可以使用不同的用户凭据从系统服务启动进程到登录在特定会话中的用户)。
您是否尝试将其限制为“每个用户的单个实例”或“每个桌面会话的单个实例”?
如果每个会话一个,那么Local\
互斥锁是合适的。
如果是每个用户一个(无论会话如何),那么锁定用户配置文件目录中的文件更合适。
您可以配置窗口以允许使用相同用户名的多个远程终端服务登录 - 默认情况下,每个用户只有一个会话。
[*]如果用户使用您的凭据或管理员凭据运行,则所有这些机制都无效,因为他们只能读取此密钥。这个想法是保护在同一会话中运行的其他帐户