UAC_Helper.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "stdafx.h"
  2. #include "UAC_Helper.h"
  3. #include "Misc.h"
  4. CUAC_Helper::CUAC_Helper(void)
  5. {
  6. }
  7. CUAC_Helper::~CUAC_Helper(void)
  8. {
  9. }
  10. bool CUAC_Helper::PasteAsAdmin(HWND hWnd)
  11. {
  12. bool runningElevated = AmIRunningElevated();
  13. bool theirRunningElevated = AreTheyRunningElevated(hWnd);
  14. bool pasteAsAdmin = false;
  15. if (runningElevated == false &&
  16. theirRunningElevated)
  17. {
  18. pasteAsAdmin = true;
  19. }
  20. Log(StrF(_T("I'm running elevated: %d, They are running elevated: %d, PASTE AS ADMIN: %d"), runningElevated, theirRunningElevated, pasteAsAdmin));
  21. return pasteAsAdmin;
  22. }
  23. bool CUAC_Helper::AmIRunningElevated()
  24. {
  25. bool ret = RunningElevated(GetCurrentProcess(), true);
  26. return ret;
  27. }
  28. bool CUAC_Helper::AreTheyRunningElevated(HWND hWnd)
  29. {
  30. DWORD pid;
  31. GetWindowThreadProcessId(hWnd, &pid);
  32. HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, pid);
  33. bool ret = RunningElevated(hProcess, true);
  34. return ret;
  35. }
  36. bool CUAC_Helper::RunningElevated(HANDLE hProcess, bool defaultValue)
  37. {
  38. bool fIsElevated = defaultValue;
  39. DWORD dwError = ERROR_SUCCESS;
  40. HANDLE hToken = NULL;
  41. TOKEN_ELEVATION elevation;
  42. if (hProcess == NULL)
  43. {
  44. dwError = GetLastError();
  45. Log(StrF(_T("RunningElevated, initial Handle is NULL, Last Error: %d"), dwError));
  46. }
  47. else
  48. {
  49. if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken))
  50. {
  51. dwError = GetLastError();
  52. Log(StrF(_T("RunningElevated, OpenProcessToken failed, Last Error: %d"), dwError));
  53. }
  54. else
  55. {
  56. DWORD dwSize;
  57. if (!GetTokenInformation(hToken, TokenElevation, &elevation, sizeof(elevation), &dwSize))
  58. {
  59. // When the process is run on operating systems prior to Windows
  60. // Vista, GetTokenInformation returns FALSE with the
  61. // ERROR_INVALID_PARAMETER error code because TokenElevation is
  62. // not supported on those operating systems.
  63. dwError = GetLastError();
  64. Log(StrF(_T("RunningElevated, GetTokenInformation failed, Last Error: %d"), dwError));
  65. }
  66. else
  67. {
  68. fIsElevated = elevation.TokenIsElevated == 1;
  69. }
  70. }
  71. }
  72. if (hProcess != NULL)
  73. CloseHandle(hProcess);
  74. if (hToken != NULL)
  75. CloseHandle(hToken);
  76. return fIsElevated;
  77. }