我有一些代码可以在除 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 并重新启动计算机”。有谁知道怎么回事?