Windows Vista 以降にはユーザーアカウント制御 (UAC: User Account Control) という機能があって、有効だと Administrators グループに属していてもデフォルトでは管理者権限は使えず、明示的に昇格することで使えるようになります。(デフォルトで有効)

さて、管理者権限で動いているかどうかですが、例えばコマンドプロンプトだとタイトルバーに表示されています。
コマンドプロンプトの管理者権限状態表示

つまりプログラムからチェックすることができるわけですね。

UAC が内部的にどういう実装になっているかは置いといて、管理者権限で動いているかどうかは以下のコードでチェックすることができます。

static const char *typestr[] = { "undef", "default", "full", "limited" };

int main(int argc, char **argv)
{
    HANDLE hToken;
    TOKEN_ELEVATION elevation;
    TOKEN_ELEVATION_TYPE elevtype;
    DWORD cb;

    OpenProcessToken(GetCurrentProcess(), GENERIC_READ, &hToken);

    GetTokenInformation(hToken, TokenElevation, &elevation, sizeof(elevation), &cb);
    printf("Token is %s\n", elevation.TokenIsElevated ? "elevated" : "not elevated");

    GetTokenInformation(hToken, TokenElevationType, &elevtype, sizeof(elevtype), &cb);
    printf("Token elevation type is %s\n", typestr[elevtype]);

    CloseHandle(hToken);

    return 0;
}

これを実行すると、以下のような出力になります。(※注: Windows 7 でしか試していません)

UAC 有効 UAC 無効
管理者ユーザ 未昇格 not elevated
type limited
昇格 elevated
type full
elevated
type default
一般ユーザ not elevated
type default

つまり、

  • 管理者権限を使える状態であれば TokenElevation で TokenIsElevated が TRUE になる。
  • 昇格ができないor不要である状態であれば TokenElevationType が TokenElevationTypeDefaultになる。
  • 昇格が必要なのに昇格していない状態であれば TokenElevationTypeLimited、昇格している状態であれば TokenElevationTypeFullになる。

ということになります。

Trackback

no comment untill now

Add your comment now