Определение, работает ли программа на Windows Server - PullRequest
12 голосов
/ 29 июня 2010

Я хотел бы определить, работает ли моя программа на версии Windows Server. По-видимому, System.Environment не содержит информации о том, что Windows является серверной версией (такой информации нет в версии ОС ).

Я знаю, что могу использовать SystemInformation.TerminalServerSession, чтобы проверить, запущена ли моя программа на удаленном рабочем столе (см. Также этот вопрос ), но это также будет верно, если пользователь просто обращается к простому клиентская машина Windows удаленно.

Так есть ли поддерживаемый способ определения, выполняется ли код на сервере или на клиентском компьютере? Я не против использовать P / Invoke, если это необходимо.

Примечание: я не хочу искать строку "Server" в названии продукта, так как это, вероятно, не будет работать в некоторых системах из-за локализации.

Ответы [ 5 ]

20 голосов
/ 29 июня 2010

Благодаря указателям, предоставленным ответом Ника, я наконец-то нашел то, что искал. Функция 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);
}
6 голосов
/ 29 июня 2010

Вы можете выполнить следующие функции Win32:

GetProductInfo для Vista / Windows Server 2008 +
GetVersionEx для Windows 2000 +

BJ Rollison имеет хороший пост и пример кода об этом в своем блоге.

1 голос
/ 05 ноября 2016

IsWindowsServer - это встроенная функция в VersionHelpers.h.

Вы можете найти и прочитать этот заголовочный файл на вашем компьютере. Использует функцию API VerifyVersionInfoW.

Нет функции IswindowsServer в kernel32.dll.

0 голосов
/ 22 февраля 2018

У меня была такая же проблема, хотя и в скриптах.

Я нашел это значение; Я запрашиваю его с помощью 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 Enterprise
  • Windows 8.1 Pro
  • Windows 8.1 Корпоративная
  • Windows 10 Pro 10.0.16299
  • Windows Server 2003 R2 Standard Edition
  • Windows Server 2003 R2 Standard Edition x64
  • Windows Server 2008 R2 Standard
  • Центр обработки данных 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);
0 голосов
/ 17 декабря 2014

В сборочном файле Kernel32.DLL должен быть набор «функций помощника по версиям», определенных в заголовочном файле VersionHelpers.h WinAPI в сборке Kernel32.DLL.То, что, согласно документации, должно работать в вашем случае, - это 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();
}

И тогда код потребления будет просто:1009 *

bool is_it_a_server = MyClass.IsWindowsServer();

Я никогда не использовал ни одну из этих функций, поэтому дайте мне знать, как она работает ...

...