potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C++20&WinAPI プロセスの昇格タイプ(管理者権限等)を確認する

プロセスの昇格タイプを確認するサンプルコードです。カレントプロセスの昇格タイプが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;
}