CreateSemaphoreEx安全属性与访问掩码



Windows平台上的CreateSemaphoreEx API具有以下参数:

LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,以及DWORD dwDesiredAccess

我知道它们都是用来控制访问的,但我不确定它们之间的关系和差异。例如,如果我将dwDesiredAccess设置为SYNCHRONIZE,但我创建了一个带有空DACL的安全属性(即根本没有访问权限),那么这是如何协同工作的?如果有人能分享关于这些参数的目的以及它们如何相互作用的信息,那就太好了。

谢谢。

如果对象已经存在:

  • 忽略lpSemaphoreAttributes.lpSecurityDescriptor参数。

  • dwDesiredAccess参数确定对函数返回的新句柄授予什么访问权限。如果这些访问权限与对象上的安全权限不兼容,则调用将以ERROR_ACCESS_DENIED失败。

如果对象不存在:

  • lpSemaphoreAttributes.lpSecurityDescriptor参数确定为新创建的对象分配哪些安全权限。如果未提供安全描述符,则使用默认权限。

  • dwDesiredAccess参数确定对函数返回的新句柄授予什么访问权限。这些权限不受新建对象的安全权限的限制。从概念上讲,在应用新权限之前,对象的句柄被打开

因此,如果您指定一个具有空ACL的DACL(从而隐式拒绝对每个人的访问),那么访问该对象的唯一方法是通过使用该对象创建的句柄或该句柄的副本。即使是从同一个过程中,也不可能再次打开对象,除非您首先更改权限以允许您这样做。

请注意,在创建对象时,其他安全规则仍然适用。例如,您无法获得ACCESS_SYSTEM_SECURITY访问权限,即使是对新创建的对象,除非您具有SE_SECURITY_NAME权限。

还应该强调的是,当您使用现有的打开句柄访问对象时,只会检查句柄的访问权限,而不会检查对象的当前安全权限。如果您在打开句柄时获得了特定的访问权限,那么对象的安全权限是否已更改以拒绝您的访问权限也无关紧要。

相反,如果句柄没有使用执行给定操作所需的访问权限打开,则无法使用该句柄执行该操作,即使对象上的安全权限赋予了您这样做的权限。

这就是为什么dwDesiredAccess参数如此重要;如果您遗漏了特定操作所需的权限,该操作将失败,但如果您要求的权限范围太广,则可能会被拒绝访问。幸运的是,在大多数情况下,文档都很简单,所以只需要稍微注意细节。

最新更新