我有一些代码可以在除 Windows Server 2008 64 位之外的所有 Windows 操作系统上正常工作。此代码确定是否打开 UAC。
int TokenInfLength = 0;
布尔结果;
// 第一次调用获取 TokenInformation 的长度
结果 = GetTokenInformation(WindowsIdentity.GetCurrent().Token, TOKEN_INFORMATION_CLASS.TokenElevationType, IntPtr.Zero, TokenInfLength, out TokenInfLength);
IntPtr TokenInformation = Marshal.AllocHGlobal(TokenInfLength);
结果 = GetTokenInformation(WindowsIdentity.GetCurrent().Token, TOKEN_INFORMATION_CLASS.TokenElevationType, TokenInformation, TokenInfLength, out TokenInfLength);
如果(结果)
{
TOKEN_ELEVATION_TYPE 海拔类型 = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(TokenInformation);
Marshal.FreeHGlobal(TokenInformation);
开关(海拔类型)
{
case TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault:
Console.WriteLine("UAC (User Account Control) 在您的操作系统中已关闭。请打开 UAC 并重新启动您的计算机。"); 休息;
案例 TOKEN_ELEVATION_TYPE.TokenElevationTypeFull:
Console.WriteLine("用户有一个拆分令牌,并且进程正在运行提升");
休息;
案例 TOKEN_ELEVATION_TYPE.TokenElevationTypeLimited:
Console.WriteLine("用户有一个拆分令牌,但进程没有运行提升");
休息;
}
}
...
枚举 TOKEN_ELEVATION_TYPE : int
{
TokenElevationTypeDefault = 1,
TokenElevationTypeFull,
TokenElevationTypeLimited
}
枚举 TOKEN_INFORMATION_CLASS
{
令牌用户 = 1,
代币组,
代币特权,
代币所有者,
TokenPrimaryGroup,
TokenDefaultDacl,
代币来源,
令牌类型,
TokenImpersonationLevel,
代币统计,
TokenRestrictedSids,
令牌会话 ID,
令牌组和特权,
令牌会话参考,
TokenSandBoxInert,
TokenAuditPolicy,
代币来源,
TokenElevationType,
TokenLinkedToken,
代币高度,
TokenHasRestrictions,
令牌访问信息,
TokenVirtualizationAllowed,
TokenVirtualizationEnabled,
代币完整性等级,
令牌UI访问,
TokenMandatoryPolicy,
TokenLogonSid,
MaxTokenInfoClass
}
TOKEN_INFORMATION_CLASS.TokenElevationType是一个枚举常量,其序数值为 18。
因此,在 WS 2008 64 位上启用了我的 UAC 后,我收到消息“UAC(用户帐户控制)在您的操作系统中已关闭。请打开 UAC 并重新启动计算机”。有谁知道怎么回事?