Je recherche un moyen élégant d’obtenir la version du système d’exploitation telle que: "Windows XP Professional Service Pack 1" ou "Windows Server 2008 Standard Edition", etc.
Y a-t-il une manière élégante de faire cela?
Je suis également intéressé par l'architecture du processeur (comme x86 ou x64).
Vous pouvez utiliser WMI pour obtenir le nom du produit ("Microsoft® Windows Server® 2008 Enterprise"):
using System.Management;
var name = (from x in new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem").Get().Cast<ManagementObject>()
select x.GetPropertyValue("Caption")).FirstOrDefault();
return name != null ? name.ToString() : "Unknown";
Vous devriez vraiment essayer d'éviter WMI pour une utilisation locale. C'est très pratique mais vous payez cher en termes de performances. C'est simple et rapide:
public string HKLM_GetString(string path, string key)
{
try
{
RegistryKey rk = Registry.LocalMachine.OpenSubKey(path);
if (rk == null) return "";
return (string)rk.GetValue(key);
}
catch { return ""; }
}
public string FriendlyName()
{
string ProductName = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName");
string CSDVersion = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CSDVersion");
if (ProductName != "")
{
return (ProductName.StartsWith("Microsoft") ? "" : "Microsoft ") + ProductName +
(CSDVersion != "" ? " " + CSDVersion : "");
}
return "";
}
Pourquoi ne pas utiliser Environment.OSVersion
? Il vous indiquera également de quelle manière il s’agit - Windows, Mac OS X, Unix, etc. Pour savoir si vous utilisez une version 64 bits ou 32 bits, utilisez IntPtr.Size
- vous obtiendrez 4 octets pour 32 bits et 8 octets 64 bits.
Essayez:
new ComputerInfo().OSVersion;
Sortie:
Microsoft Windows 10 Entreprise
Remarque: Ajouter une référence à Microsoft.VisualBasic.Devices;
Exemple de sortie:
Name = Windows Vista
Edition = Home Premium
Service Pack = Service Pack 1
Version = 6.0.6001.65536
Bits = 64
Classe d'échantillon:
class Program
{
static void Main( string[] args )
{
Console.WriteLine( "Operation System Information" );
Console.WriteLine( "----------------------------" );
Console.WriteLine( "Name = {0}", OSInfo.Name );
Console.WriteLine( "Edition = {0}", OSInfo.Edition );
Console.WriteLine( "Service Pack = {0}", OSInfo.ServicePack );
Console.WriteLine( "Version = {0}", OSInfo.VersionString );
Console.WriteLine( "Bits = {0}", OSInfo.Bits );
Console.ReadLine();
}
}
Code source pour la classe OSInfo: http://www.csharp411.com/determine-windows-version-and-edition-with-c/ Cependant, le code contient une erreur. Vous devrez remplacer le " case 6 "(juste avant #endregion NAME) avec ceci:
case 6:
switch (minorVersion)
{
case 0:
switch (productType)
{
case 1:
name = "Windows Vista";
break;
case 3:
name = "Windows Server 2008";
break;
}
break;
case 1:
switch (productType)
{
case 1:
name = "Windows 7";
break;
case 3:
name = "Windows Server 2008 R2";
break;
}
break;
}
break;
Et si vous voulez aller plus loin et voir si votre programme fonctionne en 64 ou 32 bits:
public static class Wow
{
public static bool Is64BitProcess
{
get { return IntPtr.Size == 8; }
}
public static bool Is64BitOperatingSystem
{
get
{
// Clearly if this is a 64-bit process we must be on a 64-bit OS.
if (Is64BitProcess)
return true;
// Ok, so we are a 32-bit process, but is the OS 64-bit?
// If we are running under Wow64 than the OS is 64-bit.
bool isWow64;
return ModuleContainsFunction("kernel32.dll", "IsWow64Process") && IsWow64Process(GetCurrentProcess(), out isWow64) && isWow64;
}
}
static bool ModuleContainsFunction(string moduleName, string methodName)
{
IntPtr hModule = GetModuleHandle(moduleName);
if (hModule != IntPtr.Zero)
return GetProcAddress(hModule, methodName) != IntPtr.Zero;
return false;
}
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
extern static bool IsWow64Process(IntPtr hProcess, [MarshalAs(UnmanagedType.Bool)] out bool isWow64);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
extern static IntPtr GetCurrentProcess();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
extern static IntPtr GetModuleHandle(string moduleName);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
extern static IntPtr GetProcAddress(IntPtr hModule, string methodName);
}
Une chose à laquelle il faut faire attention est que ces informations sont généralement localisées et rapportées différemment selon la langue du système d'exploitation.
Vous pouvez obtenir beaucoup d’informations sur WMI recherchez le Win32_OperatingSystem class
Notez que la question de l'architecture du processeur est complexe:
voulez-vous dire (les nombres les plus élevés exigent que les nombres les plus bas soient vrais):
si vous êtes heureux que tous les 3 doivent être vrais alors
IntPtr.Size == 8
Indique que les trois sont vrais
Un peu tard, mais c'est comme ça que je l'ai fait. Peut aider quelqu'un dans le futur.
using Microsoft.Win32;
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows NT\\CurrentVersion");
string pathName = (string)registryKey.GetValue("productName");
Je sais que ce n’est pas une réponse directe à la question et qu’il est aussi un peu tardif, mais pour ceux qui recherchent seulement un moyen de déterminer si le système d’exploitation est un client ou un serveur, il existe un moyen d’utiliser les éléments suivants: vous devez inclure la référence System.Management)
using System;
using System.Management;
ManagementClass osClass = new ManagementClass("Win32_OperatingSystem");
foreach (ManagementObject queryObj in osClass.GetInstances())
{
foreach (PropertyData prop in queryObj.Properties)
{
if (prop.Name == "ProductType")
{
ProdType = int.Parse(prop.Value.ToString());
}
}
}
tandis que la variable ProdType est un entier initialisé auparavant. Il contiendra une valeur comprise entre 1 et 3, tandis que 1 correspond à Workstation, 2 à Contrôleur de domaine et 3 à un serveur.
Ceci a été pris à partir de Accéder aux propriétés de Win32_OperatingSystem et a changé un peu ...
Vous pouvez utiliser les périphériques Visual Basic pour obtenir des informations sur la version.
Code:
using Microsoft.VisualBasic.Devices;
var versionID = new ComputerInfo().OSVersion;//6.1.7601.65536
var versionName = new ComputerInfo().OSFullName;//Microsoft Windows 7 Ultimate
var verionPlatform = new ComputerInfo().OSPlatform;//WinNT
Console.WriteLine(versionID);
Console.WriteLine(versionName);
Console.WriteLine(verionPlatform);
Sortie:
6.1.7601.65536
Microsoft Windows 10 Entreprise
WinNT
Remarque: Vous devrez ajouter une référence à Microsoft.VisualBasic;
Divulgation: Après avoir posté ceci, j'ai réalisé que je dépendais d'une bibliothèque de méthodes d'extension Nuget appelée Z.ExntensionMethods
qui contient IndexOf()
using Microsoft.VisualBasic.Devices;
string SimpleOSName()
{
var name = new ComputerInfo().OSFullName;
var parts = name.Split(' ').ToArray();
var take = name.Contains("Server")?3:2;
return string.Join(" ", parts.Skip(parts.IndexOf("Windows")).Take(take));
}
Performances plus rapides using System.Management;
string SimpleOSName()
{
var name = new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem")
.Get().Cast<ManagementObject>()
.Select(x => x.GetPropertyValue("Caption").ToString())
.First();
var parts = name.Split(' ').ToArray();
var take = name.Contains("Server")?3:2;
return string.Join(" ", parts.Skip(parts.IndexOf("Windows")).Take(take));
}
exemple de sortie:
Windows 7
Windows Server 2008