Здравствуйте, Аноним, Вы писали:
А>LUID seDebug;
А>TOKEN_PRIVILEGES tkp;
А>HANDLE hTokenCurr;
А>OpenProcessToken(GetCurrentProcess(),TOKEN_АDJUST_PRIVILEGES|TOKEN_QUERY,&hTokenCurr);
А>LookuptPrivilegeValue(NULL,SE_DEBUG_NAME,&seDebug);
А>tkp.PrivilegeCount=1;
А>tkp.Privileges[0].Luid=seDebug;
А>tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
А>AdjustTokenPrivileges(hTokenCurr,FALSE,&tkp,sizeof tkp,NULL,NULL);
А>CloseHandle(hTokenCurr);
А>=====
А>GetLastError() для AdjustTokenPrivileges возвращает 6 (ERROR_INVALID_HANDLE) из под system, но под обычным не привилегированным пользователем все работает.
Неплохо бы проверять, что возвращают ВСЕ функции:
if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken ))
{
ret = GetLastError();
WriteLog(LOG_PATH, _T("LINE: %u\tError: %u"), __LINE__, ret);
goto EXIT;
}
// Получим значение LUID привилегии по символическому названию
state.PrivilegeCount = 1;
if ( !LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &state.Privileges[0].Luid ))
{
ret = GetLastError();
WriteLog(LOG_PATH, _T("LINE: %u\tError: %u"), __LINE__, ret);
goto EXIT;
}
// Запросим привилегию для нашего маркера
state.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( !AdjustTokenPrivileges( hToken, false, &state, sizeof(state), NULL, NULL ))
{
ret = GetLastError();
WriteLog(LOG_PATH, _T("LINE: %u\tError: %u"), __LINE__, ret);
goto EXIT;
}
Это кусок кода для моих нужд, не стал переделывать, думаю, это не сложно — он работал под Local System.