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

时间:2010-06-29 06:21:32

标签: c# windows-server

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

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

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

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

5 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:6)

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

GetProductInfo适用于Vista / Windows Server 2008+ {2000}用于Windows 2000 +

BJ Rollison在他的博客上有GetVersionExgood post

答案 2 :(得分:1)

IsWindowsServerVersionHelpers.h中的内联函数。

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

IswindowsServer中没有功能kernel32.dll

答案 3 :(得分:0)

在程序集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();

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

答案 4 :(得分:0)

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

我找到了这个值;我正在使用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 Pro
  • Windows 8.1 Enterprise
  • Windows 10 Pro 10.0.16299
  • Windows Server 2003 R2标准版
  • Windows Server 2003 R2标准版x64
  • Windows Server 2008 R2标准版
  • 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);