0

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

4

1 回答 1

0

非常害怕这种方法。它会正确地告诉您是否有拆分令牌,但这并不一定意味着任何有用的东西。

例如:

  • 如果禁用 UAC 会发生什么?您不会有拆分令牌。你会得到TokenElevationTypeDefault.
  • 如果您以.\Administrator帐户身份登录会发生什么?同样的,你会得到TokenElevationTypeDefault

两者都不意味着您是标准用户,这是将上述逻辑误用于“典型”案例的常见错误。

  • 如果您碰巧拥有一个,而且只有一个超级特权,并且您提升到将其放入您的令牌中怎么办?然后你就有了TokenElevationTypeFull——这经常被解释为意味着你是一个管理员。

无耻地摘自 Chris Jackson 的:如何确定用户是否是在 Windows Vista 上启用 UAC 的管理员组的成员

于 2014-01-03T03:41:07.277 回答