0

Windows Server 2008 64 ビットを除くすべての Windows OS で正常に動作するコードがいくつかあります。このコードは、UAC がオンになっているかどうかを判別します。

int TokenInfLength = 0;
bool 結果;
// 最初の呼び出しで 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);

if (結果)
{
    TOKEN_ELEVATION_TYPE elevationType = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(TokenInformation);
    Marshal.FreeHGlobal(TokenInformation);

    スイッチ (標高タイプ)
    {
        case TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault:
            Console.WriteLine("お使いのオペレーティング システムで UAC (ユーザー アカウント制御) がオフになっています。UAC をオンにして、コンピューターを再起動してください。"); 壊す;
        case TOKEN_ELEVATION_TYPE.TokenElevationTypeFull:
            Console.WriteLine("ユーザーには分割トークンがあり、プロセスは昇格して実行されています");
            壊す;
        ケース TOKEN_ELEVATION_TYPE.TokenElevationTypeLimited:
            Console.WriteLine("ユーザーは分割トークンを持っていますが、プロセスは昇格して実行されていません");
            壊す;
    }
}

...

enum TOKEN_ELEVATION_TYPE : int
{
    TokenElevationTypeDefault = 1、
    TokenElevationTypeFull、
    TokenElevationTypeLimited
}
enum TOKEN_INFORMATION_CLASS
{
    トークンユーザー = 1、
    トークングループ、
    TokenPrivileges、
    トークン所有者、
    TokenPrimaryGroup、
    TokenDefaultDacl、
    トークンソース、
    トークンタイプ、
    TokenImpersonationLevel、
    トークン統計、
    TokenRestrictedSids、
    TokenSessionId、
    TokenGroupsAndPrivileges、
    TokenSessionReference、
    TokenSandBox不活性、
    TokenAuditPolicy、
    TokenOrigin、
    TokenElevationType、
    TokenLinkedToken、
    TokenElevation、
    TokenHasRestrictions、
    トークンアクセス情報、
    トークン仮想化許可、
    TokenVirtualizationEnabled、
    TokenIntegrityLevel、
    TokenUIAccess、
    TokenMandatoryPolicy、
    TokenLogonSid、
    MaxTokenInfoClass
}

TOKEN_INFORMATION_CLASS.TokenElevationType序数値が 18 の enum const です。

そのため、WS 2008 64 ビットで UAC を有効にすると、「オペレーティング システムで UAC (ユーザー アカウント制御) がオフになっています。UAC をオンにして、コンピューターを再起動してください」というメッセージが表示されます。誰が問題を知っていますか?

4

1 に答える 1

0

このアプローチを非常に恐れてください。分割トークンを持っているかどうかは正しくわかりますが、それは必ずしも有用なことを意味するわけではありません。

例えば:

  • UAC を無効にするとどうなりますか? 分割トークンはありません。あなたは得るでしょうTokenElevationTypeDefault
  • .\Administratorアカウントとしてログインするとどうなりますか? 同じこと、あなたは得るでしょうTokenElevationTypeDefault

どちらも、あなたが標準ユーザーであることを意味しません。これは、上記のロジックを「典型的な」ケースに誤って適用することによるよくある間違いです。

  • たまたま 1 つだけのスーパー特権を持っていて、昇格してトークンにそれを取得した場合はどうなるでしょうか? TokenElevationTypeFullこれは、管理者であることを意味すると解釈されることがよくあります。

Chris Jackson の「Windows Vista で UAC が有効になっているユーザーが管理者グループのメンバーであるかどうかを判断する方法」から恥知らずに取り上げられました。

于 2014-01-03T03:41:07.277 に答える