Как получить "дружественное" имя версии ОС?
Я ищу элегантный способ получить версию ОС, например: "Windows XP Professional Service Pack 1 "или" Windows Server 2008 Standard Edition " и т. д.
есть ли элегантный способ сделать это?
меня также интересует архитектура процессора (например, x86 или x64).
11 ответов:
вы можете использовать WMI для получения имени продукта ("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";
вы действительно должны стараться избегать WMI для локального использования. Это очень удобно, но вы дорого платите за это с точки зрения производительности. Это быстро и просто:
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 ""; }
почему бы не использовать
Environment.OSVersion? Он также расскажет вам, что это за операционная система - Windows, Mac OS X, Unix и т. д. Чтобы узнать, если вы работаете в 64bit или 32bit, используйтеIntPtr.Size- это вернет 4 байта для 32bit и 8 байт для 64bit.
попробуй:
new ComputerInfo().OSVersion;выход:
Microsoft Windows 10 Enterprise
Примечание: Добавить ссылку на
Microsoft.VisualBasic.Devices;
пример вывода:
Name = Windows Vista Edition = Home Premium Service Pack = Service Pack 1 Version = 6.0.6001.65536 Bits = 64пример класса:
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(); } }исходный код для класса OSInfo:http://www.csharp411.com/determine-windows-version-and-edition-with-c/ однако в коде есть ошибка, вам нужно будет заменить оператор "case 6" (это как раз перед именем #endregion) следующим:
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;и если вы хотите пойти дальше и посмотреть, работает ли ваша программа в 64 или 32 бит:
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); }
одна вещь, чтобы быть осторожным в том, что эта информация обычно локализована и будет сообщать по-разному в зависимости от языка ОС.
вы можете получить много информации от WMI искать класса Win32_OperatingSystem класс
обратите внимание, что вопрос архитектуры процессора является сложным:
вы имеете в виду (более высокие числа требуют меньших чисел, чтобы быть правдой):
- процессор способен обрабатывать 64 бит (в том смысле, что он поддерживает AMD/intel x64 или Itanium)
- операционная система 64bit
- GPR и указатели-это 64bits, т. е. XP 64, Vista 64, 64-разрядная версия сервера или 64-разрядная ОС для mono
- в настоящий момент
Я знаю, что это не прямой ответ на вопрос, и это также немного поздно, но для тех, кто только ищет способ определить, является ли ОС клиентской ОС или сервером, есть способ использовать следующее: (вам нужно включить систему.Справочник по управлению)
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()); } } }в то время как переменная ProdType является целым числом, которое было инициализировано ранее. Он будет содержать значение от 1 до 3, в то время как 1 означает рабочую станцию, 2 для контроллера домена и 3 для a сервер.
Это было взято из доступ к свойствам класса Win32_OperatingSystem и немного изменен...
немного поздно, но вот как я это сделал. Может помочь кому-то в будущем.
using Microsoft.Win32; RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows NT\CurrentVersion"); string pathName = (string)registryKey.GetValue("productName");
для получения сведений о версии можно использовать устройства Visual Basic.
код:
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);выход:
6.1.7601.65536
Microsoft Windows 10 Enterprise
WinNT
Примечание: Вам нужно будет добавить ссылку
Microsoft.VisualBasic;
Disclosure: после публикации этого я понял, что я в зависимости от библиотеки методов расширения Nuget под названием
Z.ExntensionMethods, которая содержит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)); }производительность
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)); }выход пример:
Windows 7
Windows Server 2008
Comments