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

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

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

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

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

感谢尼克回答提供的指示,我终于找到了我想要的东西。 functionIsOS(OS_ANYSERVER)完全符合我的需要。 以下是适用于任何操作系统版本的示例代码(包括Vista之前的版本,因为我们通过序列从shlwapi.dll导入IsOS函数):

 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); } 

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

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

BJ Rollison在他的博客上有一个很好的post和示例代码 。

IsWindowsServerVersionHelpers.h内联函数。

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

kernel32.dll没有函数IswindowsServer

应该在程序集Kernel32.DLL中的WinAPI的VersionHelpers.h头文件中定义了一组“Version Helper Functions”。 根据文档,适用于您的案例的是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(); 

我从未使用过任何这些function,所以让我知道它是如何工作的……

我有同样的问题,尽管是在编写脚本。

我发现了这个价值; 我使用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 Professional SP3
  • Windows 7企业版
  • Windows 8.1专业版
  • Windows 8.1企业版
  • Windows 10 Pro 10.0.16299
  • Windows Server 2003 R2标准版
  • Windows Server 2003 R2标准版x64
  • Windows Server 2008 R2 Standard
  • Windows Server 2012 Datacenter
  • Windows Server 2012 R2 Datacenter

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

卢卡斯。

 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);