Frage

Alles, was ich habe in der Lage zu eskalieren zu den entsprechenden Berechtigungen für meine Bedürfnisse zu finden hat mit meinen derzeitigen Methoden vereinbart, aber das Problem besteht. Ich hoffe, dass vielleicht jemand etwas Windows Vista / Windows 7 Interna Erfahrung hat, die etwas Licht leuchten könnte, wo es nur Dunkelheit. Ich bin sicher, dass dies lange erhalten, aber bitte Geduld mit mir.

Kontext

Ich arbeite an einer Anwendung, die die Erinnerung an anderen Prozessen auf der aktuellen Maschine erfordert den Zugriff. Dies ist offensichtlich, sind Administratorrechte erforderlich. Es erfordert auch SeDebugPrivilege (nein, es nicht eine falsche Schreibweise von SetDebugPrivilege ist), die ich selbst glaube Erwerb richtig, obwohl ich Frage, ob mehr Privilegien nicht notwendig sind und somit die Ursache für meine Probleme. Code gearbeitet hat bisher erfolgreich auf allen Versionen von Windows XP und auf meinem Test Vista 32 Bit und Windows 7 64-Bit-Umgebungen.

Prozess

  • Programm wird immer mit Administratorrechten ausgeführt werden. Dies kann in diesem Beitrag nicht übernommen werden.
  • Die Ausweitung der aktuelle Prozess der Access Token SeDebugPrivilege Rechte aufzunehmen.
  • Verwenden EnumProcesses eine Liste der aktuellen PIDs auf dem System zu erstellen
  • Öffnen eines Griffs mit OpenProcess mit PROCESS_ALL_ACCESS Zugriffsrechte
  • ReadProcessMemory Mit dem Speicher des anderen Prozesses zu lesen.

Problem:

Alles wurde während der Entwicklung und meine persönliche Prüfung (einschließlich Windows XP 32 und 64, Windows Vista 32 und Windows 7 x64) arbeiten gut. Doch während einer Testbereitstellung auf sowohl unter Windows Vista (32-bit) und Windows 7 (64-bit) Maschinen eines Kollegen scheint es ein Privileg / Rechtsproblem mit OpenProcess mit einem generischen Access Denied Fehlern scheitern. Dies geschieht sowohl, wenn sie als Benutzer mit eingeschränkten Rechten ausgeführt wird (wie zu erwarten), und wenn auch explizit als Administrator (Rechtsklick ? Als Administrator ausführen und wenn sie von einem Administrator-Ebene Eingabeaufforderung) ausgeführt werden.

Allerdings hat dieses Problem nicht reproduzierbar gewesen für mich in meiner Testumgebung. Ich habe das Problem aus erster Hand erlebt, so dass ich hoffe, dass das Problem existiert. Der einzige Unterschied ist, dass ich zwischen der tatsächlichen Umgebung und meiner Testumgebung erkennen kann, ist, dass die eigentliche Fehler auftreten, wenn ein Domänenadministratorkonto an der UAC-Eingabeaufforderung verwenden, während meiner Tests (die Arbeit ohne Fehler) verwenden, um ein lokales Administratorkonto an der UAC-Eingabeaufforderung.

Es scheint, dass, obwohl die Anmeldeinformationen UAC verwendet werden, damit ‚Als Administrator ausführen‘, der Prozess zu erhalten, ist immer noch nicht die richtigen Rechte an der Lage sein, OpenProcess auf einem anderen Prozess. Ich bin nicht vertraut genug mit den Interna von Vista / Windows 7 zu wissen, was das auch sein mag, und ich bin die Hoffnung, jemand eine Vorstellung davon hat, was die Ursache sein könnte.

Die Kicker

Die Person, die diesen Fehler gemeldet hat, und die Umgebung ist kann diesen Fehler regelmäßig reproduzieren, hat eine kleine Anwendung entlang der Linien von RunWithDebugEnabled benannt, die ein kleines Bootstrap-Programm, das seine eigenen Privilegien zu eskalieren erscheint, und starten Sie dann die ausführbare Datei übergeben es (so die erweiterten Rechten vererben). Wenn mit diesem Programm ausführen, die gleichen Domänenadministratoranmeldeinformationen an der UAC-Dialog verwenden, arbeitet das Programm korrekt und in der Lage, erfolgreich aufrufen OpenProcess und wie vorgesehen funktioniert.

Das ist also definitiv ein Problem mit den richtigen Privilegien zu erwerben,und es ist bekannt, dass das Domain-Administrator-Konto ist ein Administratorkonto, sollte in der Lage, die richtigen Rechte für den Zugriff. (Offensichtlich diesen Quellcode zu erhalten wäre toll, aber ich wäre nicht hier, wenn das möglich wäre).

Notizen

Wie bereits erwähnt, berichteten die Fehler, die durch den ausgefallenen OpenProcess Versuche sind Access Denied. Laut MSDN Dokumentation von OpenProcess :

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

Dies führt mich zu glauben, dass vielleicht gibt es ein Problem unter diesen Bedingungen entweder mit (1) Gewinnung SeDebugPrivileges oder (2) Erfordern andere Privilegien, die nicht in irgendeiner MSDN-Dokumentation erwähnt haben, und die zwischen einem Domänenadministratorkonto abweichen und ein lokales Administratorkonto

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




Danke!

Wenn jemand einen kleinen Einblick in das, was möglich Berechtigungen, Privilegien, Rechte, usw., dass ich richtig einen anderen Prozess öffnen fehlt möglicherweise zu (vorausgesetzt, die ausführbare Datei war richtig „Ausführen als Administrator“ ed) unter Windows Vista und Windows 7 unter die oben genannten Bedingungen wäre es die meisten sehr geschätzt.

Ich wäre nicht hier, wenn ich nicht absolut war ratlos, aber ich bin zuversichtlich, dass wieder einmal die Erfahrung und das Wissen der Gruppe hell glänzen. Ich danke Ihnen für die Zeit nehmen diese Wand von Text zu lesen. Die guten Absichten allein geschätzt, vielen Dank für die Art von Person zu sein, die Stack-Überlauf so nützlich für alle macht!

War es hilfreich?

Lösung

So nach viel Debugging und eine Menge Leute für Informationen zu belästigen, konnte ich endlich den Mann aufzuspüren, der die RunWithDebugEnabled Anwendung geschrieben und erhalten einen Überblick darüber, wie es funktioniert.

Das Problem in diesem Fall ist, dass Debug programs Privileg in der lokalen Politik für den Domain-Administrator entfernt worden war und damit die SeDebugPrivilege Token nicht vorhanden war, in dem Zugriffstoken des Prozesses. Es kann nicht aktiviert werden, wenn es überhaupt nicht vorhanden ist, und ich weiß immer noch keine Möglichkeit, das Privileg zu einem vorhandenen Zugriffstoken hinzuzufügen.


Wie die aktuelle Magie funktioniert:
So ist die RunWithDebugEnabled magische Anwendung ihre Administratorrechte verwenden, würde sich als Dienst zu installieren und zu sich selbst starten, damit unter dem SYSTEM Benutzer ausgeführt Konto statt der Domain-Administrator. Mit SYSTEM Privilegien, erstellt die App dann einen neuen Zugriffstoken, dass die Administrator-Token identisch ist, nur mit der SeDebugPrivilege Token vorhanden. Diese neuen Token werden zu CreateProcessAsUser() verwendet und das Programm mit der neu aktivierten SeDebugPrivilege laufen, der fehlt.

ich eigentlich nicht wie diese „Lösung“ hier und habe meine Suche nach einer ‚sauberere‘ Art und Weise wurde weiterhin dieses Privileg zu erhalten. Ich werde dies als eine andere Frage hier auf SO sein Posting, die ich auch hier daran zu erinnern, werden versuchen, zu verknüpfen anderen helfen folgen zusammen und für die Zukunft.

EDIT: Impersonate SYSTEM (oder gleichwertig) von Administrator-Konto


Ich danke Ihnen allen für Ihre Zeit und Energie in das Debuggen zu helfen und lösen dieses Problem. Es ist wirklich sehr zu schätzen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top