如何检测具有或不具有提升权限的管理员权限
您当前的代码成功识别了管理员状态,但在确定提升的权限时失败了。为了全面解决此问题,我们将探讨另一种方法。
检查 UAC 是否启用
首先,让我们确定用户帐户控制 (UAC) 是否已启用。UAC 是一种安全功能,可限制对操作系统的未经授权的更改。如果启用了 UAC,我们将需要采用不同的方法来检查提升权限。
<code>RegistryKey uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false); bool isUacEnabled = uacKey.GetValue(uacRegistryValue).Equals(1);</code>
确定进程提升权限
接下来,让我们检查当前进程的提升权限状态。如果启用了 UAC,我们将使用 GetTokenInformation
函数来检索令牌提升类型。
<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>
如果未启用 UAC,我们可以依靠 WindowsPrincipal.IsInRole
来检查提升状态。
<code>WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); bool result = principal.IsInRole(WindowsBuiltInRole.Administrator); return result;</code>
完整解决方案
通过结合这两种方法,我们可以全面检测应用程序是否以提升的权限运行,而不管 UAC 状态如何。
以上是如何可靠地检测 Windows 中的管理员和提升的权限?的详细内容。更多信息请关注PHP中文网其他相关文章!