Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> и снова о правах доступа 
V
    Опции темы
PunkRat
Дата 12.1.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 2.6.2006

Репутация: нет
Всего: нет



блин у меня от этого секьюрити уже голова отстегивается напрочь. скажите, пожалуйста, почему может не работать такой код. вот я устанавливаю право на чтение для пользователя таким макаром:

Код


    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("Есть!");
    }





Это сообщение отредактировал(а) PunkRat - 12.1.2008, 18:57
PM MAIL   Вверх
PunkRat
Дата 12.1.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 2.6.2006

Репутация: нет
Всего: нет



блин, ну почему же mask возвращается равным 2032127, т.е. все старшие биты - нулевые. в то время как я устанавливаю файлу GENERIC_WRITE перед этим, т.е. 31 бит и в свойствах файла это видно отлично ( (
PM MAIL   Вверх
Pulse69
Дата 13.1.2008, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



В маске будут содержаться т.н Specific Rights для файловых объектов. Вам же именно они нужны. GENERIC_READ и GENERIC_WRITE вполне могут и не возвращатсься  (точно не знаю, но, скорее всего, так и есть). 
Та маска, что вы получаете (2032127) как раз содержит в себе все доступные для файловых объектов операции.

Вот, на всякий случай, их список.
Код

FILE_READ_DATA                     -- File Specific Access Right (0x0001)
FILE_WRITE_DATA                    -- File Specific Access Right (0x0002)
FILE_APPEND_DATA                   -- File Specific Access Right (0x0004)
FILE_READ_EA                       -- File Specific Access Right (0x0008)
FILE_WRITE_EA                      -- File Specific Access Right (0x0010)
FILE_EXECUTE                       -- File Specific Access Right (0x0020)
FILE_DELETE_CHILD                  -- File Specific Access Right (0x0040)
FILE_READ_ATTRIBUTES               -- File Specific Access Right (0x0080)
FILE_WRITE_ATTRIBUTES              -- File Specific Access Right (0x0100)


Если нужно проверить, есть ли право на запись в файл, необходимо использовать следующий код:
Код

    if(mask & FILE_WRITE_DATA )
    {
        AfxMessageBox("Есть!");
    }

Вот и всё :-)


--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
PunkRat
Дата 13.1.2008, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 2.6.2006

Репутация: нет
Всего: нет



Pulse69, голова! ) таким образом получается, что полностью ваш код, большое вам спасибо. я бы не подумал, что это младшие биты в описании ACCESS_MASK в мсдн нет их расшифровки :\ хотя видел ведь, что число меняется... ой, кажется я все-таки успеваю все дописать  smile  сейчас попробуем.
PM MAIL   Вверх
PunkRat
Дата 13.1.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 2.6.2006

Репутация: нет
Всего: нет



блин, вот теперь запретив какое то из свойств из программы я не могу его вновь разрешить, только из диалога свойств файла ... нипонятна, что с этим делать. сначала я думал это потому, что я, например запретив право на чтение или запись для текущего пользователя пытаюсь потом что, то менять. но когда меняю права для другой записи - все то же самое. стоит что-то запретить, как потом ничего обратно программно не вернуть. через свойства файла - пожалуйста. в этих свойствах кстати для записи присутствует два элемента, в одном проставлено разрешение для дейстивя, а в другом - запрет.

Это сообщение отредактировал(а) PunkRat - 13.1.2008, 19:13
PM MAIL   Вверх
PunkRat
Дата 13.1.2008, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 2.6.2006

Репутация: нет
Всего: нет



сделал вот как. теперь работает! правда все равно нифига не понимаю как. мне кажется, что и в том варианте реализации можно было что-то подправить, чтоб работало. 

Код

    LPTSTR lpFileName = "c:\\hard.txt";
    LPTSTR lpUserName = "kooperativ";
    PSECURITY_DESCRIPTOR psd;
    SECURITY_DESCRIPTOR sd;
    EXPLICIT_ACCESS ea;
    PACL OldAcl;
    PACL NewAcl;
    BOOL bDaclPresent;
    BOOL bDaclDefaulted;

    DWORD dwSize = 0;
    GetFileSecurity(lpFileName, DACL_SECURITY_INFORMATION, 0, 0, &dwSize);

    psd = HeapAlloc(GetProcessHeap(), 8, dwSize);
    BuildExplicitAccessWithName(&ea, lpUserName, FILE_READ_DATA,
        DENY_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);

    GetFileSecurity(lpFileName, DACL_SECURITY_INFORMATION,
        psd, dwSize, &dwSize);
    GetSecurityDescriptorDacl(psd, &bDaclPresent, &OldAcl, &bDaclDefaulted);
    SetEntriesInAcl(1, &ea, OldAcl, &NewAcl);
    InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(&sd, TRUE, NewAcl, FALSE);
    SetFileSecurity(lpFileName, DACL_SECURITY_INFORMATION, &sd);

PM MAIL   Вверх
Pulse69
Дата 14.1.2008, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



Быть может, дело в том, что приоритет запрещения выше, чем разрешения, и если запретить какое-либо действие над файлом, его разрешение уже не даст эффекта. Для этого надо сначала удалить DENY_ACCESS-записи из ACL, а потом добавлять GRANT_ACCESS.

--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.