Я хочу знать целостность levef файла, но не могу получить sacl. GetNamedSecurityInfo возвращает 0 (ERROR_SUCCESS), что означает, что нет ошибки при его выполнении, но SACL по-прежнему становится 0x00000000. Кто-нибудь знает, в чем проблема?не может получить sacl файла
int GetFileIntegrityLevel()
{
DWORD integrityLevel = SECURITY_MANDATORY_UNTRUSTED_RID;
PSECURITY_DESCRIPTOR pSD = NULL;
PACL acl = 0;
int dw = 0;
GetNamedSecurityInfoA("C:\\8.docx", SE_FILE_OBJECT, SACL_SECURITY_INFORMATION, 0, 0, 0, &acl, &pSD));
{
if (0 != acl && 0 < acl->AceCount)
{
SYSTEM_MANDATORY_LABEL_ACE* ace = 0;
if (GetAce(acl, 0, reinterpret_cast<void**>(&ace)))
{
SID* sid = reinterpret_cast<SID*>(&ace->SidStart);
integrityLevel = sid->SubAuthority[0];
}
}
PWSTR stringSD;
ULONG stringSDLen = 0;
ConvertSecurityDescriptorToStringSecurityDescriptor(pSD, SDDL_REVISION_1, ACCESS_SYSTEM_SECURITY, &stringSD, &stringSDLen);
if (pSD)
{
LocalFree(pSD);
}
}
if (integrityLevel == 0x0000)
return 0;
else if (integrityLevel == 0x1000)
return 1;
else if (integrityLevel == 0x2000)
return 2;
else if (integrityLevel == 0x3000)
return 3;
else if (integrityLevel == 0x4000)
return 4;
else
return -1;
}
int main()
{
HANDLE curProcess = GetCurrentProcess();
TOKEN_PRIVILEGES tp;
LUID sdv;
HANDLE hToken = 0;
OpenProcessToken(curProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_READ | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &sdv);
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = sdv;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), (PTOKEN_PRIVILEGES)NULL, 0);
int i = GetFileIntegrityLevel();
printf("%d\n", i);
printf("%d\n", i);
CloseHandle(curProcess);
std::cin.get();
}
Практически отсутствует обработка ошибок в коде. Почти любой вызов может потерпеть неудачу, но мы понятия не имеем, если это так или нет. Внесите отчет об ошибках. – IInspectable