Vista で自分が現在、昇格実行されているかを調査するコード
VC++.NET 2003 にて動作確認済み。
// Microsoft SDK v6 WinNT.h (最新の SDK を入れている方は、この部分は不要です。)
#define TokenElevationType static_cast< TOKEN_INFORMATION_CLASS >( 18 )
typedef enum _TOKEN_ELEVATION_TYPE {
TokenElevationTypeDefault = 1,
TokenElevationTypeFull,
TokenElevationTypeLimited,
} TOKEN_ELEVATION_TYPE, *PTOKEN_ELEVATION_TYPE;
// 昇格が必要か
bool IsNeedHigher()
{
OSVERSIONINFO ovi = { sizeof ovi };
::GetVersionEx( &ovi );
if ( ovi.dwPlatformId != VER_PLATFORM_WIN32_NT || ovi.dwMajorVersion < 6 ) {
return false;
}
HMODULE hLib = ::LoadLibrary( _T( "advapi32.dll" ) );
if ( hLib == NULL ) {
return false;
}
typedef BOOL ( *LPFNOPENPROCESSTOKEN )( HANDLE, DWORD, PHANDLE );
typedef BOOL ( *LPFNGETTOKENINFORMATION )( HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD );
LPFNOPENPROCESSTOKEN lpfnOpenProcessToken = reinterpret_cast< LPFNOPENPROCESSTOKEN >( ::GetProcAddress( hLib, "OpenProcessToken" ) );
LPFNGETTOKENINFORMATION lpfnGetTokenInformation = reinterpret_cast< LPFNGETTOKENINFORMATION >( ::GetProcAddress( hLib, "GetTokenInformation" ) );
if ( lpfnOpenProcessToken == NULL || lpfnGetTokenInformation == NULL ) {
::FreeLibrary( hLib );
return false;
}
bool bResult = true;
HANDLE hToken = NULL;
if ( lpfnOpenProcessToken( ::GetCurrentProcess(), TOKEN_QUERY, &hToken ) ) {
DWORD dwLength = 0;
TOKEN_ELEVATION_TYPE tet;
lpfnGetTokenInformation( hToken, TokenElevationType, &tet, sizeof tet, &dwLength );
::CloseHandle( hToken );
if ( tet != TokenElevationTypeLimited ) {
bResult = false;
}
}
::FreeLibrary( hLib );
return bResult;
}
if ( lpfnOpenProcessToken == NULL || lpfnGetTokenInformation == NULL ) {
のところ、条件式が && になっていたのは間違い。 || じゃないとだめですよね。
ってことで修正しました。