Я хочу запустить файл с низким уровнем целостности , который обычно имеет средний уровень целостности. То есть понизить уровень целостности у файла Код (C++): #include <Windows.h> // one can also use Winternl.h if needed //#include <Winternl.h> // for UNICODE_STRING and SYSTEM_INFORMATION_CLASS #include <stdio.h> #include <tchar.h> #define LOW_INTEGRITY_SDDL_SACL_W L"S:(ML;;NW;;;LW)" #include<list> #include<iterator> #include<iostream> #include<windows.h> #include<stdio.h> #include <tlhelp32.h> #include <Psapi.h> #include<lm.h> #include<aclapi.h> #include<sddl.h> void SetLowLabelToFile() { // The LABEL_SECURITY_INFORMATION SDDL SACL to be set for low integrity DWORD dwErr = ERROR_SUCCESS; PSECURITY_DESCRIPTOR pSD = NULL; PACL pSacl = NULL; // not allocated BOOL fSaclPresent = FALSE; BOOL fSaclDefaulted = FALSE; LPWSTR *pwszFileName = NULL; const char* temp= "C:\\Users\\Elvin\\Documents\\testIntegrity\\jr.txt"; const char* msg = "C:\\Users\\Elvin\\Documents\\testIntegrity\\jr.txt"; int len = strlen(msg) + 1; wchar_t *w_msg = new wchar_t[len]; memset(w_msg, 0, len); MultiByteToWideChar(CP_ACP, NULL, msg, -1, w_msg, len); int k = 0; if (ConvertStringSecurityDescriptorToSecurityDescriptorW(LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD, NULL)) { k = GetLastError(); if (GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl, &fSaclDefaulted)) { k = GetLastError(); // Note that psidOwner, psidGroup, and pDacl are // all NULL and set the new LABEL_SECURITY_INFORMATION dwErr = SetNamedSecurityInfoW(w_msg, SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION, NULL, NULL, NULL, pSacl); k = GetLastError(); } LocalFree(pSD); } } int main() { SetLowLabelToFile(); return 0; } Но проблема в том, что уровень не понижается(проверил в Process Explorer). То есть я хочу,чтобы после того, как отработал код ниже,я запустил этот же txt файл и его уровень целостности уменьшился до Low(обычный запуск - Medium). Первые два GetLastError возвращают 0, но последний выкидывает ошибку 1008, которая означает , что "была сделана попытка сослаться на токен, который не существует", но путь до файла валидный, поэтому причина ошибки не понятна, можете помочь исправить?
Если сделать через icacls.exe путь к файлу /setintegritylevel:L ? Т.е. запустить через WinExec вот эту прогу Или нужно обязательно программно установить атрибуты? --- Сообщение объединено, 28 сен 2019 --- И да, почему изначально не задавать путь в юникод-формате? Зачем эти пляски с конвертированием char ?
К сожалению , мне нужно сделать это программно ,поэтому консольная icacls не подойдет. А по поводу char- просто ещё не разобрался с widechar
WCHAR * temp= L"C:\\Users\\Elvin\\Documents\\testIntegrity\\jr.txt"; или LPWSTR x = L"тут путь". Так то хз, я не понимаю сути вашей задачи. Зачем устанавливать на файл низкий low il ? Блокнот (или чем вы будете открывать) работает, обычно ,с медиум и ясное дело, откроет файл.