в общем задачка проста, нужно пробежать весь каталог рекурсивно и поменять дату создания и модификации файлов. Причем, некоторые каталоги и файлы могут быть защищены системой безопасности виндов.
Сначала я пытался получить превилегии дающие возможность обходить ограничения безопасности. Однако, наиболее подходящие в этом случае SE_BACKUP_NAME и SE_RESTORE_NAME хотя и дали возможность входить в защищенные каталоги, но не дали главного - открыть файл с флагом FILE_WRITE_ATTRIBUTES
CreateFile(path, FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)
Может что то сделал неправильно? В описании этих превилегий сказано что они дают возможность читать и писать в файлы. Конечно смена аттрибутов это не то же самое что и чтение/запись в файл, но все же... Я допустил где то ошибку или этот номер с привелегиями не пройдет?
Второй вариант. Я нарыл, что можно временно заменить DACL значением NULL в дескрипторе безопасности каталога/файла
или добавить разрешающий ACE в начало списка. в общем получить дескриптор мне удалось. Я могу получить из него DACL и все его ACE.
GetFileSecurity(path, DACL_SECURITY_INFORMATION, pD, 0, &bufSize);
PSECURITY_DESCRIPTOR pD = (PSECURITY_DESCRIPTOR)new char[bufSize];
GetFileSecurity(path, DACL_SECURITY_INFORMATION, pD, bufSize, &bufSize);
PACL pA = NULL;
BOOL present = FALSE, defaultValue;
GetSecurityDescriptorDacl(pD, &present, &pA, &defaultValue);
if(!present) throw 1;
ACL_SIZE_INFORMATION sizeInfo;
GetAclInformation(pA, &sizeInfo, sizeof(sizeInfo), AclSizeInformation);
for (unsigned i=0; i<sizeInfo.AceCount; i++)
{
PACCESS_ALLOWED_ACE pAce = NULL;
GetAce(pA, i, (LPVOID*)&pAce);
/* ..... проверка SID токена процесса на соответствие текущему ACE ...... */
}
Но так и не могу понять как
1. произвести проверку SID токена процесса на соответствие текущему ACE.
2. заменить DACL на NULL (что нежелательно)
3. добавить разрешающий ACE в начало DACL
в общем теоретически я знаю что нужно сделать и частично уже сделал, но практически я завяз. Русских ссылок по теме практически нет...
Хелп плз!