我正在尝试启用和禁用文件的某些访问权限。我发现要做到这一点,你必须弄乱 DACL。我正在使用以下代码来修改文件的 DACL:
void set_DACL_for_object(const char *object, SE_OBJECT_TYPE object_type,
int access_perms, int access_mode) {
PACL pDACL = NULL, pOldDACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea;
GetNamedSecurityInfo((LPTSTR)object, object_type,
DACL_SECURITY_INFORMATION, NULL, NULL,
&pOldDACL, NULL, &pSD);
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = access_perms;
ea.grfAccessMode = access_mode;
ea.grfInheritance = NO_INHERITANCE;
ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea.Trustee.ptstrName = _T("ADMINISTRATORS");
SetEntriesInAcl(1, &ea, pOldDACL, &pDACL);
SetNamedSecurityInfo((LPTSTR)object, object_type,
DACL_SECURITY_INFORMATION, NULL, NULL, pDACL, NULL);
}
所以首先我使用 fopen() 创建一个文件,创建一个 ACL 以授予对 Administrators 组的所有访问权限,然后拒绝对 Administrators 组的写访问权限:
set_DACL_for_object("C:\\file.txt", SE_FILE_OBJECT, GENERIC_ALL, SET_ACCESS);
set_DACL_for_object("C:\\file.txt", SE_FILE_OBJECT, GENERIC_WRITE, DENY_ACCESS);
但是,在这些调用之后,我没有对该文件的读取权限。如果我不打电话,我有读/写访问权限(正如预期的那样)。
我应该注意我在管理员帐户下运行,并且功能返回成功。我还尝试为特定的受限用户修改 ACL,但同样的事情发生了……用户被拒绝读取访问权限,而不是我想要的写入访问权限。
我尝试了一系列不同的 set_DACL_for_object() 调用组合,例如用 REVOKE_ACCESS 替换 DENY_ACCESS,用 GRANT_ACCESS 替换 SET_ACCESS,不进行任何 SET_ACCESS 调用等等,但似乎没有任何效果。
我应该注意,大部分代码都取自这个 MSDN 示例,所以我认为它应该可以工作。我到底做错了什么?