Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determine OS using Environment.OSVersion [duplicate]

What is the best to determine the Microsoft OS that is hosting your ASP.NET application using the System.Environment.OSVersion namespace

I need an example for Windows XP, Windows Server 2003 and Windows Vista

Here is what I am trying to accomplish using pseudocode

switch(/* Condition for determining OS */)
{
    case "WindowsXP":
        //Do Windows XP stuff
        break;
    case "Windows Server 2003":
        //Do Windows Server 2003 stuff
        break;
    case "Windows Vista":
        //Do Windows Vista stuff
        break;
}
like image 455
Michael Kniskern Avatar asked May 13 '09 21:05

Michael Kniskern


People also ask

How do I know what platform my python is on?

The platform. uname() method in python is used to get information about the current operating system. This method returns information like name, release, and version of the current operating system, name of the machine on the network, and hardware identifier in the form of attributes of a tuple-like object.

Which among the following operating system is supported by .NET core?

Microsoft supports . NET on Android, Apple, Linux, and Windows operating systems. It can be used on Arm64, x64, and x86 architectures.


3 Answers

The following should work. But why do you care? Is just for informational purposes in logging or are you looking for actual capabilities being present on the target platform?

if (Environment.OSVersion.Version.Major == 5)
{
    if (Environment.OSVersion.Version.Minor == 1)
    {
             // XP
    }
    else if (Environment.OSVersion.Version.Minor == 2)
    {
             // Server 2003.  XP 64-bit will also fall in here.
    }
}
else if (Environment.OSVersion.Version.Major >= 6)
{
        // Vista on up
}
like image 114
Michael Avatar answered Oct 06 '22 22:10

Michael


Not a complete list, but got this from http://support.microsoft.com/kb/304283:

+--------------------------------------------------------------+
|           |Windows|Windows|Windows|Windows NT|Windows|Windows|
|           |  95   |  98   |  Me   |    4.0   | 2000  |  XP   |
+--------------------------------------------------------------+
|PlatformID | 1     | 1     | 1     | 2        | 2     | 2     |
+--------------------------------------------------------------+
|Major      |       |       |       |          |       |       |
| version   | 4     | 4     | 4     | 4        | 5     | 5     |
+--------------------------------------------------------------+
|Minor      |       |       |       |          |       |       |
| version   | 0     | 10    | 90    | 0        | 0     | 1     |
+--------------------------------------------------------------+

Edit: Note, the information returned by System.Environment.OSVersion may be unreliable if the application is running in compatibility mode.

Edit2: I would recommend you just make it a configurable value in your application - that way your code does not need recompilation when a new OS comes out, e.g., Windows 7.

like image 39
D'Arcy Rittich Avatar answered Oct 07 '22 00:10

D'Arcy Rittich


If you dont have to be specific about R2 of server editions, a simpler alternative is:

enum OS { _2000, XP, Server2003, Vista, Server2008, _7, Server2012, _8 }

const int OS_ANYSERVER = 29;

[DllImport("shlwapi.dll", SetLastError = true, EntryPoint = "#437")]
static extern bool IsOS(int os);

static bool isWindowsServer = IsOS(OS_ANYSERVER);

public static OS GetOS()
{
    var version = Environment.OSVersion.Version;
    switch (version.Major)
    {
        case 5:
            switch (version.Minor)
            {
                case 0:
                    return OS._2000;
                case 1:
                    return OS.XP;
                case 2:
                    return isWindowsServer ? OS.Server2003 : OS.XP;
            }
            break;
        case 6:
            switch (version.Minor)
            {
                case 0:
                    return isWindowsServer ? OS.Server2008 : OS.Vista;
                case 1:
                    return isWindowsServer ? OS.Server2008 : OS._7;
                case 2:
                    return isWindowsServer ? OS.Server2012 : OS._8;
            }
            break;
    }

    throw new Exception("Strange OS");
}

Copied from here.

To be more specific your options are,

  1. WMI, you will have to some manual parsing. Not sure if user privilege is going to hurt non admin users.

  2. GetVersionEx as described in this answer.

  3. Checking for ProductName at

    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
    
like image 35
nawfal Avatar answered Oct 07 '22 00:10

nawfal