Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Установка прав полного доступа для всех юзеров


Автор: CO4UHUTEJIb 31.10.2011, 06:57
Помогите, пожалуйста. Задача програмно сделать файл доступным для всех пользователей (чтение, запись, выполнение). Я нашел функцию http://msdn.microsoft.com/en-us/library/aa379577%28VS.85%29.aspx. Для нее нужно получить http://msdn.microsoft.com/en-us/library/aa379561%28v=VS.85%29.aspx с соответсвующими правами. Подскажите, пожалуйста, как это сделать.

Автор: bass 11.11.2011, 04:56
Вот код :


Код

    char *path = "C:\\1.txt";
    char *usr  = "User";

    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)
    {
   MessageBox(NULL,"ERR1", "", MB_OK );

        goto Cleanup;
    }
    // Инициализируем структуру для нового элемента
    //    списка контроля доступа
    ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
    ea.grfAccessPermissions =GENERIC_ALL;//KEY_ALL_ACCESS;//GENERIC_ALL;// KEY_ALL_ACCESS;//GENERIC_ALL;//SECTION_MAP_WRITE;//GENERIC_ALL ;//GENERIC_READ||GENERIC_WRITE; // только чтение
    ea.grfAccessMode = GRANT_ACCESS;//SET_ACCESS;//GRANT_ACCESS;// SET_ACCESS;//GRANT_ACCESS;
    ea.grfInheritance= OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE; //INHERIT_ONLY_ACE;//CONTAINER_INHERIT_ACE;;//CONTAINER_INHERIT_ACE;// NO_INHERITANCE;//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)
    {
   MessageBox(NULL,"ERR2", "", MB_OK );

        goto Cleanup;
    }
    //    Соединяем новый список с существующим списком объекта
dwRes = SetNamedSecurityInfo(path, SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL, NULL, pNewDACL, NULL);
if (ERROR_SUCCESS != dwRes)
{
   MessageBox(NULL,"ERR3","", MB_OK );

goto Cleanup;
}

MessageBox(NULL,"OK", "", MB_OK );
Cleanup:
if(pSD != NULL)
LocalFree((HLOCAL) pSD);
if(pNewDACL != NULL)
LocalFree((HLOCAL) pNewDACL);

Думаю поможет.....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)