Olivier Poncet
Directeur Technique · CTO

Récuperer et virtualiser sa licence windows sous Proxmox VE

cover🔗 publié par Olivier Poncet le 28/01/2022 à 17:30

Si comme moi vous êtes sur PC et que vous n’êtes pas utilisateur/trice de Windows, il arrive parfois que vous ayez besoin d’utiliser un logiciel fonctionnement exclusivement sous le système d’exploitation de Microsoft. Cela peut être par exemple un logiciel d’accès VPN propriétaire ou bien des logiciels métiers très spécifiques. Plutôt que de racheter à vil prix une licence Windows, je vais vous montrer comment récupérer la licence inutilisée de votre machine et comment l’exploiter dans une machine virtuelle sous Proxmox VE, sachant que c’est aussi applicable à d’autres solutions de virtualisation.

Disclaimer

Cet article va exposer une méthode de récupération et d’exploitation de votre licence Windows inutilisée. J’insiste lourdement sur le point « non utilisée ». Je suis contre le piratage de façon générale et ce HOWTO n’a pas vocation à encourager ce type d’activité, mais a vocation de vous retirer le caillou qui est dans votre chaussure et exploiter une licence que vous avez déjà payée et que vous n’exploitez pas.

D’un point de vue légal, l’immense majorité des licences Windows préinstallées dans les PC lors de l’achat sont des licences OEM, négociées en volume entre les constructeurs et Microsoft. Elles vous octroient un droit d’utilisation du système d’exploitation sur votre machine et d’après le CLUF (Contrat de Licence Utilisateur Final), cette licence n’a normalement pas vocation à être utilisée sur une autre machine que celle sur laquelle elle a été installée.

Cependant vous pouvez constater que depuis un moment, de nombreux sites/revendeurs proposent des licences Windows à prix cassés voire ultra-cassés. Sachez que la plupart du temps, ces licences sont aussi des licences OEM récupérées depuis des machines destinées au recyclage. Microsoft n’ayant pas de position très claire par rapport à cette pratique, je considère donc (peut-être à tort) que je peux m’octroyer le droit de récupérer la licence OEM inutilisée de mon PC et de l’exploiter comme bon me semble.

Petit ajout à la publication de mon article : l’excellent Wassim Chegham m’a pointé une mention liée à la virtualisation d’une licence OEM dans le texte de la licence :

  1. Droits d’installation et d’utilisation.

[…]

d. Utilisation par plusieurs utilisateurs.

[…]

(iv) Utilisation dans un environnement virtualisé. La présente licence vous autorise à installer une seule instance du logiciel sur un dispositif, qu’il soit physique ou virtuel. Pour pouvoir utiliser le logiciel sur plusieurs dispositifs virtuels, vous devez disposer d’une licence distincte pour chaque instance.

[…]

Voilà ! Ceci étant clairement dit, nous pouvons désormais passer aux choses sérieuses.

Un peu de contexte

Si vous me connaissez déjà ou bien que vous me suivez sur les réseaux sociaux, je suis un utilisateur et défenseur des logiciels libres. L’intégralité de mes machines, serveurs, ordinateurs professionnels ou personnels fonctionnent quasi-exclusivent sous Linux et un petit peu de FreeBSD, aucun ordinateur fonctionnant sous Windows ni MacOS-X. Mais ne vous méprenez pas, je ne suis pas un Ayatollah du libre, chacun fait comme il veut.

Il m’arrive parfois, de façon très ponctuelle, de me retrouver dans une situation où je dois composer avec un logiciel fonctionnant exclusivement sous Windows et n’ayant aucune alternative en termes d’interopérabilité. J’ai eu le cas avec des logiciels de VPN propriétaires par exemple, ou bien des logiciels opérationnels très spécifiques, et ne fonctionnant pas non plus sous Wine. Bref, on pourrait débattre pendant des heures voire des années sur ces sujets d’intéropérabilité, mais ce n’est pas l’objet du présent billet.

Lorsque j’ai acquis mon laptop, j’ai naturellement écrasé le Windows pré-installé par une distribution Linux Mint mais je n’ai malheureusement pas réussi à obtenir le remboursement de cette licence Windows par le constructeur, et ce malgré mes demandes … Bref, j’ai toujours envie de crier « halte aux racketiciels » !!

Bref, j’ai donc techniquement une licence Windows dormante que je n’utilise pas et qui peut me servir dans ces très rares cas où je suis dans l’impossibilité de contourner facilement une contrainte technique. Mais il reste cette question à 100 balles : comment récupérer ce numéro de licence qui m’a été facturé et dont je pourrais me servir, sachant que j’ai nettoyé toutes traces de présence du Windows ?

Toutes traces ? Vraiment ? Peut-être pas …

Fasten your seatbelt

Vous l’ignorez peut-être ou bien peut-être pas, mais lorsqu’une machine est livrée avec une version OEM de Windows, le numéro de licence se trouve inscrit dans les entrailles du système d’exploitation, mais pas que ! Ce numéro est aussi inscrit dans les tréfonds de votre matériel et réside dans une table spécifique du sous-système ACPI de l’ordinateur, acronyme de « Advanced Configuration and Power Interface ».

Dans ce sous-système, il existe plusieurs « tables » de configuration de votre matériel, dont deux qui nous intéressent tout particulièrement :

  • Une table nommée SLIC, pour Software LICencing.
  • Une table nommée MSDM, pour MicroSoft Data Management.

La table SLIC définit les informations nécessaires à la mise en place de l’activation OEM générique. Elle contient les informations relatives au licensing global du constructeur.

+------------------------------+--------+--------+---------------------------------------------------------------------------------------------------------------+
| Field                        | Length | Offset | Description                                                                                                   |
+------------------------------+--------+--------+---------------------------------------------------------------------------------------------------------------+
| Signature                    | 4      | 0      | SLIC                                                                                                          |
| Length                       | 4      | 4      | Length, in bytes, of the entire table. The length implies the number of entry fields at the end of the table. |
| Revision                     | 1      | 8      | 0x01                                                                                                          |
| Checksum                     | 1      | 9      | Checksum of the entire table.                                                                                 |
| OEMID                        | 6      | 10     | An OEM-supplied string that identifies the OEM; must match OEMID in the ACPI RSDT and XSDT tables.            |
| OEM Table ID                 | 8      | 16     | Optional motherboard/BIOS logical identifier; must match OEM Table ID in the ACPI RSDT and XSDT tables.       |
| OEM Revision                 | 4      | 24     | OEM revision number of the table for the supplied OEM Table ID.                                               |
| Creator ID                   | 4      | 28     | Vendor ID of the utility that created the table.                                                              |
| Creator Revision             | 4      | 32     | Revision of the utility that created the table.                                                               |
| Software Licensing Structure | Var.   | 36     | Proprietary data structure that contains all the licensing data necessary to enable Windows activation.       |
+------------------------------+--------+--------+---------------------------------------------------------------------------------------------------------------+

La table MSDM définit les informations nécessaires à l’activation OEM individualisée. Elle contient les informations relatives au licensing spécifique de la machine, dont le numéro de licence qui nous intéresse.

+------------------------------+--------+--------+---------------------------------------------------------------------------------------------------------------+
| Field                        | Length | Offset | Description                                                                                                   |
+------------------------------+--------+--------+---------------------------------------------------------------------------------------------------------------+
| Signature                    | 4      | 0      | MSDM                                                                                                          |
| Length                       | 4      | 4      | Length, in bytes, of the entire table.                                                                        |
| Revision                     | 1      | 8      | 0x01                                                                                                          |
| Checksum                     | 1      | 9      | Checksum of the entire table.                                                                                 |
| OEMID                        | 6      | 10     | An OEM-supplied string that identifies the OEM.                                                               |
| OEM Table ID                 | 8      | 16     | Optional motherboard/BIOS logical identifier.                                                                 |
| OEM Revision                 | 4      | 24     | OEM revision number of the table for the supplied OEM Table ID.                                               |
| Creator ID                   | 4      | 28     | Vendor ID of the utility that created the table.                                                              |
| Creator Revision             | 4      | 32     | Revision of the utility that created the table.                                                               |
| Software Licensing Structure | Var.   | 36     | Proprietary data structure that contains all the licensing data necessary to enable Windows activation.       |
+------------------------------+--------+--------+---------------------------------------------------------------------------------------------------------------+

Pour notre manipulation, nous aurons seulement besoin de la seconde table, la MSDM. Cependant, si ce que nous nous apprêtons à faire devait échouer au niveau de l’activation de Windows, nous pourrions aussi tenter avec les deux tables en même temps, SLIC et MSDM.

Allons à la pêche aux données

Extraction des informations de la machine

Nous aurons besoin des données uniques de la machine. Nous allons donc les extraire avec la commande dmidecode qui permet d’obtenir toutes les données DMI (norme Desktop Management Interface) de l’ordinateur. Cette commande a besoin des droits superutilisateur, donc soit vous êtes déjà root, soit vous utilisez sudo.

user@host:~$ sudo dmidecode | grep -A8 "System Information" | tee dmidecode.txt

Vous devriez obtenir quelque-chose ressemblant à ceci à l’écran ainsi que dans le fichier dmidecode.txt :

System Information
	Manufacturer: <fabricant du PC>
	Product Name: <modèle de PC>
	Version: <version du modèle, si applicable>
	Serial Number: <numéro de série du PC>
	UUID: <numéro unique de la machine>
	Wake-up Type: Power Switch
	SKU Number: <unité de gestion de stock>
	Family: <famille de l'odinateur>

Gardez précieusement ces données quelque-part, nous en aurons besoin un peu plus tard lors de la création de la machine virtuelle.

Extraction de la table SLIC

Nous allons maintenant extraire la table SLIC. A priori elle ne devrait pas nous servir (je n’en n’ai jamais eu besoin en tout cas), mais autant l’avoir sous la main au cas où.

user@host:~$ sudo cat /sys/firmware/acpi/tables/SLIC > SLIC.bin

Extraction de la table MSDM

Pour terminer, nous allons extraire la table MSDM. C’est elle qui nous permettra d’installer Windows sans qu’il ne nous demande un quelconque numéro de licence.

user@host:~$ sudo cat /sys/firmware/acpi/tables/MSDM > MSDM.bin

Transfert des tables sur le nœud Proxmox VE

Une fois les tables extraites, vous devez maintenant les transférer sur votre nœud Proxmox VE.

Je vous conseille de les placer à un endroit logique et facile d’accès. Pour ma part, j’ai décidé de créer un sous-répertoire acpi dans le répertoire /var/lib/vz qui est traditionnellement l’endroit où sont stockées les données des machines virtuelles dans l’hyperviseur.

Connectez-vous par sftp à votre nœud Proxmox VE :

user@host:~$ sftp root@{nom-ou-adresse-ip-de-la-machine}

Puis passez les commandes suivantes :

cd /var/lib/vz
mkdir acpi
cd acpi
put SLIC.bin
put MSDM.bin
exit

Préparation de la machine virtuelle

Les étapes précédentes étant réalisées, nous allons maintenant créer la machine virtuelle. Notez que je vais prendre le parti d’utiliser des périphériques VirtIO pour des raisons assez évidentes de performances.

Une fois les images ISO téléchargées, cliquez sur le bouton Créer VM et laissez vous guider …

Étape 1

Renseignez le champ VM ID ainsi que le champ Nom.

Étape 1

Étape 2

Renseignez le champ Image ISO en sélectionnant l’image ISO d’installation de Windows. Configurez ensuite le type d’OS invité en positionnant le champ Type à Microsoft Windows puis le champ Version à 10/2016/2019.

Étape 2

Étape 3

Renseignez le champ Carte graphique ; pour ma part j’utilise ici SPICE car cela permet de rediriger l’affichage, les ports USB, l’audio, … et donc d’avoir un véritable desktop distant de façon transparente ; cela implique évidemment que vous ayez à disposition un client spice installé sur votre machine. Si ce n’est pas le cas, choisissez autre chose. Puis séléctionnez le contrôleur SCSI en le positionnant sur VirtIO SCSI. Enfin cochez la case Agent Qemu.

Étape 3

Étape 4

Configurez le disque virtuel en positionnant Bus/Device sur SCSI, puis sélectionnez la destination du disque virtuel (ici local-zfs), la taille (je vous recommande au moins 64Gio), enfin cochez les cases Discard et Émulation de SSD (si vous le souhaitez et si applicable pour votre hyperviseur).

Étape 4

Étape 5

Configurez la partie CPU. Ici, pas trop de mystères, mettez ce que vous voulez ou bien ce que vous pouvez. Je dirais qu’une configuration basico-basique de type 1 socket / 4 cœurs fait largement le boulot, mais encore une fois, cela dépend du hardware de votre hyperviseur et je vous conseillerais de ne pas trop vous écarter des spécifications de la machine d’origine, la validation des licences Windows par les serveurs de Microsoft reposant à priori en partie dessus.

Étape 5

Étape 6

Configurez ici la mémoire de votre machine virtuelle en renseignant le champ Mémoire exprimé en Mio. Un bon 4Gio des familles ira très bien même si la machine d’origine sortie d’usine possèdait 8Gio. La quantité de mémoire n’influe à priori pas beaucoup sur la validation ou l’invalidation de la licence Windows. Activez la case à cocher Périphérique de Balloning ce qui permettra de gérer dynamiquement les besoins en mémoire de la machine virtuelle.

Étape 6

Étape 7

Configurez votre périphérique réseau. Sélectionnez le bridge correspondant à votre réseau interne (ici vmbr1 sur mon hyperviseur), puis sélectionnez le modèle de carte réseau en le positionnant sur VirtIO. Enfin, cochez la case Déconnecter, c’est important pour l’installation. Optionnellement vous pouvez cocher ou décocher la case Parefeu en fonction de vos besoins ou exigences.

Étape 7

Étape 8

Nous voici sur la page récapitulant les caractéristiques de la machine virtuelle. Vous n’avez donc qu’à tout vérifier et si tout est bon pour vous, cliquez sur Terminer afin de créer effectivement la machine virtuelle.

Étape 8

Étape 9

La machine virtuelle créée, rendez-vous sur l’onglet Matériel. Ajoutez un second lecteur CD/DVD sur le port ide3 et chargez-y l’image virtio-win-x.x.xxx.iso précédemment téléchargée. Si vous utilisez un client SPICE comme moi, vous pouvez aussi ajouter un périphérique audio ainsi qu’un périphérique USB en fonction de vos usages futurs.

Étape 9

Étape 10

Rendez-vous ensuite sur l’onglet Options. Vérifiez et ajustez les paramètres de la machine virtuelle si nécessaire, par exemple Ordre de boot, Protection, etc …

Étape 10

Étape 11

Toujours sur l’onglet Options, double-cliquez sur Paramètres SMBIOS (type 1). Une boite de dialogue va s’ouvrir. Renseignez ici les informations avec celles recueillies précédemment dans le fichier dmidecode.txt puis cliquez sur OK.

Étape 11

Étape 12

Nous en avons quasiment terminé avec la préparation de la machine virtuelle. Il ne nous reste plus qu’à déclarer la table ACPI MSDM. Pour ce faire, ouvrez la console de votre nœud Proxmox VE, puis ouvrez le fichier de configuration correspondant à votre machine virtuelle présent dans le répertoire /etc/pve/qemu-server.

Avec vi :

user@host:~$ vi /etc/pve/qemu-server/{vmid}.conf

ou bien nano :

user@host:~$ nano /etc/pve/qemu-server/{vmid}.conf

Étape 12

Étape 13

Ajoutez une entrée args avec une option -acpitable comme décrit ci-dessous. Cette option sera passée à qemu lors de l’exécution de la machine virtuelle.

args: -acpitable file=/var/lib/vz/acpi/MSDM.bin

Selon votre configuration réseau, peut-être avez-vous besoin que la machine virtuelle fonctionne en mode NAT. Cette possibilité a été retirée de l’interface utilisateur de Proxmox il y a un moment, mais elle reste toujours possible. Il suffit pour cela de retirer le bridge de l’interface réseau virtuelle. Si vous ne savez pas à quoi ça sert ou ce que cela implique, ne touchez à rien. Vérifiez juste que vous avez bien la mention link_down=1.

Une fois tout saisi et vérifié deux fois, enregistrez le fichier de configuration puis quittez votre éditeur de texte.

Étape 13

Étape 14

Votre machine virtuelle est désormais fin prête à l’installation de Windows et accompagnée de votre clé de licence originale.

Étape 14

Installation de la machine virtuelle

Démarrez la machine virtuelle et connectez-vous à sa console.

Étape 0

Vous arrivez sur la mire d’installation, cliquez sur Suivant.

Étape 1

Vous êtes prêt ? Alors cliquez sur Installer maintenant.

Étape 2

Le programme d’installation démarre.

Étape 3

Si vous arrivez directement sur cette page sans que l’installeur ne vous demande de rentre un numéro de licence, alors c’est qu’il a bien détecté notre fichier de licence dans les informations ACPI. Cochez la case J'accepte les termes du contrat de licence puis cliquez sur Suivant.

Étape 4

Selectionnez le type d’installation Personnalisé : installer uniquement Windows (avancé).

Étape 5

Vous arrivez sur le choix du disque de destination. Comme nous avons choisi un périphérique VirtIO comme disque dur, nous devons charger les pilotes nécessaires pour que l’installeur puisse le détecter. Cliquez alors sur Charger un pilote.

Étape 6

Une fenêtre popup apparaît, cliquez sur le bouton Parcourir.

Étape 7

Une boite de dialogue de sélection de fichier s’ouvre, naviguez vers le second lecteur CD/DVD (disque E:), dépliez le répertoire amd64, sélectionnez le répertoire w10, puis cliquez sur OK.

Étape 8

L’installeur trouve le pilote VirtIO SCSI, cliquez sur Suivant et laissez l’installeur opérer le chargement du pilote.

Étape 9

Vous voici maintenant devant le choix du disque de destination, votre disque virtuel doit maintenant apparaître. Sélectionnez-le puis cliquez sur Suivant.

Étape 10

L’installation démarre …

Étape 11

Étape 12

Étape 13

Étape 14

Une fois les fichiers copiés, l’installeur va redémarrer une première fois et procéder à l’installation à proprement dite puis redémarrer une seconde fois.

Étape 15

Étape 16

Étape 17

Étape 18

Étape 19

Étape 20

Une fois l’installation effectuée et le redémarrage opéré, vous arrivez sur la finalisation de votre installation.

Étape 21

Étape 22

Étape 23

Étape 24

Étape 25

Étape 26

Étape 27

Étape 28

Étape 29

Étape 30

Étape 31

Étape 32

Étape 33

Étape 34

Étape 35

Étape 36

Une fois toutes les questions répondues, nous y sommes presque !

Étape 37

Étape 38

Et bim ! Voici un Windows tout neuf. Mais il nous reste encore à installer tous les pilotes VirtIO et les outils invité.

Étape 39

Ouvrez le second lecteur CD/DVD virtuel.

Étape 40

Lancez l’installeur virtio-win-gt-64.exe et suivez les étapes …

Étape 41

Étape 42

Étape 43

Étape 44

Étape 45

Étape 46

Étape 47

Lancez ensuite l’installeur virtio-win-guest-tools.exe et suivez les étapes …

Étape 48

Étape 49

Étape 51

Une fois que tout est installé, arrêtez votre machine virtuelle via le menu démarrer de Windows. Une fois la machine arrêtée, éjectez les images ISO des lecteurs CD/DVD virtuels, reconnectez le réseau de la carte réseau vrituelle dans l’onglet Matériel puis redémarrez la machine virtuelle, logguez-vous et rendez-vous dans la section Activation de Windows. Ce dernier doit vous notifier que cette instance de Windows est activée à l’aide d’une licence numérique.

Étape 52

Pour finir

Et voilà ! Vous n’avez plus qu’à passer les mises à jour du système d’exploitation et installer les logiciels dont vous avez besoin.

Si jamais quelque-chose échoue au niveau de l’activation, retentez en ajoutant la table ACPI SLIC. Sinon revérifiez tout, peut-être que le problème vient d’ailleurs ou bien que votre licence a été blacklistée par les serveurs de Microsoft.

What else ?

Ce petit trick est bien utile pour récupérer une licence acquise légalement avec un ordinateur et pour pouvoir la réutiliser. Evidemment, ce que j’ai fait dans cet article sous Proxmox VE est transposable plus ou moins facilement vers un autre système de virtualisation, que ce soit VirtualBox, virt-manager, etc … Vous avez la recette de base.

Encore une fois je ne pousse pas au piratage de licences, chose contre laquelle je suis totalement opposé. Si vous avez besoin de licences logicielles, achetez-les ! Si vous ne souhaitez pas payer, tournez-vous vers les logiciels libres s’il existe des alternatives à vos besoins.