我想确定我的程序是否在Windows Server的某个版本上运行。显然,System.Environment
不包含有关Windows是服务器版本的事实的信息(OS version object中没有此类信息)。
我知道我可以使用SystemInformation.TerminalServerSession
检查我的程序是否在远程桌面上运行(另请参阅this question),但如果用户只是访问普通客户端,情况也是如此远程Windows机器。
那么是否有一种支持的方法来确定代码是在服务器上还是在客户端计算机上运行?如果需要,我不介意使用P / Invoke。
注意:我不想在产品名称中搜索"Server"
字符串,因为由于本地化,这可能不适用于某些系统。
答案 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在他的博客上有GetVersionEx和good post。
答案 2 :(得分:1)
IsWindowsServer
是VersionHelpers.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)
我测试了以下操作系统版本:
在下面找到我的示例批处理文件。
卢卡斯。
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);