Search code examples
c#windows-server

Determining if the program is running on Windows Server


I would like to determine if my program is running on a version of Windows Server. Apparently, System.Environment does not contain information about the fact that Windows is a server version (there is no such info in the OS version object).

I know that I can use SystemInformation.TerminalServerSession to check whether my program is running on a Remote Desktop (see also this question), but this will also be true if the user is simply accessing a plain client Windows machine remotely.

So is there a supported way of determining if the code is running on a server or on a client machine? I don't mind using P/Invoke if needed.

Note: I don't want to search for the "Server" string in the product name, since this will probably not work on some systems because of the localization.


Solution

  • Thanks to pointers provided by Nick's answer, I've finally found what I was looking for. The function IsOS(OS_ANYSERVER) does exactly what I need. Here is the sample code which should work for any OS version (including pre-Vista, since we import the IsOS function by ordinal from shlwapi.dll):

    class OS
    {
        public static bool IsWindowsServer()
        {
            return OS.IsOS (OS.OS_ANYSERVER);
        }
    
        const int OS_ANYSERVER = 29;
    
        [DllImport("shlwapi.dll", SetLastError=true, EntryPoint="#437")]
        private static extern bool IsOS(int os);
    }