2011-01-14 17 views
3

Ich suche nach einer Möglichkeit zu überprüfen, dass ein Remote-Prozess Administratorrechte von meinem (vollständig verwalteten) Code hat. Es ist davon auszugehen, dass mein Code mit Administratorrechten ausgeführt wird, also ist mir egal, wie invasiv die Technik ist, um mein Ziel zu erreichen, aber ich suche nach einem vollständig verwalteten Weg, der mit XP SP3 x86 kompatibel sein muss Der Weg nach unten zu win7 x64.Überprüfen Sie, ob ein anderer Prozess Administratorrechte in .NET hat.

Vielen Dank im Voraus!

Bearbeiten: Um zu verdeutlichen, ich spreche über einen Prozess läuft auf dem gleichen Computer, unabhängig von dem Benutzer, der es gestartet hat. Ich möchte sicherstellen, dass entweder die mit dem Prozess verbundene Identität der Gruppe Administratoren angehört oder dass der Hauptthread über vollständige Berechtigungen verfügt, mit besonderer Berücksichtigung von Ergriffenen, die von erhöhten Prozessen geöffnet wurden, und Schreiben in den Speicher ohne Einschränkung, aber für Prozesse wurde mit der Option "Als Administrator ausführen" erstellt.

+0

Remote-Prozess ... Wie, * läuft auf einer anderen Maschine? * Unter einem anderen Benutzerkonto? Oder nur ... ein separater Prozess von dem, der die Prüfroutine ausführt? – Shog9

+0

Nur ein separater Prozess auf demselben Computer, unabhängig von dem Benutzerkonto, von dem es ausgeführt wird. Alles, was mit einem OpenProcess-Aufruf aus dem laufenden Prozess geöffnet werden kann. – em70

+0

Wie bewerten Sie einen Prozess mit Administratorrechten? Bedeutet dies, dass das Konto, das den Prozess gestartet hat, in der Admin-Gruppe ist? Oder dass ein Privileg gewährt wurde? Müssen alle Threads über diese Berechtigung oder Identität verfügen? –

Antwort

4

Open (PROCESS_QUERY_INFORMATION) + OpenProcessToken (TOKEN_QUERY) das Token zu erhalten, übergeben Sie dann das Token und die SID aus CreateWellKnownSid (WinBuiltinAdministratorsSid) zu CheckTokenMembership()

der Lage sein, (fast) zu öffnen jeden Prozess für PROCESS_QUERY_INFORMATION Zugriff müssen Sie als Administrator und mit debug privileges ausgeführt werden.

+0

Debug-Privilegien sind kein Problem, Ihre Lösung beinhaltet jedoch viele P/Invoice-Aufrufe. Wissen Sie, ob einige dieser Funktionen für einen schlankeren Prozess verpackt wurden? In der Zwischenzeit, +1 :) – em70

+0

Ich weiß .NET nicht gut genug, um mit einer Liste von alternativen nativen Funktionen zu kommen, aber ich weiß, dass CheckTokenMembership mehr als eine einfache Überprüfung der SIDs in einem Token, da es sich mit Verweigern Sie SIDs usw., wenn die entsprechende .NET-Funktion (falls vorhanden) nicht dokumentiert ist, um CheckTokenMembership intern aufzurufen, glaube ich nicht, dass die Verwendung sicher wäre. – Anders

1

Sie könnten GetTokenInformation oder IsUserAnAdmin API-Aufrufe verwenden.

+0

Ich kann Code aus diesem Prozess nicht ausführen, wenn ich es injiziere. Außerdem hat keine der Methoden, von denen ich gesprochen habe, native Implementierungen. – em70

0

Um zu überprüfen, ob der Prozess mit Benutzer aus der administrativen Gruppe gestartet wurde, sollten Sie die von Anders beschriebene Methode verwenden. Um die Integritätsebene unter Vista oder Windows 7 zu überprüfen, verwenden Sie GetTokenInformation mit der spezifizierenden Tokenklasse TokenIntegrityLevel, um die Struktur TOKEN_MANDATORY_LABEL zu erhalten, die die SID enthält, die dem obligatorischen Integritätslevel des Tokens zugeordnet ist.

+0

TokenIntegrityLevel existiert nicht auf XP, Sie müssten auch umgehen mit UAC ausgeschaltet auf NT6 +, so dass Sie CheckTokenMembership aufrufen müssen, egal was. Das Überprüfen des Integritätslevels wäre nur sinnloser zusätzlicher Code. – Anders

+0

Ich habe Ihren Punkt über deaktivierte UAC nicht verstanden. Könnten Sie bitte klären? – DReJ

+0

@DReJ: Wenn UAC deaktiviert ist, ist das System ziemlich nah an XP, keine Split-Token etc – Anders

Verwandte Themen