Windows Vista / Windows 7-Berechtigung: SeDebugPrivilege & OpenProcess

Alles, was ich über die Eskalation zu den für meine Bedürfnisse geeigneten Berechtigungen finden konnte, ist mit meinen aktuellen Methoden einverstanden, aber das Problem besteht. Ich hoffe, vielleicht hat jemand einige Windows Vista / Windows 7-interne Erfahrungen, die etwas Licht scheinen könnten, wo es nur Dunkelheit gibt. Ich bin mir sicher, dass es noch lange dauern wird, aber bitte nehmen Sie es mit mir.

Kontex

Ich arbeite an einer Anwendung, die den Zugriff auf den Speicher anderer Prozesse auf dem aktuellen Computer erfordert. Dies erfordert natürlich Administratorrechte. Es erfordert auchSeDebugPrivilege (nein, es ist kein Rechtschreibfehler vonSetDebugPrivilege), von dem ich glaube, dass ich es richtig erwerbe, obwohl ich frage, ob keine weiteren Berechtigungen erforderlich sind und damit die Ursache für meine Probleme. Code hat bisher auf allen Versionen von Windows XP und in meinen Testumgebungen mit Vista 32 Bit und Windows 7 64 Bit erfolgreich funktioniert.

ProzesProgramm wirdImme mit Administratorrechten ausgeführt werden. Dies kann in diesem Beitrag vorausgesetzt werden. Skalieren des aktuellen ProzessesAccess Token einschließenSeDebugPrivilege rights.UsingEnumProcesses, um eine Liste der aktuellen PIDs auf dem System zu erstellen.Öffnen eines Handles mitOpenProcess mitPROCESS_ALL_ACCESS ZugangsrechtUsingReadProcessMemory, um den Speicher des anderen Prozesses zu lesen.Problem

Alles hat während der Entwicklung und meiner persönlichen Tests (einschließlich Windows XP 32 und 64, Windows Vista 32 und Windows 7 x64) einwandfrei funktioniert. Während einer Testbereitstellung auf Windows Vista (32-Bit) - und Windows 7 (64-Bit) -Maschinen eines Kollegen scheint jedoch ein Berechtigungs- / Rechteproblem mit @ zu besteheOpenProcess Scheitern mit einem generischenAccess Denied Error. Dies tritt sowohl bei Ausführung als eingeschränkter Benutzer (wie zu erwarten) als auch bei expliziter Ausführung als Administrator auf (Rechtsklick → Als Administrator ausführen und bei Ausführung über eine Eingabeaufforderung auf Administratorebene.

Dieses Problem war jedoch für mich in meiner Testumgebung nicht reproduzierbar. Ich habe das Problem aus erster Hand miterlebt und vertraue darauf, dass das Problem besteht. Der einzige Unterschied, den ich zwischen der tatsächlichen Umgebung und meiner Testumgebung feststellen kann, ist, dass dastatsächlic Fehler tritt auf, wenn ein Domänenadministratorkonto an der UAC-Eingabeaufforderung verwendet wird, während meine Tests (die fehlerfrei funktionieren) ein lokales Administratorkonto an der UAC-Eingabeaufforderung verwenden.

Obwohl die verwendeten Anmeldeinformationen es der Benutzerkontensteuerung ermöglichen, als Administrator ausgeführt zu werden, erhält der Prozess immer noch nicht die richtigen Rechte, um @ zu könneOpenProcess auf einem anderen Prozess. Ich kenne die Interna von Vista / Windows 7 nicht gut genug, um zu wissen, woran das liegen könnte, und ich hoffe, dass jemand eine Idee hat, woran das liegen könnte.

The Kicker

Die Person, die diesen Fehler gemeldet hat und deren Umgebung diesen Fehler regelmäßig reproduzieren kann, hat eine kleine Anwendung mit dem NamenRunWithDebugEnabled ist ein kleines Bootstrap-Programm, das anscheinend seine eigenen Berechtigungen eskaliert und dann die übergebene ausführbare Datei startet (wodurch die eskalierten Berechtigungen übernommen werden). Wenn das Programm mit diesem Programm ausgeführt wird und an der UAC-Eingabeaufforderung dieselben Domänenadministrator-Anmeldeinformationen verwendet, funktioniert es ordnungsgemäß und kann erfolgreich @ aufrufeOpenProcess und funktioniert wie vorgesehen.

So ist dies definitiv ein Problem beim Erwerb der richtigen Berechtigungen, und es ist bekannt, dass das Domänenadministratorkonto ist ein Administratorkonto, das auf die richtigen Rechte zugreifen kann. (Offensichtlich wäre es toll, diesen Quellcode zu erhalten, aber ich wäre nicht hier, wenn das möglich wäre.)

Anmerkunge

ie bereits erwähnt, werden die Fehler durch das fehlgeschlagene @ gemeldeOpenProcess Versuche sindAccess Denied. Laut MSDN-Dokumentation vonOpenProcess:

Wenn der Aufrufer das SeDebugPrivilege-Privileg aktiviert hat, wird der angeforderte Zugriff unabhängig vom Inhalt der Sicherheitsbeschreibung gewährt.

Dies lässt mich glauben, dass es unter diesen Bedingungen möglicherweise ein Problem gibt, entweder mit (1) Erhalten vonSeDebugPrivileges oder (2) Erfordern anderer Berechtigungen, die in keiner MSDN-Dokumentation erwähnt wurden und die sich zwischen einem Domänenadministratorkonto und einem lokalen Administratorkonto unterscheiden können.

Beispielcode
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
   /////////////////////////////////////////////////////////
}




Vielen Dank

Wenn jemand einen Einblick in die möglichen Berechtigungen, Privilegien, Rechte usw. hat, die mir möglicherweise fehlen, um einen anderen Prozess korrekt zu öffnen (vorausgesetzt, die ausführbare Datei wurde unter Windows Vista und Windows 7 ordnungsgemäß als Administrator ausgeführt) Bedingungen, es wäre sehr dankbar.

Ich wäre nicht hier, wenn ich nicht absolut verblüfft wäre, aber ich hoffe, dass die Erfahrung und das Wissen der Gruppe wieder einmal hell erstrahlen. Ich danke Ihnen, dass Sie sich die Zeit genommen haben, diese Textwand zu lesen. Alleine die guten Absichten werden geschätzt, danke, dass Sie der Typ sind, der Stack Overflow für alle so nützlich macht!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage