12月
02
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になる。
ということになります。
no comment untill now