K zjištění verze operačního systému slouží v .NET Frameworku třída OperatingSystem dostupná voláním Environment.OSVersion. Její vlastnost VersionString vrací popis operačního systému například takto: “Microsoft Windows NT 6.1.7601 Service Pack 1” (Windows NT zde označuje celou platformu Win32NT). Lepší popis namísto toho by ovšem byl tento: “Windows Server 2008 R2 Enterprise Service Pack 1 (Build 7601)”, a přesně to vrací třída OsVersionInfo, kterou si zde ukážeme.
K určení o jaký operační systém, verzi, edici a service pack používá třída několik Win32 API funkcí, stručně si je popíšeme:
GetVersionEx – Načte informace o operačním systému do struktury OSVERSIONINFOEX (nebo OSVERSIONINFO), která obsahuje MajorVersion, MinorVersion, BuildNumber, PlatformId, ProductType a SuiteMask.
GetProductInfo – Funkcí se načte ProductType v systémech od Windows Vista.
GetSystemInfo nebo GetNativeSystemInfo – Funkcemi se načte struktura SYSTEM_INFO, ze které se vlastností ProcessorArchitecture zjistí, zda je jedná o x86 nebo x64 bitový systém.
GetSystemMetrics – Funkce se zde používá pro zjištění, zdali se nejedná o speciální edici (Starter, Media Center, Tablet) u Windows XP, nebo zda se nejedná o R2 verzi u Windows Server 2003.
Z těchto informací již odvodíme jméno operačního systému. Třída podle dané platformy, Major a Minor čísel verzí volá jednotlivé metody pro daný windows systém. Ukážeme si příklad metody pro systémy Windows 8 a Windows Server 2012:
/// <summary>
/// Windows 8 or Windows Server 2012 operating system informations
/// </summary>
private void SetWin8Win2012Information()
{
m_OSWindows = OSWindowsID.Windows8_2K12;
if (m_OSVersionInfo.wProductType == VER_NT_WORKSTATION)
{
m_OSName = "Windows 8";
m_OSFullName = "Windows 8";
#region ProductInfoProductType switch
switch (m_ProductInfoProductType)
{
case PRODUCT_DEVELOPER_PREVIEW:
m_OSFullName += " Developer Preview";
return;
case PRODUCT_CORE_COUNTRYSPECIFIC:
case PRODUCT_CORE_SINGLELANGUAGE:
case PRODUCT_CORE:
//No name for edition
return;
case PRODUCT_CORE_N:
m_OSFullName += " N";
return;
case PRODUCT_BUSINESS:
case PRODUCT_PROFESSIONAL:
case PRODUCT_PROFESSIONAL_WMC:
m_OSFullName += " Pro";
return;
case PRODUCT_BUSINESS_N:
case PRODUCT_PROFESSIONAL_N:
m_OSFullName += " Pro N";
return;
case PRODUCT_ENTERPRISE:
case PRODUCT_ENTERPRISE_EVALUATION:
case PRODUCT_ULTIMATE:
m_OSFullName += " Enterprise";
return;
case PRODUCT_ENTERPRISE_N:
case PRODUCT_ENTERPRISE_N_EVALUATION:
case PRODUCT_ULTIMATE_N:
m_OSFullName += " Enterprise N";
return;
}
#endregion
}
else
{
m_OSName = "Windows Server 2012";
m_OSFullName = "Windows Server 2012";
#region ProductInfoProductType switch
switch (m_ProductInfoProductType)
{
case PRODUCT_DEVELOPER_PREVIEW:
m_OSFullName += " Developer Preview";
return;
case PRODUCT_STANDARD_SERVER:
case PRODUCT_STANDARD_EVALUATION_SERVER:
m_OSFullName += " Standard";
return;
case PRODUCT_STANDARD_SERVER_CORE:
m_OSFullName += " Standard (core installation)";
return;
case PRODUCT_STANDARD_SERVER_V:
m_OSFullName += " Standard without Hyper-V";
return;
case PRODUCT_STANDARD_SERVER_CORE_V:
m_OSFullName += " Standard without Hyper-V (core installation)";
return;
case PRODUCT_DATACENTER_SERVER:
case PRODUCT_DATACENTER_EVALUATION_SERVER:
m_OSFullName += " Datacenter";
return;
case PRODUCT_DATACENTER_SERVER_CORE:
m_OSFullName += " Datacenter (core installation)";
return;
case PRODUCT_DATACENTER_SERVER_V:
m_OSFullName += " Datacenter without Hyper-V";
return;
case PRODUCT_DATACENTER_SERVER_CORE_V:
m_OSFullName += " Datacenter without Hyper-V (core installation)";
return;
case PRODUCT_SB_SOLUTION_SERVER:
case PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT:
case PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY:
case PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING:
case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT:
case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL:
case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC:
case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC:
m_OSFullName += " Essentials";
return;
case PRODUCT_SERVER_FOUNDATION:
m_OSFullName += " Foundation";
return;
case PRODUCT_STORAGE_EXPRESS_SERVER:
case PRODUCT_STORAGE_STANDARD_SERVER:
case PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER:
m_OSName = "Windows Storage Server 2012";
m_OSFullName = "Windows Storage Server 2012 Standard";
return;
case PRODUCT_STORAGE_WORKGROUP_SERVER:
case PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER:
m_OSName = "Windows Storage Server 2012";
m_OSFullName = "Windows Storage Server 2012 Workgroup";
return;
case PRODUCT_STORAGE_EXPRESS_SERVER_CORE:
case PRODUCT_STORAGE_STANDARD_SERVER_CORE:
m_OSName = "Windows Storage Server 2012";
m_OSFullName = "Windows Storage Server 2012 Standard (core installation)";
return;
case PRODUCT_STORAGE_WORKGROUP_SERVER_CORE:
m_OSName = "Windows Storage Server 2012";
m_OSFullName = "Windows Storage Server 2012 Workgroup (core installation)";
return;
case PRODUCT_HYPERV:
m_OSName = "Hyper-V Server 2012";
m_OSFullName = "Hyper-V Server 2012";
return;
}
#endregion
}
}
Kromě názvu operačního systému (vlastnosti VersionString, OSName, OSFullName, OSWindows) třída dále umožňuje samostatně vrátit Platform, číslo verze a buildu (OSVersion, OSBuild), ProductType, WindowsArchitecture, dále použitý ServicePack a jeho verzi (ServicePackVersion, CSDBuildNumber), BuildLab text a příznaky SpecialEdition a CoreInstallation. Poslední vlastnost FrameworkVersionString vrací název instalované verze .NET Frameworku odvozené podle operačního systému a verze CLR.
Kód celé třídy již dále vysvětlení nepotřebuje, kompletní si jí můžete prohlédnout nebo stáhnout zde.