Déterminer si le programme est en cours d'exécution sur Windows Server
-
01-10-2019 - |
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
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 SystemInformation.TerminalServerSession
pour vérifier si mon programme est en cours d'exécution sur un bureau à distance (voir aussi
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);