2013-04-27 50 views
2

我想用CreateMutex作为限制我的应用程序到单个实例的一种手段。 (具体而言,每个用户一个实例。)如果我使用“Local ”,是否需要担心CreateMutex的拒绝服务?

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

+0

我认为你最好担心恶意*程序*。就像您的竞争对手中的一个人在登录时自动启动并创建该互斥体来阻止您。他们当然会声称解决“兼容性问题”非常重要。 – 2013-04-27 18:50:57

+0

@HansPassant如果那个恶意程序和我的用户是同一个用户,我看不出我能做什么来防止这种情况发生。我对军备竞赛不感兴趣。 – jamesdlin 2013-04-27 18:55:17

回答

3

使用Local\命名空间将保持隔离,以目前的桌面会话互斥体,但你也应该遵循该段的其他建议:

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

使用类似CoCreateGuid产生互斥体的名称,将其存储在注册表项和使用,或者锁定在用户的配置文件目录中的文件。

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

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

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

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

您可以配置windows以允许具有相同用户名的多个远程终端服务登录 - 默认情况下,它是每个用户一个会话。

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

+0

但是*为什么我应该遵循这些建议?恶意用户在什么情况下可以首先使用“本地”互斥锁? – jamesdlin 2013-04-27 19:09:41

+0

因为这是一种防御性的编程风格。您的实际担心是针对恶意*应用程序*,而不是用户,并且这些通常会在您的会话中最终运行**。 – Petesh 2013-04-27 19:22:07

+0

试图抵御恶意应用程序作为同一用户运行似乎徒劳。什么阻止该应用程序使用我的随机注册表值创建互斥锁或在我之前锁定我的文件? – jamesdlin 2013-04-27 19:26:18

相关问题