c++ - CreateSemaphoreEx 安全属性与访问掩码

标签 c++ windows security

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

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 参数如此重要的原因;如果您遗漏了特定操作所需的权限,则该操作将失败,但如果您要求的权限范围太广,则可能会被拒绝访问。幸运的是,在大多数情况下,文档都很简单,因此只需要稍微注意一下细节即可。

关于c++ - CreateSemaphoreEx 安全属性与访问掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812423/

相关文章:

用mingw编译FMOD?

security - 将 Golang 作为 www-data 运行

security - 使用 Cognito AccessKeyId/SecretAccessKey 访问 AWS 服务

c++ - 在 Redhat : alternatives to system() 上从 C++ 解压缩文件

c++ - 如果以前的输入与当前输入相同,为什么 cin 的行为不同?

c++ - 将该值传递给函数时值会发生变化吗?

windows - 连接已重置。如何效仿?

python - 为什么 Python 的子进程调用在 Windows 上不能与 sh 一起正常工作?

c++ - 在路径 : windows 中找不到 Eclipse g++

php - 如何防止 PHP 中的 SQL 注入(inject)?