プロセスの昇格タイプを確認するサンプルコードです。カレントプロセスの昇格タイプがTOKEN_ELEVATION_TYPE::TokenElevationTypeFull
か確かめることで管理者権限を確認できます。
#include <optional> #define STRICT #define NOMINMAX #include <Windows.h> std::optional<TOKEN_ELEVATION_TYPE> GetProcessElevationType(HANDLE ProcessHandle) noexcept { std::optional<TOKEN_ELEVATION_TYPE> Result{}; HANDLE TokenHandle; if (::OpenProcessToken(ProcessHandle, TOKEN_QUERY, &TokenHandle)) { TOKEN_ELEVATION_TYPE ElevationType; DWORD Size = sizeof(TOKEN_ELEVATION_TYPE); if (::GetTokenInformation( TokenHandle, TOKEN_INFORMATION_CLASS::TokenElevationType, &ElevationType, Size, &Size)) { Result = ElevationType; } ::CloseHandle(TokenHandle); } return Result; } inline std::optional<TOKEN_ELEVATION_TYPE> GetCurrentProcessElevationType() noexcept { return GetProcessElevationType(GetCurrentProcess()); } inline bool IsCurrentProcessElevationTypeDefault() { auto ElevationType = GetCurrentProcessElevationType(); if (!ElevationType) return false; return *ElevationType == TOKEN_ELEVATION_TYPE::TokenElevationTypeDefault; } inline bool IsCurrentProcessElevationTypeLimited() { auto ElevationType = GetCurrentProcessElevationType(); if (!ElevationType) return false; return *ElevationType == TOKEN_ELEVATION_TYPE::TokenElevationTypeLimited; } inline bool IsCurrentProcessElevationTypeFull() { auto ElevationType = GetCurrentProcessElevationType(); if (!ElevationType) return false; return *ElevationType == TOKEN_ELEVATION_TYPE::TokenElevationTypeFull; } int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) { auto ElevationTypeDefault = IsCurrentProcessElevationTypeDefault(); auto ElevationTypeLimited = IsCurrentProcessElevationTypeLimited(); auto ElevationTypeFull = IsCurrentProcessElevationTypeFull(); // 通常権限で起動 :FTF(起動プロセス・ユーザーの権限に依存) // 管理者権限で起動:FFT return 0; }