Programming Windows Maniacs - プログラミング ウィンドウズ マニアックス ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて  
ホーム >> システム >> Administratorsグループに所属しているかどうか判定するには(Administrator権限かどうか判定するには)

Administratorsグループに所属しているかどうか判定するには(Administrator権限かどうか判定するには)

  Windows NT系では、Administratorsグループに所属しているか否かで、動作に影響が出ることが多いです。
  そこで、Windows Vistaでも管理者権限へ権限上昇しなくても"BULTIN\Administrators"グループに所属しているかどうかを判定するコードを記載しました。

  下記は、Administratorsグループに所属しているかどうか判定できます。
  ※ Windows 9x系でもIsAdministratorsGroup ()モジュールを含んで実行するのであれば、NT系の命令は LoadLibrary してください。

■■■ IsAdmin プロジェクト
■ main.cpp

//----------------------------------------------------------------------------------------------------
// "BUILTIN\\Administrators"グループに所属しているか
//   9xでもこのモジュールを含むのであれば、NT系の命令を LoadLibrary すること
//   IsAdministratorsGroup ()は、Vistaで権限上昇しなくても動作します
//----------------------------------------------------------------------------------------------------
#include <windows.h>
#include <tchar.h>

// 現在のアカウントが"BUILTIN\\Administrators"に所属しているか?
BOOL IsAdministratorsGroup ()
{
    // トークン取得
    HANDLE hToken;
    if ( !OpenProcessToken ( GetCurrentProcess(), TOKEN_QUERY, &hToken  ) )
    {
        return FALSE;
    }

    // バッファサイズ取得
    DWORD dwSize = 0;
    DWORD dwBuf = 0;
    if ( !GetTokenInformation ( hToken, TokenGroups, NULL, dwBuf, &dwSize ) )
    {
        DWORD dwResult = GetLastError ();
        if ( ERROR_INSUFFICIENT_BUFFER != dwResult )
        {
            return FALSE;
        }
    }

    // バッファ作成
    PTOKEN_GROUPS pGroupInfo;
    pGroupInfo = static_cast < PTOKEN_GROUPS > ( GlobalAlloc ( GMEM_FIXED | GMEM_ZEROINIT, dwSize ) );

    // グループ情報取得
    if( !GetTokenInformation ( hToken,
        TokenGroups,
        pGroupInfo,
        dwSize,
        &dwSize ) )
    {
        GlobalFree ( pGroupInfo );
        return FALSE;
    }

    // BUILTIN\Administrators の SID 作成
    SID_IDENTIFIER_AUTHORITY SIDAuth = SECURITY_NT_AUTHORITY;
    BYTE sidBuffer[ 1024 ];
    PSID pSID = static_cast < PSID > ( &sidBuffer );
    if( !AllocateAndInitializeSid ( &SIDAuth,
        2,
        SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0,
        &pSID ) )
    {
        GlobalFree ( pGroupInfo );
        return FALSE;
    }

    // SID探す
    BOOL bIsAdmin = FALSE;
    DWORD i;
    enum
    {
        MAX_NAME_SIZE = 1024
    };
    _TCHAR szName[ MAX_NAME_SIZE ];
    _TCHAR szDomain[ MAX_NAME_SIZE ];
    SID_NAME_USE sidNameUse;
    for ( i = 0; i < pGroupInfo->GroupCount; i++ )
    {
        if ( EqualSid ( pSID, pGroupInfo->Groups[i].Sid ) )
        {
            dwSize = MAX_NAME_SIZE;
            if( !LookupAccountSid ( NULL,
                pGroupInfo->Groups[i].Sid,
                szName, &dwSize,
                szDomain, &dwSize,
                &sidNameUse ) )
            {
                // エラー
                break;
            }

            if ( 0 == lstrcmpi ( _TEXT ( "BUILTIN" ), szDomain )
                && 0 == lstrcmpi ( _TEXT ( "Administrators" ), szName ) )
            {
                bIsAdmin = TRUE;
                break;
            }

        }
    }

    FreeSid ( pSID );
    GlobalFree ( pGroupInfo );

    return bIsAdmin;
}


int WINAPI _tWinMain ( HINSTANCE,
    HINSTANCE,
    _TCHAR *,
    int )
{
    if ( IsAdministratorsGroup () )
    {
        MessageBox ( NULL,
            _TEXT ( "このアプリケーションを実行したアカウントは\n管理者グループ(Administratorsグループ)に所属しています" ),
            _TEXT ( "確認" ),
            MB_OK );
    }
    else
    {
        MessageBox ( NULL,
            _TEXT ( "このアプリケーションを実行したアカウントは\n管理者グループ(Administratorsグループ)に所属していません" ),
            _TEXT ( "確認" ),
            MB_OK | MB_ICONSTOP );
    }
    return 0;
}
  ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて Copyright © 2014 A.Morita