Settokeninformation Failed

  • Автор темы sadgb
  • Дата начала
S

sadgb

#1
Здравствуйте.
Столкнулся со следующей проблемой

SetTokenInformation(hNewToken, TokenIntegrityLevel, &TIL,sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid)))
срабатывает нормально
но вот когда я хочу установить TOKEN_MANDATORY_POLICY
SetTokenInformation(hNewToken, TokenMandatoryPolicy, &POL ,sizeof(TOKEN_MANDATORY_POLICY));
мне выдают ошибку 1314 (GetLastError())
ERROR_PRIVILEGE_NOT_HELD
1314
0x522
A required privilege is not held by the client.
текущему пользователю я выставил вообще все привилегии .
Поэтому неясно почему он говорит что привилегии нет
Работаю в Vista
Uac отключён

исходный код ниже
он практически полностью взят из мсдн
[codebox]void CreateLowProcess()
{
BOOL bRet;
HANDLE hToken;
HANDLE hNewToken;

// Notepad is used as an example
WCHAR wszProcessName[MAX_PATH] =
L"c:\\windows\\system32\\calc.exe";
// Low integrity SID
WCHAR wszIntegritySid[20] = L"S-1-16-4096";
PSID pIntegritySid = NULL;
TOKEN_MANDATORY_LABEL TIL = {0};
TOKEN_MANDATORY_POLICY POL = {0};
PROCESS_INFORMATION ProcInfo = {0};
STARTUPINFO StartupInfo = {0};
ULONG ExitCode = 0;
if (OpenProcessToken(GetCurrentProcess(),MAXIMUM_ALLOWED, &hToken))
{
if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,SecurityImpersonation, TokenPrimary, &hNewToken))
{
if (ConvertStringSidToSid(wszIntegritySid, &pIntegritySid))
{
TIL.Label.Attributes = SE_GROUP_INTEGRITY;
TIL.Label.Sid = pIntegritySid;

// Set the process integrity level
if (SetTokenInformation(hNewToken, TokenIntegrityLevel, &TIL,sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid)))
{
POL.Policy=TOKEN_MANDATORY_POLICY_NO_WRITE_UP;
printf ("%i\n", GetLastError());
// в следующей строке SetTokenInformation не возвращает 0 и ошибку 1314.
SetTokenInformation(hNewToken, TokenMandatoryPolicy, &POL ,sizeof(TOKEN_MANDATORY_POLICY));
printf ("%i\n", GetLastError());
// Create the new process at Low integrity
bRet = CreateProcessAsUser(hNewToken, NULL,
wszProcessName, NULL, NULL, FALSE,
0, NULL, NULL, &StartupInfo, &ProcInfo);
printf ("%i\n", GetLastError());
}

LocalFree(pIntegritySid);
}
CloseHandle(hNewToken);
}
CloseHandle(hToken);
}
}[/codebox]


Подскажите пожайлуйста как это можно исправить.
заранее СПАСИБО