Каков лучший способ для приложения WinForms для определения точно, на какой операционной системе Windows он работает?

У меня есть приложение WinForms, которое должно вести себя в особенных методах (конкретно оболочка к определенному установщику) на основе операционной системы, в которой она работает.

Я использую Систему. Класс OperatingSystem и объединение PlatFormID, Главные, Незначительные и Номера сборки, который получает Вас большая часть пути там.

К сожалению, properites объекта OperatinSystem, не позволяйте Вам различать точно некоторые платформы. Например, Vista и Windows Server 2008, или Vista 32 бита и Vista 64 бита. Аналогично, у Профессионала XP 64 битов, кажется, есть та же информация об управлении версиями как Сервер 2003.

Таким образом, действительно ли возможно определить точно, на какой операционной системе Windows Вы работаете из Приложения WinForms (использующий c#)?

5
задан Stuart Helwig 11 February 2010 в 01:19
поделиться

5 ответов

Самый простой способ отличить 32bit от 64bit - это переменная окружения PROCESSOR_ARCHITECTURE.

string value = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");

если вы запустите этот код на 32-разрядной Windows, значение будет либо "x86", либо пустым. На 64-разрядных Windows, я полагаю, оно будет установлено в любое значение, кроме "x86". Это довольно сложно, но пока что это работает на всех версиях Windows, где можно выполнить программу .NET.

Вы также можете использовать более современный WMI для запроса практически всей информации об операционной системе, которую вы можете себе представить, но это будет работать только на Windows 2000 или более новых версиях. Если вы можете с этим смириться, посмотрите несколько примеров в этом блоге.

4
ответ дан 13 December 2019 в 19:27
поделиться

Если вам действительно нужны все детали, я думаю, вы все еще можете использовать старый добрый GetVersionEx из Win32 API.

На самом деле это не .NET (строго говоря), но может использоваться в приложении .NET. См. здесь.

1
ответ дан 13 December 2019 в 19:27
поделиться

Это то, что я сделал около года назад для унаследованного приложения в моей компании... Я не знаю, что это самый современный метод, но он определенно сработал.

If Environment.OSVersion.Platform = PlatformID.Win32NT Then
        If major <= 4 Then
            ret = "Windows NT 4.0"
            _usingNT4 = True
        ElseIf major > 6 Then
            ret = "Windows Vista"
        ElseIf major = 5 And minor = 0 Then
            ret = "Windows 2000"
        Else
            ret = "Windows XP"
        End If
    Else
        If major > 4 Or (major = 4 And minor >= 90) Then
            ret = "Windows ME"
        ElseIf (major = 4 And minor >= 10 And minor < 90) Then
            ret = "Windows 98"
        Else
            ret = "Windows 95"
        End If
    End If
2
ответ дан 13 December 2019 в 19:27
поделиться

Вы можете использовать WMI для получения информации для класса управления Win32_OperatingSystem.

Код, созданный с помощью WMI Code Creator :

using System;
using System.Management;
using System.Windows.Forms;

namespace WMISample
{
    public class MyWMIQuery
    {
        public static void Main()
        {
            try
            {
                ManagementObjectSearcher searcher = 
                    new ManagementObjectSearcher("root\\CIMV2", 
                    "SELECT * FROM Win32_OperatingSystem"); 

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Win32_OperatingSystem instance");
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("BuildNumber: {0}", queryObj["BuildNumber"]);
                    Console.WriteLine("Caption: {0}", queryObj["Caption"]);
                    Console.WriteLine("OSArchitecture: {0}", queryObj["OSArchitecture"]);
                    Console.WriteLine("OSLanguage: {0}", queryObj["OSLanguage"]);
                    Console.WriteLine("Version: {0}", queryObj["Version"]);
                }
            }
            catch (ManagementException e)
            {
                MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }
}
3
ответ дан 13 December 2019 в 19:27
поделиться

Вот более простой способ:

string os = Environment.OSVersion.VersionString;

... Для моей ОС вышеприведенный способ дает следующее:

Microsoft Windows NT 6.1.7600.0

Надеюсь, это поможет.

1
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: