AccessCheck 函数获取一个 GenericMapping 参数。这个参数是干什么用的?它不用于 DesiredAccess 参数,因为之前必须将 MapGenericMask 应用于 DesiredAccess。
它也不适用于 SecurityDescriptor 中包含的 DACL,因为我发现使用 C 程序执行此操作:
- 打开当前线程令牌
- 从令牌创建具有所有者和默认组的安全描述符,以及将 GENERIC_ALL 授予所有者“D:(A;;GA;;;ownerSID)”的 DACL
- 设置 GENERIC_MAPPING,它将(除其他外)GenericAll 映射到我的 OWN_READ | OWN_WRITE(定义为 0x0001 和 0x0002)
- 使用上面创建的安全描述符、线程令牌、OWN_READ 作为 DesiredAccess、所描述的 GENERIC_MAPPING 调用 AccessCheck
但是,这会失败并出现拒绝访问错误。当我将安全描述符更改为“D:(A;;0x0001;;;ownerSID)”时,访问被授予。这表明 AccessCheck 没有使用 GenericMapping 参数将 DACL 中的通用访问标志 (GA/GW/GR/GX) 转换为特定的访问权限。为什么?难道我做错了什么?
https://msdn.microsoft.com/de-de/library/windows/desktop/aa374815(v=vs.85).aspx没有给出关于如何设置安全描述符的任何提示。