Pregunta

Me gustaría para determinar si mi programa se ejecuta en una versión de Windows Server. Al parecer, System.Environment no contiene información sobre el hecho de que Windows es una versión de servidor (no existe tal información en la OS versión objeto ).

Yo sé que puedo usar SystemInformation.TerminalServerSession para comprobar si mi programa se ejecuta en un escritorio remoto (véase también esta pregunta ), pero esto también será verdadera si el usuario está accediendo simplemente una máquina cliente de Windows de forma remota sin formato.

Entonces, ¿hay una manera compatible de determinar si el código se ejecuta en un servidor o en una máquina cliente? No me importa el uso de P / Invoke si es necesario.

Nota:. No quiero a buscar la cadena "Server" en el nombre del producto, ya que esto probablemente no funcionará en algunos sistemas debido a la localización

¿Fue útil?

Solución

Gracias a punteros proporcionados por la respuesta de Nick, por fin he encontrado lo que estaba buscando. La función ISOS (OS_ANYSERVER) hace exactamente lo que necesito. Aquí está el código de ejemplo que debería funcionar para cualquier versión del sistema operativo (incluyendo pre-Vista, ya que importamos la función IsOS por ordinal de 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);
}

Otros consejos

Puede p / invocar las siguientes funciones de Win32:

GetProductInfo para Vista / Windows Server 2008+
GetVersionEx para Windows 2000

BJ Rollison tiene un buen puesto y código ejemplo de esto en su blog.

IsWindowsServer es un línea en función VersionHelpers.h.

Puede encontrar y leer ese archivo de cabecera en su ordenador. Utiliza la función de la API VerifyVersionInfoW.

No hay IswindowsServer función en kernel32.dll.

No se supone que es un conjunto de de 'Versión' Helper funciones definidas en el archivo de cabecera VersionHelpers.h de la API de Windows en el montaje Kernel32.DLL. El que, según la documentación, debe trabajar para su caso es IsWindowsServer (void). La descripción es aquí:

http: // msdn.microsoft.com/en-us/library/windows/desktop/dn424963%28v=vs.85%29.aspx

En C #, el código sería así (no probado):

using System.Runtime.InteropServices;

public static class MyClass
{
    [DllImport("Kernel32.dll")]
    public static extern Boolean IsWindowsServer();
}

Y luego el código de consumo sería simplemente:

bool is_it_a_server = MyClass.IsWindowsServer();

Nunca he usado ninguna de estas funciones por lo que me haga saber cómo funciona ...

Yo tenía el mismo problema, aunque de secuencias de comandos.

He encontrado este valor; Yo estoy consultando usando 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 probado esto para las siguientes versiones del sistema operativo:

  • Windows XP Professional Service Pack 3
  • Windows 7 Enterprise
  • Windows 8.1 Pro
  • Windows 8.1 Empresa
  • Windows 10 10.0.16299 Pro
  • Windows Server 2003 R2 Standard Edition
  • Windows Server 2003 R2 Standard Edition x64
  • Windows Server 2008 R2 Standard
  • Windows Server 2012 Datacenter
  • Windows Server 2012 R2 Datacenter

Encuentra mi ejemplo archivo por lotes a continuación.

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%

Usted puede hacer esto en C #:

using Microsoft.Management.Infrastructure;
...
string Namespace = @"root\cimv2";
string className = "Win32_OperatingSystem";

CimInstance operatingSystem = new CimInstance(className, Namespace);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top