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;
} |
|