Я пытаюсь включить и отключить определенные права доступа к файлу. Я понял, что для этого нужно возиться с 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 для предоставления полного доступа группе администраторов, а затем запрещаю группе администраторов доступ на запись:
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(), например, заменил DENY_ACCESS на REVOKE_ACCESS, SET_ACCESS на GRANT_ACCESS, не делал никаких вызовов SET_ACCESS и т. д. и т. д., но, похоже, ничего не работает.
Должен отметить, что большая часть кода была взята из этого Пример MSDN, поэтому я думаю, что он должен работать. Что именно я делаю неправильно?