15

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

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

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

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

4

5 回答 5

27

感谢尼克的回答提供的指针,我终于找到了我想要的东西。函数IsOS(OS_ANYSERVER)正是我需要的。以下是适用于任何操作系统版本的示例代码(包括 pre-Vista,因为我们IsOS按序号 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);
}
于 2010-06-29T07:47:16.187 回答
6

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

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

BJ Rollison在他的博客上有一篇很好的文章示例代码。

于 2010-06-29T07:27:48.520 回答
2

IsWindowsServer是 中的内联函数VersionHelpers.h

您可以在计算机上找到并读取该头文件。它使用 API 函数VerifyVersionInfoW

中没有功能IswindowsServerkernel32.dll

于 2016-11-05T19:29:01.710 回答
1

我有同样的问题,尽管在脚本中。

我找到了这个值;我正在使用 WMI 查询它:

https://msdn.microsoft.com/en-us/library/aa394239(v=vs.85).aspx
Win32_OperatingSystem
ProductType
    Data type: uint32
    Access type: Read-only
    Additional system information.
    Work Station (1)
    Domain Controller (2)
    Server (3)

我针对以下操作系统版本对此进行了测试:

  • Windows XP 专业版 SP3
  • Windows 7 企业版
  • 视窗 8.1 专业版
  • Windows 8.1 企业版
  • Windows 10 专业版 10.0.16299
  • Windows Server 2003 R2 标准版
  • Windows Server 2003 R2 标准版 x64
  • Windows Server 2008 R2 标准版
  • Windows Server 2012 数据中心
  • Windows Server 2012 R2 数据中心

在下面找到我的示例批处理文件。

卢卡斯。

for /f "tokens=2 delims==" %%a in ( 'wmic.exe os get producttype /value' ) do (
    set PRODUCT_TYPE=%%a
)
if %PRODUCT_TYPE%==1 set PRODUCT_TYPE=Workstation
if %PRODUCT_TYPE%==2 set PRODUCT_TYPE=DomainController
if %PRODUCT_TYPE%==3 set PRODUCT_TYPE=Server
echo %COMPUTERNAME%: %PRODUCT_TYPE%

您可以在 C# 中轻松做到这一点:

using Microsoft.Management.Infrastructure;
...
string Namespace = @"root\cimv2";
string className = "Win32_OperatingSystem";

CimInstance operatingSystem = new CimInstance(className, Namespace);
于 2018-02-21T21:06:20.257 回答
-2

程序集 Kernel32.DLL 中 WinAPI 的 VersionHelpers.h 头文件中应该定义了一组“版本帮助函数”。根据文档,应该适用于您的情况的是 IsWindowsServer(void)。说明在这里:

http://msdn.microsoft.com/en-us/library/windows/desktop/dn424963%28v=vs.85%29.aspx

在 c# 中,代码如下(未经测试):

using System.Runtime.InteropServices;

public static class MyClass
{
    [DllImport("Kernel32.dll")]
    public static extern Boolean IsWindowsServer();
}

然后消费代码就是:

bool is_it_a_server = MyClass.IsWindowsServer();

我从来没有使用过任何这些功能,所以让我知道它是如何工作的......

于 2014-12-16T21:09:54.233 回答