Вопрос

Все, что мне удалось найти о повышении соответствующих привилегий для моих потребностей, согласились с моими текущими методами, но проблема существует. Я надеюсь, что, возможно, у кого-то есть некоторые внутренние возможности Windows Vista / Windows 7, которые могут светить немного света, где есть только тьма. Я уверен, что это будет долго, но, пожалуйста, нести меня.

Контекст

Я работаю над приложением, которое требует доступа к памяти других процессов на текущем компьютере. Это, очевидно, требует прав администратора. Это также требует SeDebugPrivilege (Нет, это не смерчательность SetDebugPrivilege), который я считаю, что я должен правильно приобретать, хотя и вопрос, если больше привилегий не нужны и, следовательно, причина моих проблем. Код до сих пор успешно работал на всех версиях Windows XP и на моем тесте Vista 32-битной среды и Windows 7 64-битной среды.

Обработать

  • Программа будет Всегда бежать с правами администратора. Это можно предположить на протяжении всего этого поста.
  • Повысить текущий процесс Access Token включать SeDebugPrivilege права.
  • С использованием EnumProcesses Чтобы создать список текущих PID в системе
  • Открытие ручки с использованием OpenProcess с участием PROCESS_ALL_ACCESS права доступа
  • С использованием ReadProcessMemory прочитать память о другом процессе.

Проблема:

Все работает нормально во время разработки и моего персонального тестирования (включая Windows XP 32 и 64, Windows Vista 32 и Windows 7 X64). Однако во время развертывания теста на обои Windows Vista (32-разрядные) и Windows 7 (64-битные) машины коллеги, кажется, проблема привилегий / прав с OpenProcess Неспособность с универсальным Access Denied ошибка. Это происходит как при запуске как ограниченного пользователя (как было бы ожидалось), а также при запуске явно в качестве администратора (щелкните правой кнопкой мыши → → Запустить от имени администратора и при запуске от командной строки уровня администратора).

Однако эта проблема была непреодолимой для себя в моей тестовой среде. Я был свидетелем проблемы первой руки, поэтому я доверяю, что проблема существует. Единственное различие, которое я могу различить между реальной средой и моей тестовой средой, заключается в том, что действительный Ошибка происходит при использовании учетной записи администратора домена в приглашении UAC, в то время как мои тесты (которые работают без ошибок), используют локальную учетную запись администратора в приглашении UAC.

Похоже, что, хотя использование учетных данных позволяет UAC «работать как администратор», процесс до сих пор не получает правильные права, чтобы иметь возможность OpenProcess на другой процесс. Я не достаточно знакомый с внутренними Vista / Windows 7, чтобы узнать, что это может быть, и я надеюсь, что у кого-то есть идея того, что может быть причиной.

Кикер

Человек, который сообщил об этой ошибке, и окружающую среду ВОЗ регулярно воспроизводит эту ошибку, имеет небольшое приложение, названное вдоль линий RunWithDebugEnabled Который является небольшая программа Bootstrap, которая появляется, чтобы обострить свои собственные привилегии, а затем запустить исполняемый файл, передаваемый ему (таким образом наследство привилегии). При запуске с этой программой, используя один и тот же учетные данные администратора домена в приглашении UAC, программа работает правильно и может успешно звонить OpenProcess и работает как предназначено.

Так что это определенно проблема с приобретением правильных привилегий, и известно, что учетная запись администратора домена является Администраторная учетная запись, которая должна иметь возможность получить доступ к правильным правам. (Очевидно, что этот исходный код будет отличным, но я бы не был здесь, если это возможно).

Примечания

Как отмечалось, ошибки сообщили о неудаче OpenProcess попытки есть Access Denied. Отказ Согласно документации MSDN OpenProcess:

Если звонящий позволил привилегию SedebugPrivilege, запрошенный доступ предоставляется независимо от содержимого дескриптора безопасности.

Это приводит меня полагать, что, возможно, есть проблема в этих условиях с (1) получением SeDebugPrivileges или (2), требующие других привилегий, которые не были упомянуты в любой документации MSDN, и которые могут отличаться между учетной записью администратора домена и локальной учетной записью администратора.

Образец кода:

void sample()
{
   /////////////////////////////////////////////////////////
   //   Note: Enabling SeDebugPrivilege adapted from sample
   //     MSDN @ http://msdn.microsoft.com/en-us/library/aa446619%28VS.85%29.aspx
   // Enable SeDebugPrivilege
   HANDLE hToken = NULL;
   TOKEN_PRIVILEGES tokenPriv;
   LUID luidDebug;
   if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE)
   {
      if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE)
      {
         tokenPriv.PrivilegeCount           = 1;
         tokenPriv.Privileges[0].Luid       = luidDebug;
         tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
         if(AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, 0, NULL, NULL) != FALSE)
         {
            // Always successful, even in the cases which lead to OpenProcess failure
            cout << "SUCCESSFULLY CHANGED TOKEN PRIVILEGES" << endl;
         }
         else
         {
            cout << "FAILED TO CHANGE TOKEN PRIVILEGES, CODE: " << GetLastError() << endl;
         }
      }
   }
   CloseHandle(hToken);
   // Enable SeDebugPrivilege
   /////////////////////////////////////////////////////////

   vector<DWORD> pidList = getPIDs();  // Method that simply enumerates all current process IDs

   /////////////////////////////////////////////////////////
   // Attempt to open processes
   for(int i = 0; i < pidList.size(); ++i)
   {
      HANDLE hProcess = NULL;
      hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pidList[i]);
      if(hProcess == NULL)
      {
         // Error is occurring here under the given conditions
         cout << "Error opening process PID(" << pidList[i] << "): " << GetLastError() << endl;
      }
      CloseHandle(hProcess);
   }
   // Attempt to open processes
   /////////////////////////////////////////////////////////
}




Спасибо!

Если у кого-то есть некоторое представление о каких возможных разрешениях, привилегиях, правах и т. Д., Что мне может отсутствовать, чтобы правильно открыть другой процесс (при условии, что исполняемый файл был правильно «работает как администратор» ed) на Windows Vista и Windows 7 в приведенных вышеуказанных условиях Было бы наиболее высоко оценено.

Я бы не был здесь, если бы не был абсолютно тупой, но я надеюсь, что еще раз опыт и знания группы сияют яркими. Я благодарю вас за то, что нашли время, чтобы прочитать эту стену текста. Только хорошие намерения ценятся, спасибо за то, что это тот тип человека, который делает переполнение стека так полезно для всех!

Это было полезно?

Решение

Так после много отладки и беспокойства многих людей для информации, я наконец смог отследить парень, который написал RunWithDebugEnabled Приложение и получите подножку о том, как он работает.

Проблема, в этом случае, это то, что Debug programs Привилегия в местной политике для администратора домена была удалена, и, следовательно, SeDebugPrivilege Токен не присутствовал в токене доступа процесса. Он не может быть включен, если он вообще не присутствует, и я все еще не знаю, не могу добавить привилегию на существующий токен доступа.


Как текущие волшебные работы:
Итак RunWithDebugEnabled Magic Application будет использовать свои права администратора, чтобы установить себя как услугу и начать сам, при этом работает под SYSTEM Учетная запись пользователя, а не администратор домена. С участием SYSTEM Привилегии, приложение затем создает новый токен доступа, который идентичен токену администратора, только с SeDebugPrivilege токен присутствует. Этот новый токен используется для CreateProcessAsUser() и запустить программу с недавно включенным SeDebugPrivilege это было пропало раньше.

Я на самом деле не люблю это «решение» здесь, и продолжал свой поиск «чистого» способа получения этой привилегии. Я буду публиковать это как в другой вопрос здесь, на котором я постараюсь запомнить ссылку здесь, а также помогать другим следовать и для дальнейшего использования.

РЕДАКТИРОВАТЬ: Обеспечение системы (или эквивалент) от учетной записи администратора



Я благодарю вас всех за время и энергии, помогая отладить и решить эту проблему. Это действительно очень ценится!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top