Обнаружение Windows 2008 Server и Windows 2003 Server в C # - PullRequest
3 голосов
/ 14 августа 2010

Может ли кто-нибудь помочь мне изменить этот код для поддержки Windows 2003 и Windows 2008 server? Спасибо

 public static string getOSLegacy()
       {
           //Get Operating system information.
           OperatingSystem os = Environment.OSVersion;
           //Get version information about the os.
           Version vs = os.Version;

           //Variable to hold our return value
           string operatingSystem = "";

           if (os.Platform == PlatformID.Win32Windows)
           {
               //This is a pre-NT version of Windows
               switch (vs.Minor)
               {
                   case 0:
                       operatingSystem = "95";
                       break;
                   case 10:
                       if (vs.Revision.ToString() == "2222A")
                           operatingSystem = "98SE";
                       else
                           operatingSystem = "98";
                       break;
                   case 90:
                       operatingSystem = "Me";
                       break;
                   default:
                       break;
               }
           }
           else if (os.Platform == PlatformID.Win32NT)
           {
               switch (vs.Major)
               {
                   case 3:
                       operatingSystem = "NT 3.51";
                       break;
                   case 4:
                       operatingSystem = "NT 4.0";
                       break;
                   case 5:
                       if (vs.Minor == 0)
                       {
                           operatingSystem = "2000";
                       }
                       else
                       {
                           operatingSystem = "XP";
                       }
                       break;
                   case 6:
                       if (vs.Minor == 0)
                       {
                           operatingSystem = "Vista";
                       }
                       else
                       {
                           operatingSystem = "7";
                       }
                       break;
                   default:
                       break;
               }
           }

           return operatingSystem;
       }

Ответы [ 5 ]

2 голосов
/ 14 августа 2010

На сервере 2003, версия возвращает 5.2.3790.131072.На сервере 2008 версия возвращает 6.0.6002.131072.

(в Windows 7 это 6.1.7600.0).

Также вы можете получить полное имя ОС из реестра по адресу:

HKLM \ Software \ Microsoft \ Windows NT \ CurrentVersion, ключ ProductName.

1 голос
/ 13 мая 2011

Windows Server 2008 R2 отличается от не R2.Подробности см. Здесь: http://www.codeproject.com/KB/miscctrl/OSVersionInfo.aspx

Мой код для обнаружения R2:

    public static bool Win7;

    [DllImport("kernel32.dll")]
    private static extern bool GetVersionEx(ref OSVERSIONINFOEX osVersionInfo);

    #region OSVERSIONINFOEX
    [StructLayout(LayoutKind.Sequential)]
    private struct OSVERSIONINFOEX
    {
        public int dwOSVersionInfoSize;
        public int dwMajorVersion;
        public int dwMinorVersion;
        public int dwBuildNumber;
        public int dwPlatformId;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string szCSDVersion;
        public short wServicePackMajor;
        public short wServicePackMinor;
        public short wSuiteMask;
        public byte wProductType;
        public byte wReserved;
    }
    #endregion OSVERSIONINFOEX

    static MyMethod () {

        Version ver = System.Environment.OSVersion.Version;
        OperatingSystem osVersion = Environment.OSVersion;
        OSVERSIONINFOEX osVersionInfo = new OSVERSIONINFOEX();
        osVersionInfo.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX));

        GetVersionEx(ref osVersionInfo);
        byte productType = osVersionInfo.wProductType;

        if (ver.Major==6 & ver.Minor==1 & productType==1) {
            Win7=true;
            }
        else {
            Win7=false;
            }

        if (ver.Major==6 & ver.Minor==1 & productType==3)
            Report.Info ("OS is Windows Server 2008 R2");
        else //here standart methods can be used...
            Report.Info ("ver.Major: "+ver.Major.ToString()+"\r\nver.Minor: "+ver.Minor.ToString()+"\r\nproductType: "+productType.ToString());
1 голос
/ 14 августа 2010

2003 - 5,2. 2008 год - 6,1.

Этот пост содержит недостающие фрагменты: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/5956c04f-072a-406c-ae6a-cc8b3a207936

Редактировать: Этот ответ является неполным, как отмечено в комментариях. Ответ Славика и связанная статья - намного лучший подход ИМХО. В частности, байт wProductType (которого нет в .NET API) содержит ключевую информацию.

0 голосов
/ 09 июня 2016

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

Я не нашел решений, в которых манифест приложения должен был быть добавлен удовлетворительно. Большинство предложений, которые я нашел во время поиска в Google, предполагали, что это, к сожалению.

Дело в том, что при использовании манифеста каждую версию ОС необходимо добавлять к нему вручную, чтобы эта конкретная версия ОС могла сообщать о себе во время выполнения.

Другими словами, это становится условием гонки: пользователь моего приложения вполне может использовать версию моего приложения, которая предшествует используемой ОС. Мне бы пришлось обновить приложение немедленно , когда Microsoft выпустила новую версию ОС. Мне также пришлось бы заставлять пользователей обновлять приложение одновременно с обновлением ОС.

Другими словами, не очень выполнимо.

После просмотра параметров я обнаружил несколько ссылок (на удивление немногочисленных по сравнению с манифестом приложения), в которых вместо этого предлагалось использовать поиск в реестре.

Ознакомьтесь с этой таблицей от MS в отношении сопоставления с выпусками ОС: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832.aspx

Мой (вырубленный) класс ComputerInfo с только свойствами WinMajorVersion, WinMinorVersion и IsServer выглядит следующим образом:

с использованием Microsoft.Win32;

namespace Inspection
{
    /// <summary>
    /// Static class that adds convenient methods for getting information on the running computers basic hardware and os setup.
    /// </summary>
    public static class ComputerInfo
    {
        /// <summary>
        ///     Returns the Windows major version number for this computer.
        /// </summary>
        public static uint WinMajorVersion
        {
            get
            {
                dynamic major;
                // The 'CurrentMajorVersionNumber' string value in the CurrentVersion key is new for Windows 10, 
                // and will most likely (hopefully) be there for some time before MS decides to change this - again...
                if (TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentMajorVersionNumber", out major))
                {
                    return (uint) major;
                }

                // When the 'CurrentMajorVersionNumber' value is not present we fallback to reading the previous key used for this: 'CurrentVersion'
                dynamic version;
                if (!TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentVersion", out version))
                    return 0;

                var versionParts = ((string) version).Split('.');
                if (versionParts.Length != 2) return 0;
                uint majorAsUInt;
                return uint.TryParse(versionParts[0], out majorAsUInt) ? majorAsUInt : 0;
            }
        }

        /// <summary>
        ///     Returns the Windows minor version number for this computer.
        /// </summary>
        public static uint WinMinorVersion
        {
            get
            {
                dynamic minor;
                // The 'CurrentMinorVersionNumber' string value in the CurrentVersion key is new for Windows 10, 
                // and will most likely (hopefully) be there for some time before MS decides to change this - again...
                if (TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentMinorVersionNumber",
                    out minor))
                {
                    return (uint) minor;
                }

                // When the 'CurrentMinorVersionNumber' value is not present we fallback to reading the previous key used for this: 'CurrentVersion'
                dynamic version;
                if (!TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentVersion", out version))
                    return 0;

                var versionParts = ((string) version).Split('.');
                if (versionParts.Length != 2) return 0;
                uint minorAsUInt;
                return uint.TryParse(versionParts[1], out minorAsUInt) ? minorAsUInt : 0;
            }
        }

        /// <summary>
        ///     Returns whether or not the current computer is a server or not.
        /// </summary>
        public static uint IsServer
        {
            get
            {
                dynamic installationType;
                if (TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "InstallationType",
                    out installationType))
                {
                    return (uint) (installationType.Equals("Client") ? 0 : 1);
                }

                return 0;
            }
        }

        private static bool TryGeRegistryKey(string path, string key, out dynamic value)
        {
            value = null;
            try
            {
                var rk = Registry.LocalMachine.OpenSubKey(path);
                if (rk == null) return false;
                value = rk.GetValue(key);
                return value != null;
            }
            catch
            {
                return false;
            }
        }
    }
}
0 голосов
/ 14 августа 2010

В Win32 вы используете wProductType OSVERSIONINFOEX, чтобы определить это. Кажется странным, что эта информация не доступна через .NET. Возможно это где-то, что я не нашел. Во всяком случае, я бы нервничал, полагаясь на версии #, чтобы отличать серверные и несерверные операционные системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...