Re: Как поменять учётную запись в уже выполняющийся программ
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 14.10.07 15:31
Оценка:
Здравствуйте, WM_SASHA, Вы писали:

WM_>Нужно включить привелегию отладчика, находясь в сеансе учётной записи "ГОСТЬ".


Функция:

bool __fastcall EnablePrivilege(const char* privName)
{
  HINSTANCE hLib = LoadLibrary("advapi32.dll");
  if(!hLib)
      return false;

  // set up functions
  typedef BOOL (WINAPI *PLookupPrivilegeValue)(LPCTSTR,LPCTSTR,PLUID);
  typedef BOOL (WINAPI *POpenProcessToken)(HANDLE,DWORD,PHANDLE);
  typedef BOOL (WINAPI* PAdjustTokenPrivileges)(HANDLE,BOOL,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD);
  
  PLookupPrivilegeValue lpv = (PLookupPrivilegeValue) GetProcAddress(hLib,"LookupPrivilegeValueA");
  POpenProcessToken opt = (POpenProcessToken) GetProcAddress(hLib,"OpenProcessToken");
  PAdjustTokenPrivileges atp = (PAdjustTokenPrivileges) GetProcAddress(hLib,"AdjustTokenPrivileges");

  if(!lpv || !opt || !atp)
  {
      FreeLibrary(hLib);
      return FALSE;

  }

  LUID luid = {0};

  if(!lpv(NULL,privName,&luid))
  {
      FreeLibrary(hLib);
      return FALSE;

  }

  HANDLE hToken = NULL;
  if(!opt(GetCurrentProcess(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,&hToken))
  {
      FreeLibrary(hLib);
      return FALSE;
  }

  BOOL retval = FALSE;


  TOKEN_PRIVILEGES tp = {0};
  tp.PrivilegeCount = 1;
  tp. Privileges[0].Luid = luid;
  tp. Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  retval = atp(hToken, FALSE, &tp, sizeof(tp),
      NULL, NULL);


  if(hToken)
    CloseHandle(hToken);


  FreeLibrary(hLib);

  return retval;

}


И пример использования:

EnablePrivilege(SE_DEBUG_NAME);


По уму надо функцию переписать на использование TCHAR — дело пяти минут
<< Существует и лучший мир, но там все очень дорого. >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.