最新获取操作系统信息函数

130 篇文章 1 订阅
void CGetPCInfo::GetOS(string& os)
{
	/*Windows 10							10.0*		10	0	OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
	Windows Server 2016 Technical Preview	10.0*		10	0	OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
	Windows	8.1								6.3*		6	3	OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
	Windows Server 2012 R2					6.3*		6	3	OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
	Windows	8								6.2			6	2	OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
	Windows Server 2012						6.2			6	2	OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
	Windows 7								6.1			6	1	OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
	Windows Server 2008 R2					6.1			6	1	OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
	Windows Server 2008						6.0			6	0	OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
	Windows Vista							6.0			6	0	OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
	Windows Server 2003 R2					5.2			5	2	GetSystemMetrics(SM_SERVERR2) != 0
	Windows Server 2003						5.2			5	2	GetSystemMetrics(SM_SERVERR2) == 0
	Windows XP								5.1			5	1	Not applicable
	Windows 2000							5.0			5	0	Not applicable*/

	OSVERSIONINFOEXA osvi;
	BOOL bOsVersionInfoEx;

	// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
	// If that fails, try using the OSVERSIONINFO structure.

	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEXA));
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);

	if( !(bOsVersionInfoEx = GetVersionExA ((OSVERSIONINFOA *) &osvi)) )
	{
		osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOA);
		if (! GetVersionExA ( (OSVERSIONINFOA *) &osvi) ) 
			return;
	}

	switch (osvi.dwPlatformId)
	{
		// Test for the Windows NT product family.
	case VER_PLATFORM_WIN32_NT:
		{
			// Test for the specific product.
			if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
				os += "Windows Server 2003, ";

			if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
				os += "Windows XP ";

			if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
				os += "Windows 2000 ";

			if ( osvi.dwMajorVersion <= 4 )
				os += "Windows NT ";

			// Test for specific product on Windows NT 4.0 SP6 and later.
			if( bOsVersionInfoEx )
			{
				// Test for the workstation type.
				if ( osvi.wProductType == VER_NT_WORKSTATION )
				{
					if( osvi.dwMajorVersion > 10 ) {
						char szOs[80] = {0};
						sprintf_s(szOs, 79, "Windows %d ", osvi.dwMajorVersion);
						os += szOs;
					} else if( osvi.dwMajorVersion == 10 )
						os += "Windows 10 ";
					else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==3 )
						os += "Windows 8.1 ";
					else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==2 )
						os += "Windows 8 ";
					else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==1 )
						os += "Windows 7 ";
					else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==0 )
						os += "Windows Vista ";
					else if( osvi.dwMajorVersion == 4 )
						os += "Workstation 4.0 ";
					else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
						os += "Home Edition ";
					else 
						os += "Professional ";
				}
				// Test for the server type.
				else if ( osvi.wProductType == VER_NT_SERVER || 
					osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
				{
					if( osvi.dwMajorVersion > 10 ) 
					{
						char szOs[80] = {0};
						sprintf_s(szOs, 79, "Windows Server %d ", osvi.dwMajorVersion);
						os += szOs;
					} else if( osvi.dwMajorVersion == 10 )
						os += "Windows Server 2016 Technical Preview ";
					else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==3 )
						os += "Windows Server 2012 R2 ";
					else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==2 )
						os += "Windows Server 2012 ";
					else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==1 )
						os += "Windows Server 2008 R2 ";
					else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==0 )
						os += "Windows Server 2008 ";
					else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)
					{
						if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
							os += "Datacenter Edition ";
						else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
							os += "Enterprise Edition ";
						else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
							os += "Web Edition ";
						else 
							os += "Standard Edition ";
					}
					else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
					{
						if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
							os += "Datacenter Server ";
						else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
							os += "Advanced Server ";
						else 
							os += "Server ";
					}
					else  // Windows NT 4.0 
					{
						if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
							os += "Server 4.0, Enterprise Edition ";
						else 
							os += "Server 4.0 ";
					}
				}
			}
			// Test for specific product on Windows NT 4.0 SP5 and earlier
			else  
			{
				HKEY hKey = NULL;
				char szProductType[80] = {0};
				DWORD dwBufLen=80;
				LONG lRet = 0;

				lRet = RegOpenKeyExA( HKEY_LOCAL_MACHINE,
					"SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
					0, KEY_QUERY_VALUE, &hKey );
				if( lRet == ERROR_SUCCESS ) 
				{
					lRet = RegQueryValueExA( hKey, "ProductType", NULL, NULL,
						(LPBYTE)szProductType, &dwBufLen);
					szProductType[79] = 0;

					RegCloseKey( hKey );

					if ( lstrcmpiA( "WINNT", szProductType) == 0 )
						os += "Workstation ";
					if ( lstrcmpiA( "LANMANNT", szProductType) == 0 )
						os += "Server ";
					if ( lstrcmpiA( "SERVERNT", szProductType) == 0 )
						os += "Advanced Server ";
				}
			}

			// Display service pack (if any) and build number.
			char szSrvPack[80] = {0};
			if( osvi.dwMajorVersion == 4 && 
				lstrcmpiA( osvi.szCSDVersion, "Service Pack 6" ) == 0 )
			{ 
				HKEY hKey = NULL;
				LONG lRet = 0;

				// Test for SP6 versus SP6a.
				lRet = RegOpenKeyExA( HKEY_LOCAL_MACHINE,
					"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
					0, KEY_QUERY_VALUE, &hKey );
				if( lRet == ERROR_SUCCESS )
					sprintf_s( szSrvPack, 79, "Service Pack 6a (Build %d)", osvi.dwBuildNumber & 0xFFFF );
				else // Windows NT 4.0 prior to SP6a
				{
					sprintf_s( szSrvPack, 79, "%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
				}

				RegCloseKey( hKey );
			}
			else // not Windows NT 4.0 
			{
				sprintf_s( szSrvPack, 79, "%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
			}
			os += szSrvPack;
		}
		break;

		// Test for the Windows Me/98/95.
	case VER_PLATFORM_WIN32_WINDOWS:
		{
			if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
			{
				os += "Windows 95 ";
				if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')
					os += "OSR2 ";
			}
			if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
			{
				os += "Windows 98 ";
				if ( osvi.szCSDVersion[1] == 'A' )
					os += "SE ";
			} 
			if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
			{
				os += "Windows Millennium Edition";
			} 
		}
		break;

	case VER_PLATFORM_WIN32s:
		{
			os += "Win32s";
		}
		break;
	}

	char szVer[80] = {0};
	sprintf_s( szVer, 79, " %d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion );
	os += szVer;
}

以上只能获取WIN8以下系统的信息


对于WIN8以上,比如WIN10就不可以了,可以用以下方法取WIN10的操作系统信息

方法1:通过内嵌清单,只适用于exe内嵌清单,dll内嵌清单没用

<?xml version="1.0" encoding="UTF-8"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
        <application> 
            <!-- Windows 10 --> 
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
        </application> 
    </compatibility>
</assembly> 

方法2:通过kernel32.dll文件版本号

BOOL IsFileVersionWindows10OrGreater()
{
	DWORD dwVerInfoSize = GetFileVersionInfoSizeW(L"kernel32.dll", NULL);
	if (0 != dwVerInfoSize)
	{
		LPWSTR pszBuffer = (LPWSTR)_alloca(dwVerInfoSize*sizeof(WCHAR));
		if (TRUE == GetFileVersionInfoW(L"kernel32.dll", 0, dwVerInfoSize, pszBuffer))
		{
			VS_FIXEDFILEINFO* pVsInfo = NULL;
			UINT nFileInfoSize = sizeof(VS_FIXEDFILEINFO);
			if (TRUE == VerQueryValueW(pszBuffer, L"\\", (void**)&pVsInfo, &nFileInfoSize))
			{
				printf("%d.%d.%d.%d\n", HIWORD(pVsInfo->dwFileVersionMS), LOWORD(pVsInfo->dwFileVersionMS), HIWORD(pVsInfo->dwFileVersionLS), LOWORD(pVsInfo->dwFileVersionLS));
				if (HIWORD(pVsInfo->dwFileVersionMS)>=10)
				{
					return TRUE;
				}
			}
		}
	}
	return FALSE;
}

方法3:通过versionhelper

/******************************************************************
*                                                                 *
*  VersionHelpers.h -- This module defines helper functions to    *
*                      promote version check with proper          *
*                      comparisons.                               *
*                                                                 *
*  Copyright (c) Microsoft Corp.  All rights reserved.            *
*                                                                 *
******************************************************************/
#ifndef _versionhelpers_H_INCLUDED_
#define _versionhelpers_H_INCLUDED_

#ifndef ___XP_BUILD
#define WINAPI_PARTITION_DESKTOP   (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
#define WINAPI_FAMILY WINAPI_FAMILY_DESKTOP_APP
#define WINAPI_FAMILY_PARTITION(Partitions)     (Partitions)

#define _WIN32_WINNT_NT4                    0x0400
#define _WIN32_WINNT_WIN2K                  0x0500
#define _WIN32_WINNT_WINXP                  0x0501
#define _WIN32_WINNT_WS03                   0x0502
#define _WIN32_WINNT_WIN6                   0x0600
#define _WIN32_WINNT_VISTA                  0x0600
#define _WIN32_WINNT_WS08                   0x0600
#define _WIN32_WINNT_LONGHORN               0x0600
#define _WIN32_WINNT_WIN7                   0x0601
#define _WIN32_WINNT_WIN8                   0x0602
#endif

#ifdef _MSC_VER
#pragma once
#endif  // _MSC_VER

#pragma region Application Family

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

#include <specstrings.h>    // for _In_, etc.

#if !defined(__midl) && !defined(SORTPP_PASS)

#if (NTDDI_VERSION >= NTDDI_WINXP)

#ifdef __cplusplus

#define VERSIONHELPERAPI inline bool

#else  // __cplusplus

#define VERSIONHELPERAPI FORCEINLINE BOOL

#endif // __cplusplus

#define _WIN32_WINNT_WINBLUE                0x0603
#define _WIN32_WINNT_WIN10                  0x0A00

typedef LONG (NTAPI* fnRtlGetVersion)(PRTL_OSVERSIONINFOW lpVersionInformation);

VERSIONHELPERAPI
IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
{
	/*OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 };
	DWORDLONG        const dwlConditionMask = VerSetConditionMask(
	VerSetConditionMask(
	VerSetConditionMask(
	0, VER_MAJORVERSION, VER_GREATER_EQUAL),
	VER_MINORVERSION, VER_GREATER_EQUAL),
	VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
	osvi.dwMajorVersion = wMajorVersion;
	osvi.dwMinorVersion = wMinorVersion;
	osvi.wServicePackMajor = wServicePackMajor;
	return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;*/

	RTL_OSVERSIONINFOEXW verInfo = { 0 };
	verInfo.dwOSVersionInfoSize = sizeof( verInfo );

	static fnRtlGetVersion RtlGetVersion = (fnRtlGetVersion)GetProcAddress( GetModuleHandleW( L"ntdll.dll" ), "RtlGetVersion" );

	if (RtlGetVersion != 0 && RtlGetVersion( (PRTL_OSVERSIONINFOW)&verInfo ) == 0)
	{
		if (verInfo.dwMajorVersion > wMajorVersion)
			return true;
		else if (verInfo.dwMajorVersion < wMajorVersion)
			return false;

		if (verInfo.dwMinorVersion > wMinorVersion)
			return true;
		else if (verInfo.dwMinorVersion < wMinorVersion)
			return false;

		if (verInfo.wServicePackMajor >= wServicePackMajor)
			return true;
	}

	return false;
}

VERSIONHELPERAPI
IsWindowsXPOrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 0 );
}

VERSIONHELPERAPI
IsWindowsXPSP1OrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 1 );
}

VERSIONHELPERAPI
IsWindowsXPSP2OrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 2 );
}

VERSIONHELPERAPI
IsWindowsXPSP3OrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 3 );
}

VERSIONHELPERAPI
IsWindowsVistaOrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 0 );
}

VERSIONHELPERAPI
IsWindowsVistaSP1OrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 1 );
}

VERSIONHELPERAPI
IsWindowsVistaSP2OrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 2 );
}

VERSIONHELPERAPI
IsWindows7OrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN7 ), LOBYTE( _WIN32_WINNT_WIN7 ), 0 );
}

VERSIONHELPERAPI
IsWindows7SP1OrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN7 ), LOBYTE( _WIN32_WINNT_WIN7 ), 1 );
}

VERSIONHELPERAPI
IsWindows8OrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN8 ), LOBYTE( _WIN32_WINNT_WIN8 ), 0 );
}

VERSIONHELPERAPI
IsWindows8Point1OrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINBLUE ), LOBYTE( _WIN32_WINNT_WINBLUE ), 0 );
}

VERSIONHELPERAPI
IsWindows10OrGreater()
{
	return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN10 ), LOBYTE( _WIN32_WINNT_WIN10 ), 0 );
}


VERSIONHELPERAPI
IsWindowsServer()
{
	OSVERSIONINFOEXW osvi = { sizeof( osvi ), 0, 0, 0, 0, { 0 }, 0, 0, 0, VER_NT_WORKSTATION };
	DWORDLONG        const dwlConditionMask = VerSetConditionMask( 0, VER_PRODUCT_TYPE, VER_EQUAL );

	return !VerifyVersionInfoW( &osvi, VER_PRODUCT_TYPE, dwlConditionMask );
}

#endif // NTDDI_VERSION

#endif // defined(__midl)

#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */

#pragma endregion

#endif // _VERSIONHELPERS_H_INCLUDED_


例子工程下载http://download.csdn.net/detail/i7thtool/9667125


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值