Identyfikacja systemu operacyjnego użytkownika

Czasami zdarza się, że usługi jakie oferuje nasz program powinny być uzależnione od wersji systemu operacyjnego na jakim pracuje użytkownik końcowy. Wydawanie osobnych instalatorów nie jest wygodnym rozwiązaniem ani dla użytkownika ani tym bardziej dla programisty. Choć biblioteki .NET, a w szczególności klasa System.OperatingSystem oferuje wiele ciekawych informacji, są one niewygodne w codziennej pracy. Wymagana jest szczegółowa wiedza na temat Major oraz Minor Version systemu, który nas interesuje.

Natknąłem się na bardzo ciekawy artykuł dotyczący identyfikacji systemu. Można w nim znaleźć wiele tabelek dotyczących liczb przypisanych do konkretnych systemów Windows oraz ich wersji (Home / Home Premium, itd…). Przedstawiono sposób w jaki da się wyciągnąć bardzo szczegółowe informacje. Co jeżeli wystarczy nam sama nazwa systemu operacyjnego? Rozwiązanie poniżej

Przede wszystkich skorzystamy z wyliczenia (enum). Oto lista wszystkich identyfikowalnych przez nas systemów:

public enum OSVersion
{
   Windows95,
   Windows98,
   Windows98SE,
   Windows2000,
   WindowsXP,
   WindowsVista,
   Windows7,
   Unknown,
   WindowsNT35,
   WindowsNT40,
   WindowsME
}

Klasa OperatingSystem ma ciekawą właściwość o nazwie Platform. Jest to wyliczenie. Niestety niewiele ono nam pomaga, jeżeli chodzi o systemy z rodziny Windows. Najważniejsze dla nas to: Win32NT oraz Win32Windows. Pierwsze informuje, że aktualny system wywodzi się z rodziny NT (XP, Vista, 7), drugi mówi o pozostałych systemach jak Windows 95, 98; czyli jak uczy historia, ściśle związanych z MSDOS.

Niestety wątpliwe jest aby kogokolwiek satysfakcjonowała ta informacja. Dlatego wykorzystamy liczby z OperatingSystem.Version i porównamy je z tabelkami z wyżej wymienionego artykułu. Wszystko zamkniemy w metodę GetOSVersion.

public static OSVersion GetOSVersion()
{
    OperatingSystem os = Environment.OSVersion;
    Version vs = os.Version;

    if (os.Platform == PlatformID.Win32Windows)
    {
        switch (vs.Minor)
        {
            case 0:
                return OSVersion.Windows95;
            case 10:
                if (vs.Revision.ToString() == "2222A")
                    return OSVersion.Windows98SE;
                else
                    return OSVersion.Windows98;
            case 90:
                return OSVersion.WindowsME;
            default:
                break;
        }
    }
    else if (os.Platform == PlatformID.Win32NT)
    {
        switch (vs.Major)
        {
            case 3:
                return OSVersion.WindowsNT35;
            case 4:
                return OSVersion.WindowsNT40;
            case 5:
                if (vs.Minor == 0)
                    return OSVersion.Windows2000;
                else
                    return OSVersion.WindowsXP;
            case 6:
                if (vs.Minor == 0)
                    return OSVersion.WindowsVista;
                else
                    return OSVersion.Windows7;
            default:
                break;
        }
    }

    return OSVersion.Unknown;
}

To wszystko w tym temacie. Jeżeli potrzebujesz bardziej szczegółowych informacji na temat systemu użytkownika, będziesz musiał się nieco bardziej napracować. Konieczne będzie odwołanie się do bibliotek niezarządzanych (poza dotnetowych). Ewentualne pytania proszę umieszczać w komentarzach.

Share

Jedna myśl nt. „Identyfikacja systemu operacyjnego użytkownika

  1. bawilem sie kiedys podobnie. Dziwne ze MS nie wstawil podobnej metody do frameworka i bylby spokoj. A tak zostaje powyzsze lub WMI (ktory jest wolny).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Spam protection by WP Captcha-Free