NTFS permission
От: sum61 Россия  
Дата: 12.12.08 07:33
Оценка:
Всем привет. Кто знает как получить права фолдера нтфс?
Т.е необходимо в свою гую вывести галочки такие же как и
правой кнопкой по папке -> свойства -> безопасность.

Сейчас юзаю примерно такой код.
Проблема в том чтоне совсем понятно как корректно разобрать
ACCESS_MASK и какие кода будут когда несколько галок одновременно поставить.
WTL::CString CPipeServer::GetNTFSPermission(WTL::CString Data)
{
    WTL::CString NewDestination;
    LPTSTR pszObjName;         // name of object
    SE_OBJECT_TYPE ObjectType;  // type of object
    DWORD dwRes = 0;
    PACL pOldDACL = NULL;
    PSECURITY_DESCRIPTOR pSD = NULL;    
      


    DebugBreak();
 

        if (NULL == Data.GetLength())
        {
            return ERROR_INVALID_PARAMETER;
        }

        TCHAR* fileName = new TCHAR[Data.GetLength() + 1];
        _stprintf(fileName,_T("%s"),Data); 

        dwRes = GetNamedSecurityInfo(fileName, SE_FILE_OBJECT, 
            DACL_SECURITY_INFORMATION,
            NULL, NULL, &pOldDACL, NULL, &pSD);

        if (ERROR_SUCCESS != dwRes)   
        { 
            goto Cleanup; 
        }  

        ULONG pcCountOfExplicitEntries = 0;
        EXPLICIT_ACCESS  *pListOfExplicitEntries;

        dwRes =  GetExplicitEntriesFromAcl(
            pOldDACL, &pcCountOfExplicitEntries, &pListOfExplicitEntries );

        if (ERROR_SUCCESS != dwRes)   
        { 
            goto Cleanup; 
        }  
         
        for (int nIndex = 0; nIndex < pcCountOfExplicitEntries; nIndex++) 
        { 
            NewDestination += "ACCESS_MODE&";

            switch( pListOfExplicitEntries[nIndex].grfAccessMode)
            { 
                case NOT_USED_ACCESS: NewDestination += "NOT_USED_ACCESS";  break;
                case GRANT_ACCESS: NewDestination += "GRANT_ACCESS";  break;
                case SET_ACCESS: NewDestination += "SET_ACCESS";  break;
                case DENY_ACCESS: NewDestination += "DENY_ACCESS";  break;
                case REVOKE_ACCESS: NewDestination += "REVOKE_ACCESS";  break;
                case SET_AUDIT_SUCCESS: NewDestination += "SET_AUDIT_SUCCESS";  break;
                case SET_AUDIT_FAILURE: NewDestination += "SET_AUDIT_FAILURE";  break; 
            } 
            NewDestination += "*grfAccessPermissions&";
   

            TCHAR* codeBuffer = new TCHAR[256];
            ZeroMemory(codeBuffer,256);
             _ultow_s( pListOfExplicitEntries[nIndex].grfAccessPermissions, codeBuffer, 256, 10 );
            NewDestination+=codeBuffer;

            delete[] codeBuffer;   
   
            NewDestination += "*"; 
        }

      

Cleanup:

        if(pSD != NULL) 
            LocalFree((HLOCAL) pSD); 
        delete[] fileName;
         
 


 
    return NewDestination;
}

Добавил разметку — Кодт
12.12.08 15:58: Перенесено модератором из 'C/C++' — Кодт
Re: NTFS permission
От: x64 Россия  
Дата: 12.12.08 14:57
Оценка:
S>Проблема в том чтоне совсем понятно как корректно разобрать
S>ACCESS_MASK и какие кода будут когда несколько галок одновременно поставить.

А чего непонятного-то? EXPLICIT_ACCESS у тебя есть, там всё что нужно содержится. В частности:

  • Имя объекта в EXPLICIT_ACCESS.Trustee.ptstrName.
  • Тип идентификатора (имя, SID, etc) в EXPLICIT_ACCESS.Trustee.TrusteeForm.
  • Тип объекта (пользователь, группа, etc) в EXPLICIT_ACCESS.Trustee.TrusteeType.
  • Режим доступа (разрешаем, запрещаем, etc) в EXPLICIT_ACCESS.grfAccessMode.
  • Разрешения в EXPLICIT_ACCESS.grfAccessPermissions.

    Что касается разрешения для файлов, то они перечислены в File Security and Access Rights.
  • Re: NTFS permission
    От: Alexey Frolov Беларусь  
    Дата: 15.12.08 17:30
    Оценка:
    Здравствуйте, sum61, Вы писали:

    S>Т.е необходимо в свою гую вывести галочки такие же как и

    S>правой кнопкой по папке -> свойства -> безопасность.

    надо для каждого пользователя вывести (то есть фактически содержимое дескриптора)?
    или может для конкретного (текущего например)?
    есть такая функция GetEffectiveRightsFromAcl
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.