Получение имени и версии ОС на C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ShkiperLol, 20 Jan 2011.

  1. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Подскажите как получить имя ос и ее версию в Windows Server 2008,7 не читая при этом реестр.Ведь функция GetVersionEx тут уже не прокатит.
     
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    http://msdn.microsoft.com/en-us/library/ms724951(v=VS.85).aspx
     
    _________________________
  3. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Непашет их пример.
     
  4. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Задам вопрос по другому.UAC даст мне прочитать нужную ветку реестра?
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ну вы народ вообще пздц. не можете даже заюзать примеры с MSDN
    Вот когдато для себя писал код, более полного и нормального врядли встретите
    Тому кто скажет что не работает - оторву руки, потому что руки растущие из жопы мало пригодны.

    Код на Си + WinAPI. На входе - адрес буфера куда закинется результат. 128 байт хватит вроде как.
    Определяет версию винды начиная с Win 2000 и до Win 7 (9x считаем вымершим мамонтом и по этому внимания на него не обращаем)/ Попутно показывает какой SP стоит, а также скольки битная ОС, и если серверная, то под какой тип сервера.

    Code:
    #define VER_SUITE_WH_SERVER 0x00008000
    
    void INFO_GetWinVer(char* buf)
    {
    	OSVERSIONINFOEXA osvi;
    	SYSTEM_INFO si;
    
    	GetSystemInfo(&si);
    	
    	buf[0] = 0x00;
    	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
    	if (GetVersionExA((LPOSVERSIONINFOA)&osvi))
    	{
    		if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT &&
    			osvi.dwMajorVersion > 4)
    		{
    			lstrcpyA(buf, "Microsoft ");
    
    			if (osvi.dwMajorVersion == 6)
    			{
    				if (osvi.dwMinorVersion == 0)
    				{
    					if (osvi.wProductType == VER_NT_WORKSTATION)
    					{
    						lstrcatA(buf, "Windows Vista ");
    					}
    					else
    					{
    						lstrcatA(buf, "Windows Server 2008 ");
    					}
    				} 
    				else if (osvi.dwMinorVersion == 1)
    				{
    					if (osvi.wProductType == VER_NT_WORKSTATION)
    					{
    						lstrcatA(buf, "Windows 7 ");
    					}
    					else
    					{
    						lstrcatA(buf, "Windows Server 2008 R2 ");
    					}
    				}
    			}
    			else if (osvi.dwMajorVersion == 5)
    			{
    				if (osvi.dwMinorVersion == 2)
    				{
    					if (GetSystemMetrics(SM_SERVERR2))
    					{
    						lstrcatA(buf, "Windows Server 2003 R2 ");
    					}
    					else if (osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER)
    					{
    						lstrcatA(buf, "Windows Storage Server 2003");
    					}
    					else if (osvi.wSuiteMask & VER_SUITE_WH_SERVER)
    					{
    						lstrcatA(buf, "Windows Home Server");
    					}
    					else if (osvi.wProductType == VER_NT_WORKSTATION &&
    							si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
    					{
    						lstrcatA(buf, "Windows XP Professional x64 Edition");
    					}
    					else 
    					{
    						lstrcatA(buf, "Windows Server 2003 ");
    					}
    
    					if (osvi.wProductType != VER_NT_WORKSTATION)
    					{
    						if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
    						{
    							if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
    							{
    								lstrcatA(buf, "Datacenter Edition for Itanium-based Systems");
    							}
    							else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
    							{
    								lstrcatA(buf, "Enterprise Edition for Itanium-based Systems");
    							}
    						}
    			            else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
    						{
    							if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
    							{
    								lstrcatA(buf, "Datacenter x64 Edition");
    							}
    							else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
    							{
    								lstrcatA(buf, "Enterprise x64 Edition");
    							}
    							else 
    							{
    								lstrcatA(buf, "Standard x64 Edition");
    							}
    						}
    						else
    						{
    							if (osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER)
    							{
    								lstrcatA(buf, "Compute Cluster Edition");
    							}
    							else 
    							{
    								if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
    								{
    									lstrcatA(buf, "Datacenter Edition");
    								}
    								else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
    								{
    									lstrcatA(buf, "Enterprise Edition");
    								}
    								else if (osvi.wSuiteMask & VER_SUITE_BLADE)
    								{
    									lstrcatA(buf, "Web Edition");
    								}
    								else 
    								{
    									lstrcatA(buf, "Standard Edition");
    								}
    							}
    						}
    					}
    				}
    				else if (osvi.dwMinorVersion == 1)
    				{
    					lstrcatA(buf, "Windows XP ");
    					if (osvi.wSuiteMask & VER_SUITE_PERSONAL)
    					{
    						lstrcatA(buf, "Home Edition");
    					}
    					else 
    					{
    						lstrcatA(buf, "Professional");
    					}
    				}
    				else if (osvi.dwMinorVersion == 0)
    				{
    					lstrcatA(buf, "Windows 2000 ");
    
    					if (osvi.wProductType == VER_NT_WORKSTATION)
    					{
    						lstrcatA(buf, "Professional");
    					}
    					else 
    					{
    						if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
    						{
    							lstrcatA(buf, "Datacenter Server");
    						}
    						else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
    						{
    							lstrcatA(buf, "Advanced Server");
    						}
    						else
    						{
    							lstrcatA(buf, "Server");
    						}
    					}
    				}
    			}
           
    			if (osvi.szCSDVersion[0] != 0x00)
    			{
    				lstrcatA(buf, " ");
    				lstrcatA(buf, osvi.szCSDVersion);
    			}
    
    			if (osvi.dwMajorVersion >= 6)
    			{
    				if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
    				{
    					lstrcatA(buf, " 64-bit");
    				}
    				else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
    				{
    					lstrcatA(buf, " 32-bit");
    				}
    			}
    		}
    	}
    	else
    	{
    		lstrcatA(buf, "Unknown");
    	}
    }
    
    Функция даёт примерно такие данные:
    Code:
    Microsoft Windows 2000 Professional Service Pack 4
    Microsoft Windows 7  32-bit
    Microsoft Windows 7  Service Pack 1, v.721 32-bit
    Microsoft Windows 7  Service Pack 1, v.741 32-bit
    Microsoft Windows 7  Service Pack 3 32-bit
    Microsoft Windows Server 2003 Datacenter Edition
    Microsoft Windows Server 2003 Enterprise Edition
    Microsoft Windows Server 2003 Enterprise Edition Service Pack 1
    Microsoft Windows Server 2003 Enterprise Edition Service Pack 2
    Microsoft Windows Server 2003 R2 Enterprise Edition Service Pack 2
    Microsoft Windows Server 2003 R2 Standard Edition Service Pack 1
    Microsoft Windows Server 2003 R2 Standard Edition Service Pack 2
    Microsoft Windows Server 2003 Standard Edition
    Microsoft Windows Server 2003 Standard Edition Service Pack 1
    Microsoft Windows Server 2003 Standard Edition Service Pack 2
    Microsoft Windows Vista  32-bit
    Microsoft Windows Vista  Service Pack 1 32-bit
    Microsoft Windows Vista  Service Pack 2 32-bit
    Microsoft Windows XP Home Edition Dodatek Service Pack 2
    Microsoft Windows XP Home Edition Service Pack 1
    Microsoft Windows XP Home Edition Service Pack 2
    Microsoft Windows XP Home Edition Service Pack 3
    Microsoft Windows XP Professional
    Microsoft Windows XP Professional Service Pack 1
    Microsoft Windows XP Professional Service Pack 2
    Microsoft Windows XP Professional Service Pack 2, v.2096
    Microsoft Windows XP Professional Service Pack 3
    Microsoft Windows XP Professional Service Pack 3, v.3244
    Microsoft Windows XP Professional Service Pack 3, v.3264
    Microsoft Windows XP Professional Service Pack 3, v.5512
    Microsoft Windows XP Professional Szervizcsomag 3
    
    
     
    #5 slesh, 20 Jan 2011
    Last edited: 21 Jan 2011
    1 person likes this.
  6. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Спасибо Слеш,но я уже решил проблему!