Question

Je voudrais savoir si mon programme est en cours d'exécution sur une version de Windows Server. Apparemment, System.Environment ne contient pas d'informations sur le fait que Windows est une version serveur (il n'y a pas d'information dans la section OS objet de version ).

Je sais que je peux utiliser SystemInformation.TerminalServerSession pour vérifier si mon programme est en cours d'exécution sur un bureau à distance (voir aussi

Était-ce utile?

La solution

Merci à des pointeurs fournis par la réponse de Nick, je l'ai enfin trouvé ce que je cherchais. La fonction ISOS (OS_ANYSERVER) fait exactement Ce dont j'ai besoin. Voici l'exemple de code qui devrait fonctionner pour toute version du système d'exploitation (y compris pré-Vista, puisque nous importons la fonction IsOS par 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);
}

Autres conseils

Vous pouvez p / Invoke les fonctions Win32 suivantes:

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

BJ Rollison a bon poste et exemple de code à ce sujet sur son blog.

IsWindowsServer est en ligne fonction VersionHelpers.h.

Vous pouvez trouver et lire ce fichier d'en-tête sur votre ordinateur. Il utilise la fonction API VerifyVersionInfoW.

Il n'y a pas de fonction IswindowsServer dans kernel32.dll.

Il est censé être un ensemble de des « fonctions Version aide » définis dans le fichier d'en-tête VersionHelpers.h du WinAPI dans l'assemblage Kernel32.dll. Celui qui, selon la documentation, devrait fonctionner pour votre cas est IsWindowsServer (void). Description est ici:

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

En c #, le code comme ceci (non testé):

using System.Runtime.InteropServices;

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

Et le code de la consommation serait simplement:

bool is_it_a_server = MyClass.IsWindowsServer();

Je ne l'ai jamais utilisé l'une de ces fonctions alors laissez-moi savoir comment ça fonctionne ...

J'ai eu le même problème, mais dans les scripts.

J'ai trouvé cette valeur; J'Interrogation à l'aide de 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)

J'ai testé cela pour les versions du système d'exploitation suivant:

  • Windows XP Professionnel SP3
  • Windows 7 Entreprise
  • de Windows 8.1 Pro
  • de Windows 8.1 Enterprise
  • de 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 Datacenter
  • Windows Server 2012 R2 Datacenter

Trouver mon exemple fichier batch ci-dessous.

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%

Vous pouvez facilement le faire en C #:

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

CimInstance operatingSystem = new CimInstance(className, Namespace);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top