首页 >后端开发 >C++ >如何可靠地检测 Windows 中的管理员和提升的权限?

如何可靠地检测 Windows 中的管理员和提升的权限?

DDD
DDD原创
2025-01-13 08:44:42575浏览

How to Reliably Detect Administrator and Elevated Privileges in Windows?

如何检测具有或不具有提升权限的管理员权限

您当前的代码成功识别了管理员状态,但在确定提升的权限时失败了。为了全面解决此问题,我们将探讨另一种方法。

检查 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn