2010-06-29 32 views
10

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

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

那么,有没有确定的代码在服务器或客户机上运行的支持呢?如果需要,我不介意使用P/Invoke。

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

回答

15

多亏了Nick提供的答案,我终于找到了我正在寻找的东西。功能IsOS(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); 
} 
+1

如果尼克给了你用来获取所需信息的答案,那么你应该接受那个答案而不是你自己的答案(这里的信息应该在你的问题中编辑)。 – 2010-08-30 07:02:09

+4

尼克没有提供IsOS解决方案。因此,其他读者将我自己的答案标记为已接受的答案似乎更有用。我已经把尼克加入了票数。 – 2010-08-31 09:19:35

+1

这是一个很好的答案感谢您的帮助。另外,当我必须调用外部方法时,我总是使用非常好的网站:http://www.pinvoke.net/ 以下是IsOS方法:http://www.pinvoke.net/default.aspx/shlwapi/IsOS .html – Major 2017-03-27 13:54:56

5

您可以P/Invoke以下Win32函数:

GetProductInfo为Vista/Windows的服务器2008+
GetVersionEx为Windows 2000 +

BJ Rollison有一个关于这个在他的博客good postsample code

+0

谢谢你的链接。我终于通过调用IsOS来解决问题。 – 2010-06-29 12:05:09

0

有应该是一组“版本辅助函数”的定义在程序集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(); 

我从未使用任何这些功能,让我知道它是如何工作的...

+1

似乎对我来说不太适用 – Sauleil 2015-02-24 16:07:51

+0

当我使用Kernel32.dll或Ntdll.dll作为DllImport时,出现一个错误,它无法在这些程序集中找到IsWindowsServer()。 – Brundle 2015-06-08 21:40:23

+0

查看Paul Hoepping的回答;他解释了为什么在kernel32.dll中找不到'IsWindowsServer'。 – 2016-12-01 16:59:25

1

IsWindowsServerinline函数VersionHelpers.h

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

有一个在kernel32.dll没有功能IswindowsServer

0

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

我已经找到这个值;

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,我使用WMI查询它8.1企业版
  • Windows 10 Pro 10.0.16299
  • 的Windows Server 2003 R2标准版
  • 的Windows Server 2003 R2标准版64位
  • 的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); 
相关问题