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++' — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.