Количество ACE файла - на вкладке «Безопасность» свойства файла есть только 9 элементов, но при этом возвращается 13 ACE из списка ACL. - PullRequest
0 голосов
/ 18 февраля 2020

void main () {

PSID UserSID = NULL;
PSID GroupSID = NULL;
//PSECURITY_DESCRIPTOR *SD = new PSECURITY_DESCRIPTOR;
PSECURITY_DESCRIPTOR SD = (PSECURITY_DESCRIPTOR)GlobalAlloc(GMEM_FIXED, sizeof(PSECURITY_DESCRIPTOR));
PACL pDACL ;
ULONG Count = NULL;
PEXPLICIT_ACCESS_W* pExplicitEntries = new PEXPLICIT_ACCESS_W;


string input, ext = "";
wcout << "Enter the location : " << endl;
std::getline(cin, input);
LPCSTR file = input.c_str();

HANDLE hFile = CreateFileA(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);

if (hFile == INVALID_HANDLE_VALUE)
{
    if (GetLastError() == ERROR_ACCESS_DENIED)
    {
        cout << "Access Denied : System Files" << endl;
        return;
    }
    else if (GetLastError() == ERROR_PATH_NOT_FOUND)
    {
        cout << "Path Name Not Found" << endl;
        return;
    }
    else if (GetLastError() == ERROR_FILE_NOT_FOUND)
    {
        cout << "File Not Found" << endl;
        return;
    }
    else
    {
        cout << GetLastError() << endl;
        return;                                                                                                                                                                                                                                                                     
    }
}
cout << GetLastError() << endl;

if ((GetSecurityInfo(hFile,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION, NULL, NULL, &pDACL, NULL, &SD)) == ERROR_SUCCESS)
{
    cout << "Number of ACE : " << pDACL->AceCount << endl;  
    cout << GetLastError() << endl;
}

for (int i = 0; i < pDACL->AceCount; i++)
{
    PACCESS_ALLOWED_ACE AceItem;
    ACE_HEADER* AceHdr = NULL;
    if (GetAce(pDACL, i, (LPVOID*)&AceItem) && GetAce(pDACL, i, (LPVOID*)&AceHdr))
    {
        TCHAR AccountBuff[80];
        TCHAR DomainBuff[80];
        DWORD AccountBufflength = 40;
        DWORD DomainBufflength = 40;
        PSID_NAME_USE peUse = new SID_NAME_USE;
        PSID Sid = &AceItem->SidStart;

        LookupAccountSidW(NULL, Sid, AccountBuff, &AccountBufflength, DomainBuff, &DomainBufflength,peUse);

        wcout << "\n----- " << AccountBuff << " @ " << DomainBuff << " -----\n" << endl;

        wcout << "AceType : " << AceHdr->AceType << " " << "Ace Flag : " << AceHdr->AceFlags << "\n" << endl;

        DisplayAccessMask(AceItem->Mask);

    }
    else
    {
        cout << GetLastError() << endl;
    }
}

} `

Как получить правильное количество ACE на вкладке безопасности свойства файла? На вкладке «Безопасность» свойства файла есть только 9 элементов, но список контроля доступа состоит из 13 элементов ACE. Может кто-нибудь сказать мне, как я могу получить пользователей, перечисленных на вкладке безопасности -> Advanced и их разрешение файла ...

1 Ответ

0 голосов
/ 19 февраля 2020

ACE содержит набор прав доступа и идентификатор безопасности (SID), который идентифицирует доверенное лицо, для которого права разрешены, запрещены или проверены.

ACE - контроль доступа запись, это не один-к-одному корреспонденту пользователей и групп.

Каждый ACE в списке управления доступом (ACL) относится к одному доверенному лицу. Но для одного доверенного лица может быть несколько ACE, как показано ниже, одна и та же группа администраторов имеет два ACE, один тип отказа, а другой тип разрешения:

enter image description here

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

GetSecurityInfo действительно дает мне непротиворечивое число разрешить записи в свойствах файла -> secutiry -> advanced.

...