Доброй день
Можно ли понизить, а затем вернуть старый Integrity Level из управляющего процесса?
Следующий код возвращает ошибку 1314 == ERROR_PRIVILEGE_NOT_HELD (A required privilege is not held by the client), однако я выполняю эту операцию возврата Integrity Level из процесса с большим Integrity Level.
1) Запоминаем старый Integrity Level
2) устанавливаем более низкий Integrity Level ("S-1-16-0" == SECURITY_MANDATORY_UNTRUSTED_RID) для процесса
3) устанавливаем старый Integrity Level
4) Результат ошибка 1314
LPWSTR GetTokenIntegritySid(HANDLE hToken)
{
BOOL bb;
DWORD dw;
LPWSTR str;
TOKEN_MANDATORY_LABEL *pTIL;
bb = GetTokenInformation ( hToken, TokenIntegrityLevel, NULL, 0, &dw);
pTIL = (TOKEN_MANDATORY_LABEL *)malloc(dw);
bb = GetTokenInformation ( hToken, TokenIntegrityLevel, pTIL, dw, &dw);
ConvertSidToStringSid(pTIL->Label.Sid, &str);
return str;
}
DWORD SetTokenIntegritySid(HANDLE hToken, LPCWSTR szSid)
{
BOOL bb;
DWORD dw;
TOKEN_MANDATORY_LABEL TIL;
PSID pIntegritySid = NULL;
if (!ConvertStringSidToSid(szSid, &pIntegritySid))
return GetLastError();
TIL.Label.Attributes = SE_GROUP_INTEGRITY;
TIL.Label.Sid = pIntegritySid;
dw = sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid);
bb = SetTokenInformation ( hToken, TokenIntegrityLevel, &TIL, dw);
if (!bb)
return GetLastError();
return NO_ERROR;
}
void Test()
{
HANDLE hToken;
// Notepad is used as an example
WCHAR wszProcessName[MAX_PATH] =
L"C:\\Windows\\System32\\Notepad.exe";
PROCESS_INFORMATION ProcInfo = {0};
STARTUPINFO StartupInfo = {0};
LPWSTR sSid = NULL;
LPWSTR sSidBase = NULL;
DWORD dw;
if (OpenProcessToken(GetCurrentProcess(),MAXIMUM_ALLOWED, &hToken))
{
CreateProcessAsUser(hToken, NULL,
wszProcessName, NULL, NULL, FALSE,
0, NULL, NULL, &StartupInfo, &ProcInfo);
OpenProcessToken(ProcInfo.hProcess, MAXIMUM_ALLOWED, &hToken);
sSidBase = GetTokenIntegritySid(hToken);
dw = SetTokenIntegritySid(hToken, L"S-1-16-0"); // низкий Integrity Level = SECURITY_MANDATORY_UNTRUSTED_RID
sSid = GetTokenIntegritySid(hToken);
dw = SetTokenIntegritySid(hToken, sSidBase); // старый Integrity Level
dw; // Errror == 1314
sSid = GetTokenIntegritySid(hToken);
CloseHandle(hToken);
}
}
Спасибо