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