Maison > développement back-end > C++ > Comment détecter de manière fiable les privilèges d'administrateur et élevés sous Windows ?

Comment détecter de manière fiable les privilèges d'administrateur et élevés sous Windows ?

DDD
Libérer: 2025-01-13 08:44:42
original
571 Les gens l'ont consulté

How to Reliably Detect Administrator and Elevated Privileges in Windows?

Comment détecter les droits d'administrateur avec ou sans privilèges élevés

Votre code actuel identifie avec succès le statut d'administrateur, mais échoue lors de la détermination des privilèges élevés. Pour résoudre ce problème de manière globale, nous explorerons une autre approche.

Vérifiez si l'UAC est activé

Tout d’abord, assurons-nous que le contrôle de compte d’utilisateur (UAC) est activé. L'UAC est une fonctionnalité de sécurité qui limite les modifications non autorisées du système d'exploitation. Si l'UAC est activé, nous aurons besoin d'une approche différente pour vérifier les privilèges élevés.

<code>RegistryKey uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false);
bool isUacEnabled = uacKey.GetValue(uacRegistryValue).Equals(1);</code>
Copier après la connexion

Confirmer les privilèges élevés du processus

Ensuite, vérifions le statut de privilège élevé du processus en cours. Si l'UAC est activé, nous utiliserons la fonction GetTokenInformation pour récupérer le type de promotion du token.

<code>IntPtr tokenHandle;
if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle))
{throw new ApplicationException("无法获取进程令牌。Win32 错误代码: " + Marshal.GetLastWin32Error());}

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);
    bool isProcessAdmin = elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull;
    return isProcessAdmin;
}</code>
Copier après la connexion

Si l'UAC n'est pas activé, nous pouvons compter sur WindowsPrincipal.IsInRole pour vérifier l'état de la promotion.

<code>WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool result = principal.IsInRole(WindowsBuiltInRole.Administrator);
return result;</code>
Copier après la connexion

Solution complète

En combinant ces deux méthodes, nous pouvons détecter de manière exhaustive si une application s'exécute avec des privilèges élevés, quel que soit l'état de l'UAC.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal