【问题标题】:About Mutex object in Vista关于 Vista 中的 Mutex 对象
【发布时间】:2009-05-15 16:03:27
【问题描述】:

我的操作系统是打开 UAC 的 Vista,我在服务器端创建了一个全局互斥对象,然后我的带有 UI 的 AP 想使用同名的 CreateMutex 来获取已在服务器中创建的互斥对象,但函数告诉我无权访问它。我该怎么做?

【问题讨论】:

  • 您是否在同一台 Vista 机器上运行服务器和 UI?
  • 是的,最大的问题是UI没有权限访问Server创建的MUTEX,因为现有的Mutex比UI SW具有更高的权限。

标签: windows winapi windows-vista uac


【解决方案1】:

我认为在您的情况下,您需要通过初始化相应的安全属性来明确允许对互斥锁的所有访问。

尝试以这种方式创建互斥锁(将其视为半伪代码):

SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = &sd;
CreateMutex(&sa, ...);

顺便说一句 - 可以使用 CreateMutex 打开一个现有 互斥锁。但是,OpenMutex 允许您指定所需的访问级别。

另外请注意,如果您需要一个真正的全局互斥锁 - 您必须在其名称前加上“Global\”(请参阅​​ MSDN 的“Kernel Object Namespaces”文章)

【讨论】:

  • 好吧,这不是一个好的做法:假设您有一个全局钩子 DLL 必须初始化和访问相同的互斥锁 - 在这种情况下 OpenMutex 并不方便。但是,如果在您的代码中创建互斥锁和访问该互斥锁可以很容易地分开 - 那么如果 CreateMutex 创建并且 OpenMutex 打开具有所需访问权限的现有互斥锁,您的代码将更加清晰
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2010-09-05
相关资源
最近更新 更多