views:

39

answers:

2

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.

+1  A: 

You can p/invoke the following Win32 functions:

GetProductInfo for Vista/Windows Server 2008+
GetVersionEx for Windows 2000+

BJ Rollison has a good post and sample code about this on his blog.

nick
@nick: Thank you for the links. I've finally solved the issue by calling IsOS instead.
Pierre
A: 

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);
}
Pierre
If nick gave you the answer you used to get the information you need, then you should accept that answer instead of your own (the information here should be edited in your question).
Thorbjørn Ravn Andersen
Well, Nick did not provide the IsOS solution. It seemed therefore more useful for other readers to mark my own answer as the accepted answer. I've credited Nick with an up-vote.
Pierre