Maison >développement back-end >C++ >Comment puis-je déterminer de manière fiable si un processus s'exécute avec des privilèges élevés ?

Comment puis-je déterminer de manière fiable si un processus s'exécute avec des privilèges élevés ?

DDD
DDDoriginal
2025-01-13 08:19:43922parcourir

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

Détermination précise de l'administrateur et des privilèges élevés

L'extrait de code fourni identifie avec précision le statut d'administrateur, mais ne permet pas de faire la différence entre les droits d'administrateur standard et les privilèges élevés. Cette amélioration résout cette limitation.

La solution implique une approche raffinée de la détermination de l'état d'élévation :

Méthode IsProcessElevated améliorée :

Cette méthode améliorée exploite la fonction GetTokenInformation pour déterminer directement le niveau d'élévation du processus, en tenant compte des paramètres de contrôle de compte d'utilisateur (UAC) :

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

Cette méthode gère de manière robuste les scénarios avec ou sans UAC, fournissant une détermination fiable des privilèges élevés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn