使用CreateMutex()和SECURITY_属性创建互斥体 我用VisualStudioC++ 2010编写代码,用 CeaReMutuxE()/创建全局\/COD>互斥体。您可以像这样使用CreateMutex():

使用CreateMutex()和SECURITY_属性创建互斥体 我用VisualStudioC++ 2010编写代码,用 CeaReMutuxE()/创建全局\/COD>互斥体。您可以像这样使用CreateMutex():,c++,service,process,global,mutex,C++,Service,Process,Global,Mutex,CreateMutex(NULL、FALSE、NULL) 第一个参数是安全属性 我知道您可以创建自己的安全属性,如下所示: SECURITY_DESCRIPTOR sDescriptor; InitializeSecurityDescriptor(...); SetSecurityDescriptorDacl(...); SECURITY_ATTRIBUTES sAttribute; // set sAttribute's fields ... ... ... CreateMutex(sAtt

CreateMutex(NULL、FALSE、NULL)

第一个参数是安全属性

我知道您可以创建自己的安全属性,如下所示:

SECURITY_DESCRIPTOR sDescriptor;
InitializeSecurityDescriptor(...);
SetSecurityDescriptorDacl(...);
SECURITY_ATTRIBUTES sAttribute;
// set sAttribute's fields
...
...
...

CreateMutex(sAttribute, FALSE, NULL);
我的问题是,我真的不明白为什么在创建互斥对象时需要创建自己的安全描述符和属性。我的问题是:

  • 默认安全属性(
    NULL
    )与如上所述创建自己的安全属性之间的真正区别是什么
  • 如果运行相同的代码,从一台计算机或进程创建的安全属性与从另一台计算机或进程创建的安全属性有何不同
为了进一步讨论,在使用默认安全属性创建互斥时,如
CreateMutex(NULL,FALSE,NULL)在服务中,并尝试使用
OpenMutex打开同一个互斥体(互斥体\所有\访问,FALSE,NULL)
从服务之外的用户应用程序中,您从
OpenMutex()
中得到一个错误5,即
error\u ACCESS\u DENIED
。添加创建的安全属性时,可以从用户应用程序成功打开互斥锁


为什么会这样?我的理论是,服务在会话0中运行,而所有其他应用程序在不同的会话中运行,因此安全属性必须为零。但我并不真正理解创建安全属性和使用默认属性之间的区别。我的想法正确吗?

你看过这篇文章吗@乔纳森·波特:谢谢你的文章。这让我开始朝着正确的方向前进。我试图理解应用程序之间的安全描述符有何不同。可能是访问控制列表使用的用户令牌?安全描述符将权限分配给用户,而不是应用程序。将其视为对文件的权限—相同的基本概念。