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