как назначить права на каталог?
От: ksd Россия  
Дата: 24.04.17 14:32
Оценка:
Нашел вот какой код:

но не работает, ошибки, которая возвращает система указал по в комментариях к коду:
BOOL CreateDirectoryWithUserFullControlACL(LPCTSTR lpPath)
{
  if(!CreateDirectory(lpPath,NULL))
    return FALSE;

  HANDLE hDir = CreateFile(lpPath,READ_CONTROL|WRITE_DAC,0,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
  if(hDir == INVALID_HANDLE_VALUE)
    return FALSE; 

  ACL* pOldDACL;
  SECURITY_DESCRIPTOR* pSD = NULL;
  GetSecurityInfo(hDir, SE_FILE_OBJECT , DACL_SECURITY_INFORMATION,NULL, NULL, &pOldDACL, NULL, (void**)&pSD);

  PSID pSid = NULL;
  SID_IDENTIFIER_AUTHORITY authNt = SECURITY_NT_AUTHORITY;
  AllocateAndInitializeSid(&authNt,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_USERS,0,0,0,0,0,0,&pSid);

  EXPLICIT_ACCESS ea={0};
  ea.grfAccessMode = GRANT_ACCESS;
  ea.grfAccessPermissions = GENERIC_ALL;
  ea.grfInheritance = CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE;
  ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
  ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
  ea.Trustee.ptstrName = (LPTSTR)pSid;

  ACL* pNewDACL = 0;
  DWORD err = SetEntriesInAcl(1,&ea,pOldDACL,&pNewDACL);
  // err == 0 но при этом GetLastError возвращает 122: insuffiсien buffer -- данные не достаточного размера для системного вызова

  if(pNewDACL)
    SetSecurityInfo(hDir,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL, NULL, pNewDACL, NULL);
  // SetSecurityInfo тоже ноль возвращает, но при этом GetLastError возвращает 1008: попытка использовать несуществующий токен

  FreeSid(pSid);
  LocalFree(pNewDACL);
  LocalFree(pSD);
  CloseHandle(hDir);

  return TRUE;
}

что же делать?! может, кто то поделится своим кодом?
Re: как назначить права на каталог?
От: ononim  
Дата: 26.04.17 09:55
Оценка: +1
ksd>что же делать?! может, кто то поделится своим кодом?
Вызов (и его результат) GetLastError() не имеет смысла в случае успешного выполнения функции.
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.