блин у меня от этого секьюрити уже голова отстегивается напрочь. скажите, пожалуйста, почему может не работать такой код. вот я устанавливаю право на чтение для пользователя таким макаром:
| Код |
char *path = "C:\\Dir"; char *usr = "Den"; DWORD dwRes = 0; PACL pOldDACL = NULL, pNewDACL = NULL; PSECURITY_DESCRIPTOR pSD = NULL; EXPLICIT_ACCESS ea;
// Получаем указатель на существующий // список контроля доступа объекта
dwRes = GetNamedSecurityInfo( path, SE_FILE_OBJECT, // объект - файл или папка DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDACL, NULL, &pSD);
if (ERROR_SUCCESS != dwRes) { printf( "GetNamedSecurityInfo Error %u\n", dwRes ); goto Cleanup; }
// Инициализируем структуру для нового элемента // списка контроля доступа
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); ea.grfAccessPermissions = GENERIC_WRITE; // только чтение ea.grfAccessMode = GRANT_ACCESS; ea.grfInheritance= CONTAINER_INHERIT_ACE; ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME; // указывает тип элемента ptstrName ea.Trustee.ptstrName = usr; // для кого устанавливается доступ ( здесь можно указать имя или SID)
// создаём новый список контроля доступа, в который будет входить новый элемент // с установленными разрешениями.
dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL); if (ERROR_SUCCESS != dwRes) { printf( "SetEntriesInAcl Error %u\n", dwRes ); goto Cleanup; }
// Соединяем новый список с существующим списком объекта
dwRes = SetNamedSecurityInfo(path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDACL, NULL); if (ERROR_SUCCESS != dwRes) { printf( "SetNamedSecurityInfo Error %u\n", dwRes ); goto Cleanup; }
Cleanup: if(pSD != NULL) LocalFree((HLOCAL) pSD); if(pNewDACL != NULL) LocalFree((HLOCAL) pNewDACL);
getch(); return 0; //благодарю Pulse69! }
|
все отлично устанавливается что и видно в диалоге прав. почему тогда, когда я пытаюсь получить права у меня бит GENERIC_WRITE - пустой. получаю вот так:
| Код | char *path = "C:\\test.txt"; char *usr = "PUNKRAT\\CyberGod"; DWORD dwRes = 0; PACL pOldDACL = NULL, pNewDACL = NULL; PSECURITY_DESCRIPTOR pSD = NULL; EXPLICIT_ACCESS ea;
dwRes = GetNamedSecurityInfo( path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDACL, NULL, &pSD);
if (ERROR_SUCCESS != dwRes) AfxMessageBox("Ошибка!");
PTRUSTEE pTrustee = new TRUSTEE(); BuildTrusteeWithName(pTrustee, usr); ACCESS_MASK mask; DWORD dwRetVal = GetEffectiveRightsFromAcl(pOldDACL, pTrustee, &mask);
if(mask & GENERIC_WRITE) { AfxMessageBox("Есть!"); }
|
|