Je remote le bureau aux serveurs Windows de notre laboratoire/centre de données. Je suis obligé de comprendre que tous nos serveurs sont des machines virtuelles ou des serveurs physiques programmés. Nous avons certainement la feuille d’environnement nous dire lequel est lequel. Mais je dois écrire du code pour le distinguer. Quelle technique dois-je utiliser? Je n'ai pas trouvé d'assemblage .Net pour le faire. Vous recherchez un expert pour partager vos connaissances ou vos conseils, toute direction de recherche ou tout lien, tout sera apprécié!
Vous pouvez essayer d'utiliser le script PowerShell suivant. Il utilise WMI pour déterminer si la machine est une machine virtuelle ou physique.
gwmi -q "select * from win32_computersystem"
Vous pouvez également utiliser le code C # pour interroger également WMI. La sortie du script ci-dessus sera comme suit:Domaine: ... Fabricant: Microsoft Corporation Modèle: Machine virtuelle Nom: ..... ....
Pour vérifier cela depuis l'invite de commande, vous pouvez exécuter ceci: systeminfo | find "System"
Exemple de sortie pour le serveur virtuel:
System Manufacturer: Microsoft Corporation
System Model: Virtual Machine
System Type: x64-based PC
Exemple de sortie pour le serveur physique:
System Manufacturer: HP
System Model: ProLiant BL460c G6
System Type: x64-based PC
Autant que je sache, il n'y a pas de moyen facile de le faire.
Il y a quelques solutions de contournement, mais il n'y a pas, du moins à ma connaissance, de solution unique.
Ben Armstrong a écrit un article sur Détecter les machines virtuelles Microsoft et il existe une astuce de bas niveau qui permet de déterminer si vous utilisez un Virtual PC ou VMWare , tout en laissant de côté VirtualBox et d'autres.
Une astuce que vous voudrez peut-être essayer consiste à détecter si les outils VMware ou les outils VirtualBox sont installés. Dans la plupart des cas, ils sont installés sur le système d'exploitation invité pour fournir les fonctionnalités nécessaires, mais il sera difficile de conserver les différents GUID d'installation de votre côté, ce n'est donc pas une solution idéale.
--- De même, si la VM est en cours d’exécution dans un environnement Linux KVM, le résultat obtenu est semblable à celui-ci
Il n’existe pas de moyen facile de savoir si vous utilisez une machine nue ou un ordinateur virtuel. La meilleure chose à faire est d’obtenir des informations sur le matériel et de deviner, par exemple, si la machine est équipée d’une carte réseau. qui contient Microsoft, VMware, Oracle, Hyper-V, Virtual ou VirtualBox. Il s’agit très probablement d’une machine virtuelle, étant donné que ni Microsoft, ni Oracle, ni VMware ne fabriquent de cartes réseau.
Lorsque vous utilisez C #, la classe permettant de récupérer cette information et d’autres informations sur le matériel est ManagementClass . Il existe également ce Nice projet qui vous permet de récupérer des tonnes d’informations de votre ordinateur à l’aide de ManagementClass.
Exécutez la commande systeminfo @ command Invite pour plus de détails sur le fabricant et le modèle de système. Vous y trouverez les informations sur la machine virtuelle et physique.
vous pouvez utiliser cette commande dans cmd ou powershell
INFORMATION SYSTÈME
Vous trouverez une ligne avec le texte suivant (ou similaire):
Fabricant du système: VMware, Inc. Modèle de système: VMware Virtual Platform
Essaye ça:
FOR /F "tokens=*" %a IN ('wmic bios get bioscharacteristics^|find /c "33"') DO set USBlegacy=%a
Cela renvoie "1" pour la gamme limitée d'ordinateurs de bureau et d'ordinateurs portables dans mon environnement et "0" pour VMWare Workstation 9, ESX 5.5 et Citrix 6.5 et 7.6. BIOSCharacteristic "50" (un "réservé au fournisseur de système") que je n'ai trouvé que dans les quatre environnements virtuels, de sorte que cela fonctionnerait à l'envers.
Edit: ou il y a ceci:
FOR /F "tokens=*" %a IN ('wmic path win32_pnpentity get ^|find /c "ACPI Fan"') DO set ACPIfan=%a
Renvoie "5" sur un ordinateur de bureau HP, "0" sur VMware Workstation 9 et ESX 5.5, non testé sur les autres.