WinApi - 仅拒绝"写"允许每个人"但允许"阅读"

时间:2016-01-19 15:40:44

标签: c winapi permissions

我尝试使用WinAPI将文件夹设为只读,然后再次进行读/写。我试图通过拒绝写访问(对于只读部分)和授予所有访问(对于读/写部分)来做到这一点。第二部分有效,但是对于第一部分,当我尝试打开文件夹时,它告诉我没有权限访问它,我甚至无法看到文件夹中的文件。

这是代码(来自MSDN和其他来源):

role

谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的问题是您实际上并未获得对目录的读取权限。您的代码正在做的是有效地设置DACL,如下所示:

DENY GENERIC_WRITE to Everyone

现在,当您尝试列出应用程序尝试使用GENERIC_READ访问权限打开的目录时。操作系统将执行访问检查,它查看DACL中的第一个条目,看不到读请求和写掩码之间的匹配,因此跳过它。操作系统现在已经用完了访问控制条目,所以它唯一能做的就是拒绝你访问。要解决此问题,您需要第二个ACE,使其看起来像:

DENY  GENERIC_WRITE to Everyone
GRANT GENERIC_READ  to Everyone

您应该可以使用以下内容执行此操作:

const int NUM_ACES = 2;
EXPLICIT_ACCESS ea[NUM_ACES];
DWORD dwRes;

ZeroMemory(&ea, NUM_ACES * sizeof(EXPLICIT_ACCESS));

DWORD dwMask = FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA;
ea[0].grfAccessPermissions = (bAllowAccess ? GENERIC_ALL : dwMask);
ea[0].grfAccessMode = (bAllowAccess ? GRANT_ACCESS : DENY_ACCESS);
ea[0].grfInheritance = NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = _T("EVERYONE");

ea[1].grfAccessPermissions = GENERIC_READ;
ea[1].grfAccessMode = GRANT_ACCESS;
ea[1].grfInheritance = NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[1].Trustee.ptstrName = _T("EVERYONE");