2010-06-29 2 views
10

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

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

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

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

ответ

15

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

Если ник дал вам ответ, который вы использовали для получения необходимой вам информации, вы должны принять этот ответ вместо своего (информация здесь должна быть отредактирована в вашем вопросе). –

+4

Ну, Ник не предоставил решение IsOS. Поэтому было более полезно, чтобы другие читатели отмечали мой собственный ответ в качестве принятого ответа. Я зачислил Нику с голосованием. –

+1

Это хороший ответ, спасибо за помощь. Также я всегда использую очень хороший сайт, когда мне приходится вызывать внешние методы: http://www.pinvoke.net/ Вот метод IsOS: http://www.pinvoke.net/default.aspx/shlwapi/IsOS .html – Major

5

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

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

BJ Rollison имеет good post и sample code об этом в своем блоге.

+0

Спасибо за ссылки. Я, наконец, решил проблему, вызвав вместо нее IsOS. –

0

Там, как предполагается, набор из «функций Version Helper» определенный в заголовочном файле 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(); 
} 

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

bool is_it_a_server = MyClass.IsWindowsServer(); 

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

+1

не работает для меня – Sauleil

+0

Когда я использую Kernel32.dll или Ntdll.dll для DllImport, я получаю сообщение об ошибке, что он не может найти IsWindowsServer() в этих сборках. – Brundle

+0

См. Ответ Пола Хёппинга; он объясняет, почему 'IsWindowsServer' не может быть найден в' kernel32.dll'. –

1

IsWindowsServer является inline функция в VersionHelpers.h.

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

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

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 Enterprise
  • Окна 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
  • Server 2008 R2 Standard
  • Windows Server 2012 Datacenter
  • Windows Server 2012 R2 Datacenter

Найти мой пример пакетного для Windows файл ниже.

Lucas.

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); 
Смежные вопросы