确定程序是否在Windows Server上运行

Pie*_*aud 12 c# windows-server

我想确定我的程序是否在Windows Server的某个版本上运行.显然,System.Environment不包含有关Windows是服务器版本的事实的信息(OS版本对象中没有此类信息).

我知道我可以SystemInformation.TerminalServerSession用来检查我的程序是否在远程桌面上运行(另请参阅此问题),但如果用户只是远程访问普通客户端Windows机器,情况也是如此.

那么是否有一种支持的方法来确定代码是在服务器上还是在客户端计算机上运行?如果需要,我不介意使用P/Invoke.

注意:我不想"Server"在产品名称中搜索字符串,因为由于本地化,这可能不适用于某些系统.

Pie*_*aud 20

感谢尼克回答提供的指示,我终于找到了我想要的东西.函数IsOS(OS_ANYSERVER)正是我所需要的.以下示例代码适用于任何操作系统版本(包括Vista之前,因为我们IsOS按顺序导入函数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);
}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,尼克没有提供IsOS解决方案.因此,对于其他读者而言,将我自己的答案标记为已接受的答案似乎更有用.我赞成尼克投票. (6认同)
  • 这是一个很好的答案,感谢您的帮助。另外,当我必须调用外部方法时,我总是使用一个非常好的站点:http://www.pinvoke.net/ 这里是 IsOS 方法:http://www.pinvoke.net/default.aspx/shlwapi/IsOS。 html (2认同)

nic*_*ick 6

您可以p /调用以下Win32函数:

适用于Windows 2000+的Vista/Windows Server 2008+
GetVersionEx的GetProductInfo

BJ Rollison 在他的博客上有一个很好的帖子示例代码.