Windows平台上的CreateSemaphoreEx API具有以下参数:
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,和 DWORD dwDesiredAccess
我知道它们都用于控制访问,但是,我不确定它们之间的关系以及它们之间的差异。例如,如果我将dwDesiredAccess设置为SYNCHRONIZE,但是我创建了一个带有空DACL的安全属性(即根本没有访问权限),那么它如何协同工作?如果任何人可以分享有关这些参数的用途以及它们如何相互作用的信息,那就太棒了。
感谢。
答案 0 :(得分:2)
如果对象已存在:
忽略lpSemaphoreAttributes.lpSecurityDescriptor
参数。
dwDesiredAccess
参数确定为从函数返回的新句柄赋予的访问权限。如果这些访问权限与对象的安全权限不兼容,则调用将失败并显示ERROR_ACCESS_DENIED
。
如果对象尚不存在:
lpSemaphoreAttributes.lpSecurityDescriptor
参数确定为新创建的对象分配的安全权限。如果未提供安全描述符,则使用默认权限。
dwDesiredAccess
参数确定为从函数返回的新句柄赋予的访问权限。这些权限不受新创建对象的安全权限限制。从概念上讲,在应用新权限之前,将打开对象的句柄。
因此,如果您指定一个具有空ACL的DACL(因此隐式拒绝对每个人的访问),那么访问该对象的唯一方法是通过使用该对象创建的句柄,或该句柄的副本。即使是在相同的过程中,也无法再次打开该对象,除非您首先更改权限以允许您这样做。
请注意,在创建对象时,其他安全规则仍然适用。例如,除非您拥有ACCESS_SYSTEM_SECURITY
权限,否则您无法获得SE_SECURITY_NAME
访问权限,甚至是新创建的对象。
还应该强调的是,当您使用现有的打开句柄访问对象时,仅检查句柄的访问权限,而不是对象的当前安全权限。如果您在打开句柄时获得了特定的访问权限,那么对象的安全权限是否已被更改为拒绝您的权利并不重要。
相反,如果未使用您需要执行给定操作的访问权限打开句柄,则无法使用该句柄执行该操作,即使对象的安全权限授予您这样做的权限。
这就是dwDesiredAccess
参数如此重要的原因;如果省略特定操作所需的权限,则该操作将失败,但如果您要求过多的权限,则可能会被拒绝访问。幸运的是,在大多数情况下,文档很简单,所以只需要注意细节。