CreateSemaphoreEx安全属性与访问掩码
CreateSemaphoreEx Security Attribute vs Access Mask
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
参数如此重要;如果您遗漏了特定操作所需的权限,该操作将失败,但如果您要求的权限范围太广,则可能会被拒绝访问。幸运的是,在大多数情况下,文档都很简单,所以只需要稍微注意细节。
- 位移操作和位掩码未检测到重复字符
- OpenCV - 带有掩码的absdiff
- 生成前缀位掩码
- 如何从__m64值的 lsb 创建 8 位掩码?
- 如何对无符号长 int 进行位掩码?
- 删除K的背景掩码-意味着Python或C++中的集群/
- 如何在C++中优雅地处理位掩码
- 将uint64_t位掩码转换为 std::布尔数组
- 使输入二进制掩码适应 ITK 网格生成器
- 如何从 getifaddr 读取子网掩码
- 优化从子位掩码生成父位掩码
- 基于模式创建位掩码作为 constexpr
- 使用二进制掩码 C++ ITK 获取感兴趣区域
- C++中的运行时位复制(位掩码)
- 根据 IP 和掩码C++打印所有 IP
- C++设置"blank"或重置 ifstrean (ios) 的异常掩码
- OpenCV 检测带有掩码的斑点
- OPENCV:如何创建多边形形状的掩码
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- CreateSemaphoreEx安全属性与访问掩码