Heim >Backend-Entwicklung >C++ >Wie kann ich zuverlässig feststellen, ob ein Prozess mit erhöhten Berechtigungen ausgeführt wird?

Wie kann ich zuverlässig feststellen, ob ein Prozess mit erhöhten Berechtigungen ausgeführt wird?

DDD
DDDOriginal
2025-01-13 08:19:43920Durchsuche

How Can I Reliably Determine if a Process is Running with Elevated Privileges?

Präzise Bestimmung von Administrator- und erhöhten Berechtigungen

Das bereitgestellte Code-Snippet identifiziert den Administratorstatus genau, es fehlt jedoch die Möglichkeit, zwischen Standardadministratorrechten und erhöhten Berechtigungen zu unterscheiden. Diese Verbesserung behebt diese Einschränkung.

Die Lösung beinhaltet einen verfeinerten Ansatz zur Bestimmung des Höhenstatus:

Verbesserte IsProcessElevatedMethode:

Diese erweiterte Methode nutzt die Funktion GetTokenInformation, um die Prozesshöhenstufe direkt zu ermitteln und dabei die Einstellungen der Benutzerkontensteuerung (UAC) zu berücksichtigen:

<code class="language-csharp">public static bool IsProcessElevated
{
    get
    {
        // Check UAC status
        if (UacHelper.IsUacEnabled)
        {
            // Obtain process token
            IntPtr tokenHandle;
            if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle))
            {
                throw new ApplicationException($"Failed to retrieve process token. Win32 Error Code: {Marshal.GetLastWin32Error()}");
            }

            // Retrieve elevation type
            TOKEN_ELEVATION_TYPE elevationResult = TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault;
            int elevationResultSize = Marshal.SizeOf((int)elevationResult);
            uint returnedSize = 0;
            IntPtr elevationTypePtr = Marshal.AllocHGlobal(elevationResultSize);

            bool success = GetTokenInformation(tokenHandle, TOKEN_INFORMATION_CLASS.TokenElevationType, elevationTypePtr, (uint)elevationResultSize, out returnedSize);
            if (success)
            {
                elevationResult = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(elevationTypePtr);
                return elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull;
            }
            else
            {
                throw new ApplicationException("Elevation status determination failed.");
            }
        }
        else
        {
            // Fallback to standard administrator check if UAC is disabled
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
    }
}</code>

Diese Methode verarbeitet zuverlässig sowohl UAC-aktivierte als auch UAC-deaktivierte Szenarien und ermöglicht eine zuverlässige Bestimmung erhöhter Berechtigungen.

Das obige ist der detaillierte Inhalt vonWie kann ich zuverlässig feststellen, ob ein Prozess mit erhöhten Berechtigungen ausgeführt wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn