Как получить "дружественное" имя версии ОС?
Я ищу элегантный способ получить версию ОС, например: "Windows XP Professional Service Pack 1" или "Windows Server 2008 Standard Edition" и т.д.
Есть ли элегантный способ сделать это?
Меня также интересует архитектура процессора (например, x86 или x64).
Ответы
Ответ 1
Вы можете использовать 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";
Ответ 2
Вы действительно должны стараться избегать 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 "";
}
Ответ 3
Почему бы не использовать Environment.OSVersion
? Он также расскажет вам, что это такое - Windows, Mac OS X, Unix и т.д. Чтобы узнать, работаете ли вы на 64-битной или 32-битной, используйте IntPtr.Size
- это вернет 4 байта для 32 бит и 8 байтов для 64-битных.
Ответ 4
Пример вывода:
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 NAME):
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);
}
Ответ 5
Попытка:
new ComputerInfo().OSVersion;
Выход:
Microsoft Windows 10 Enterprise
Примечание:
Добавьте ссылку на Microsoft.VisualBasic.Devices;
Ответ 6
Одна вещь, которая должна быть осторожна, заключается в том, что эта информация обычно локализована и будет сообщаться по-разному в зависимости от языка ОС.
Вы можете получить много информации от WMI искать Win32_OperatingSystem класс
Ответ 7
Обратите внимание, что вопрос архитектуры процессора сложный:
Вы имеете в виду (более высокие числа требуют, чтобы нижние числа были истинными):
- Процессор способен обрабатывать 64-битные (в том смысле, что он поддерживает AMD/Intel x64 или Itanium).
- Операционная система - 64-битная
- GPR и указатели - 64 бита, то есть XP 64, Vista 64, 64-разрядная версия сервера или 64-битная ОС для моно
- Выполняемый в настоящее время процесс - это 64-битный процесс (не выполняется, например, в Wow64)
если вы счастливы, что все 3 должны быть истинными, тогда
IntPtr.Size == 8
Указывает, что все три являются истинными
Ответ 8
Я знаю, что это не прямой ответ на вопрос, и он также немного запоздал, но для тех, кто ищет способ определить, является ли ОС клиентской ОС или сервером, есть способ использовать следующее: (вам нужно включить ссылку 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());
}
}
}
в то время как переменная ProdType представляет собой целое число, которое было инициализировано ранее. Он будет содержать значение от 1 до 3, в то время как 1 означает рабочую станцию, 2 для контроллера домена и 3 для сервера.
Это было взято из Доступ к свойствам Win32_OperatingSystem и немного изменилось...
Ответ 9
Немного поздно, но я так и сделал. Может помочь кому-то в будущем.
using Microsoft.Win32;
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows NT\\CurrentVersion");
string pathName = (string)registryKey.GetValue("productName");
Ответ 10
Вы можете использовать устройства 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;