代码之家  ›  专栏  ›  技术社区  ›  Pierre Arnaud

确定程序是否在Windows服务器上运行

  •  11
  • Pierre Arnaud  · 技术社区  · 15 年前

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

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

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

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

    5 回复  |  直到 8 年前
        1
  •  20
  •   Pierre Arnaud    15 年前

    感谢尼克的回答,我终于找到了我要找的东西。函数 IsOS(OS_ANYSERVER) 做我所需要的。下面是示例代码,它适用于任何操作系统版本(包括pre-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);
    }
    
        2
  •  6
  •   nick    15 年前

    您可以调用以下win32函数:

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

    比约罗利森有一个 good post sample code 在他的博客上。

        3
  •  1
  •   Pierre Arnaud    9 年前

    IsWindowsServer 是一个 内联的 功能在 VersionHelpers.h .

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

    没有任何功能 IswindowsServer 在里面 kernel32.dll .

        4
  •  0
  •   ylax    11 年前

    在程序集kernel32.dll中的winapi的version helper s.h头文件中,应该定义了一组“version helper函数”。根据文档,应该适用于您的案例的是WindowsServer(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();
    

    我从未使用过这些函数,所以请告诉我它是如何工作的…

        5
  •  0
  •   lucas0x7B    8 年前

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

    我找到了这个值;我正在使用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)
    

    I tested this for the following operating system versions:

    • 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 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%
    

    You can easily do this in C#:

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_OperatingSystem";
    
    CimInstance operatingSystem = new CimInstance(className, Namespace);