Dans mon article sur Windows 365 pour Agent, j’ai donné un Cloud PC à un agent Copilot Studio pour qu’il traite des factures tout seul. Reste la partie la plus fastidieuse : écrire ses instructions…. Décrire chaque écran, chaque clic et chaque contrôle à la main prend du temps, et on oublie toujours un cas ! J’ai donc créé ma propre petite application, Procedure Studio : on lui donne la vidéo d’un processus métier, elle en tire les instructions prêtes à coller dans l’outil Computer use.
Dans cet article, je vous présente ma nouvelle application, encore au stade de concept, puis on la suit sur un vrai cas de facturation : de la vidéo jusqu’au test dans Copilot Studio :
Pour vous guider plus facilement dans cet article, voici des liens rapides :
1. Après Windows 365 pour Agent : tout se joue dans le prompt
Pour rappel, dans mon précédent article, Windows 365 pour Agent, nous avions déjà préparé l’environnement : un agent dans Copilot Studio, un Cloud PC sur lequel il peut agir et un déclenchement automatique à l’arrivée d’un e-mail. L’exemple était déjà celui d’une facture, avec extraction des informations d’un PDF, saisie dans des formulaires et mise à jour d’Excel :
Le moteur de tout ça, c’est Computer use : l’outil de Copilot Studio qui pilote les sites web et les applications Windows avec une souris et un clavier virtuels, même quand il n’existe aucune API. Et Microsoft est clair sur ce qui fait la différence :
The instructions you write determine how well computer use works.
Concrètement, ça donne quoi ? L’exemple de facturation proposé par Microsoft tient en trois lignes :
ouvrir le gestionnaire de factures,
filtrer sur les dernières 24 heures,
recopier le PDF dans un formulaire.
Parfait pour une démo.
Mais mon processus réel enchaîne cinq applications : InvoiceHub, un portail de saisie, Microsoft Forms, SharePoint et Excel. Il faut aussi prévoir ce que l’agent doit faire face à deux factures candidates, une soumission sans confirmation ou un bouton introuvable.
Voici le rendu final une fois que l’agent est correctement configuré :
Écrire tout cela à la main, c’est du temps de rédaction, et une relecture sans fin à chaque changement du processus. Le piège classique : un prompt trop court, et l’agent improvise. D’où l’idée de cette application.
2. Mon idée : filmer une fois, laisser l’IA écrire
Plutôt que de rédiger le prompt ligne par ligne, je pars de ce que je sais déjà faire : traiter la facture moi-même. J’enregistre mon écran pendant le traitement (ouverture du PDF, récupération des valeurs, passage d’un portail à l’autre, mise à jour du suivi comptable) et c’est l’IA qui transforme cette vidéo en procédure, puis en instructions pour l’agent.
Le parcours tient en six étapes :
Filmer le processus métier à automatiser.
Laisser l’application analyser la vidéo et en extraire une procédure structurée.
Relire les étapes, préciser les applications et ajouter les règles métier.
Générer le prompt d’exécution destiné à Computer use.
Tester ce prompt sur le Cloud PC, avec des données de démonstration.
Corriger dans l’application et retester, avant d’envisager un déclenchement automatique.
Tout l’intérêt est là : un résumé de la vidéo dirait « la facture est saisie dans le portail ». L’application, elle, doit produire une procédure exploitable : quel portail ouvrir, comment afficher le formulaire, quelles données saisir et quel message confirme l’enregistrement. Et comme la vidéo ne montre qu’une facture, il faut distinguer les gestes à reproduire des valeurs à relire à chaque exécution :
Attention : on ne réentraîne pas le modèle de l’agent avec la vidéo. Elle sert uniquement à écrire ses instructions. L’agent exécute ensuite ce texte en observant l’interface réelle des applications.
3. Procedure Studio : l’application que j’ai créée
Pour tester cette idée, j’ai construit Procedure Studio. Je ne suis pas parti d’un produit existant : j’ai développé l’application avec GitHub Copilot dans Visual Studio Code, en lui décrivant simplement ce que je voulais obtenir, écran par écran.
C’est un concept, pas un produit fini, mais il couvre déjà tout le parcours, de la vidéo au prompt :
L’application ne se contente pas de générer du texte : elle rassemble au même endroit tout ce dont l’agent a besoin. Elle s’organise en cinq onglets :
Record : déposer la vidéo métier et lancer son analyse.
Applications : retrouver les applications détectées dans la vidéo et leurs adresses de démarrage.
Authentication : préciser le contexte d’accès attendu pour chaque application, sans jamais inscrire de mot de passe dans le prompt.
Documents : ajouter les documents qui encadrent le traitement, comme les règles de facturation.
Agent Instructions : obtenir les instructions finales, prêtes à coller dans Computer use.
La page Recent Procedures permet de reprendre une procédure existante. Après un test, on corrige les instructions sans refilmer tout le processus :
Une règle guide toute l’application : ce qui vient de la vidéo doit correspondre à ce qui est visible à l’écran, et ce qui est ajouté ensuite doit être explicite. Une adresse illisible est un point à compléter, pas une invitation à laisser l’IA deviner.
4. Démo : de la vidéo de facturation au prompt
Le cas métier filmé traite une facture dans cinq applications successives :
InvoiceHub, pour consulter une facture récente et son PDF.
Contoso Invoice Management Portal, pour créer et soumettre la facture.
Microsoft Forms, pour enregistrer les informations de la facture.
SharePoint, pour ouvrir le classeur comptable.
Excel pour le web, pour mettre à jour la ligne de la facture.
Voyons maintenant comment Procedure Studio transforme cette vidéo en instructions.
Étape 1 : créer la procédure et déposer la vidéo
Commencez par faire une vidéo de votre processus métier enregistrée au format mp4 :
Dans la navigation, sélectionnez New Procedure. Sur la page de capture, sélectionnez Upload a video pour choisir le fichier, puis Upload video pour le téléverser. La vidéo doit montrer les actions dans les applications :
Étape 2 : lancer l’analyse
Sélectionnez Start analysis :
Le statut indique que l’analyse est en cours :
Et là, magie : la vidéo devient une procédure structurée, avec les actions dans l’ordre et le résultat attendu à chaque étape. Prenez le temps de la relire :
Étape 3 : vérifier les applications et les accès
Dans Applications, vérifiez pour chaque outil son nom, son adresse de démarrage et l’action qui mène au bon écran. Ouvrir un portail n’est pas la même chose qu’ouvrir son formulaire Add New Invoice : si cette transition manque, l’agent bloque avant la première saisie :
Dans Authentication, examinez l’accès attendu pour chaque application. L’onglet documente le besoin ; les connexions et les droits de l’agent restent configurés sur le Cloud PC :
Étape 4 : ajouter les règles de l’entreprise
Cette étape est facultative, mais peut apporter plus de contexte pour la génération des instructions de votre agent,
Dans Documents, sélectionnez Add document. Pour la démo, j’ajoute un PDF de règles fictives. Son texte apparaît dans Documents and guidelines et apporte ce que les clics de la vidéo ne disent pas :
Enfin, pensez à sauvegarder.
Étape 5 : générer le prompt
Sélectionnez Generate agent instructions :
Quelques minutes plus tard, le texte apparaît dans Agent Instructions. Relisez les adresses, l’ordre des actions et les conditions d’arrêt avant de le copier :
5. Ce que l’application produit
Comparé aux trois lignes de l’exemple Microsoft, le prompt généré est bien plus complet. Il s’organise en six blocs :
Bloc du prompt
Ce qu’il précise
Le point de départ
Quel site ouvrir et quels éléments doivent être visibles.
Les données variables
Quelles valeurs lire dans le PDF de la facture courante.
Le parcours applicatif
Dans quel ordre ouvrir, renseigner et soumettre les écrans.
Les contrôles
Comment vérifier les champs, les montants et les confirmations.
Les exceptions
Quand arrêter les tentatives et signaler un blocage.
Le bilan final
Quelles actions sont confirmées et lesquelles restent à vérifier.
Le plus intéressant, ce sont les consignes qu’on oublierait en écrivant à la main. En croisant la vidéo, le document de règles et ma relecture, on obtient par exemple :
Lire les valeurs dans la facture du jour (fournisseur, numéro, dates, total, lignes), jamais celles de la démo.
Exiger une confirmation visible à chaque étape : Invoice Submitted Successfully dans le portail, l’écran de remerciement de Forms, l’état Saved dans Excel.
S’arrêter au lieu de choisir au hasard : plusieurs factures candidates ou plusieurs lignes Excel avec le même numéro, et l’agent demande laquelle traiter.
Ne pas tourner en boucle : après deux tentatives sans effet visible, l’agent cesse de répéter et signale l’écran bloquant.
Éviter les doublons : si une soumission est incertaine, vérifier ce qui a déjà été enregistré avant de recommencer.
Ce sont ces détails qui font la différence entre un agent qui improvise et un agent qui avance seul dans les cas prévus, puis s’arrête proprement quand quelque chose cloche :
6. Le moment de vérité : le test dans Copilot Studio
Direction Copilot Studio et mon agent de démonstration. Dans Tools, j’ouvre Computer use et je colle les instructions générées par Procedure Studio dans la zone Instructions. Le Cloud PC et les accès sont ceux préparés dans l’article précédent.
Le bouton Test directly lance l’outil seul, sans le reste de l’agent. Le panneau de test affiche à gauche le journal des actions et du raisonnement, à droite un aperçu de la machine, et Stop testing interrompt tout à tout moment :
C’est là que l’application prend tout son sens : si un essai échoue, pas besoin de réécrire le prompt à la main, je reviens dans l’application, je corrige l’étape, l’adresse ou la règle concernée, je régénère et je reteste :
Il ne reste plus qu’à attendre que l’IA finisse le travail !
7. Combien ça coûte ?
Question légitime avant de lancer quoi que ce soit en production. Avec cette approche, la facture se répartit en postes bien distincts :
Poste
Quand on le paie
Ce qui le fait varier
L’analyse de la vidéo par l’IA
Une fois par procédure, et à chaque régénération
Le modèle utilisé et la durée de la vidéo
Le travail de l’agent
À chaque facture traitée
Le nombre d’étapes Computer use et le temps passé sur le Cloud PC
L’analyse de la vidéo
Quand Procedure Studio analyse la vidéo et génère le prompt, il consomme un modèle d’IA, facturé selon le volume traité :
Bonne nouvelle : ce coût se paie une fois par procédure, pas à chaque facture. Une correction après un test ne demande qu’une régénération, pas une nouvelle vidéo.
Le travail de l’agent : deux compteurs
C’est le poste qui revient à chaque exécution. Microsoft le précise sur la page de Windows 365 pour Agent : les capacités de l’agent et le Cloud PC sont facturés séparément. Il y a donc deux compteurs.
Premier compteur, Copilot Studio et ses Copilot Credits. Ils s’achètent en packs de 25 000 crédits à 200 $ par pack et par mois, ou au compteur pay-as-you-go, réglé en fin de mois selon la consommation réelle. Pour Computer use, Microsoft Learn est très clair : chaque étape consomme 5 Copilot Credits avec un modèle standard, ou 15 avec un modèle premium. L’exemple donné par Microsoft, une feuille de temps remplie en quatre étapes, coûte donc 20 crédits.
Second compteur, le Cloud PC Windows 365 pour Agent, facturé à l’heure d’utilisation. Pour un Cloud PC à la demande, Microsoft affiche 0,52 $ de l’heure en Europe et 0,572 $ en France. Un Cloud PC toujours disponible ajoute un forfait mensuel fixe, 6,50 $ par mois en Europe. Pour démarrer, l’utilisation déclenchée depuis le chat de test intégré n’est pas facturée, et chaque tenant dispose de 50 heures gratuites pour un agent publié qui tourne en autonomie.
Concrètement, ça donne quoi ? Prenons une hypothèse de 50 étapes Computer use pour traiter une facture sur les cinq applications (chiffre à mesurer pendant vos essais). Cela représente 250 crédits avec un modèle standard, soit environ 2 $ au tarif du pack, ou 750 crédits avec un modèle premium, soit environ 6 $. À cela s’ajoute le temps passé sur le Cloud PC.
Voici les coûts dans mon environnement après plusieurs tests :
Mon retour terrain : c’est là que la qualité du prompt devient aussi une question de budget. Chaque boucle sur un bouton introuvable, chaque champ ressaisi pour rien, c’est une étape de plus, donc des crédits en plus. Les règles d’arrêt générées par Procedure Studio limitent aussi la facture.
8. Avant de confier le processus à l’agent
Un bon prompt cadre le travail de l’agent, mais il ne remplace pas la sécurité de son environnement. Microsoft recommande des machines dédiées, un compte aux privilèges limités et un accès restreint aux sites et applications nécessaires. Les adresses écrites dans le prompt ne constituent pas, à elles seules, une restriction d’accès.
Attention : dans mon précédent exemple, l’agent ne posait aucune question. Ici, il doit demander à l’opérateur en cas d’ambiguïté. Pour une exécution en arrière-plan, écrire « demander à l’opérateur » ne suffit pas : il faut prévoir le canal qui remonte l’alerte et permet la reprise.
9. Conclusion
Voilà, en six étapes, le parcours que permet Procedure Studio : filmer le processus, analyser la vidéo, l’enrichir avec les règles métier, générer le prompt, le tester dans Copilot Studio et l’améliorer.
Concrètement, ça donne quoi ? Le premier article donnait un poste de travail à l’agent. Celui-ci montre qu’avec une application créée en quelques échanges avec une IA de code, on peut aussi automatiser l’écriture de ses instructions. On montre le processus une fois, l’application rédige, on relit et on teste.
Les 4 pièges à retenir :
Une vidéo ne contient pas toutes les règles : ajoutez les documents métier.
Le prompt généré se relit : adresses, ordre des actions et conditions d’arrêt.
C’est le test, pas la longueur du prompt, qui dit si l’agent est prêt.
Et bien sûr, attention aux différents coûts !
Foncez tester ce type d’approche en lab sur un processus limité. Et si l’idée d’une application qui écrit les prompts de vos agents vous parle, dites-le moi en commentaire !
🤖
Contenu assisté par IACet article a été rédigé avec l’assistance d’une intelligence artificielle et relu par l’auteur.
Vous avez entendu parler des skills, de la mémoire ou des nouveaux Workflows de Copilot Studio, mais vous ne les avez jamais vus travailler ensemble dans un même agent ? Cet article est fait pour vous. On part d’un nouvel agent et on va dérouler, capture après capture, la revue complète d’une facture fournisseur, du fichier Excel jusqu’au workflow qui relance l’agent tout seul depuis SharePoint.
Le support de ce parcours, c’est le lab ILL224 « See How Far One Agent Goes in Copilot Studio », proposé par Microsoft dans le cadre du Microsoft Frontier Tour 2027. Tout est public sur GitHub : instructions, données de démo, skill packagée, jeu d’évaluation et même le script de provisioning SharePoint. De quoi le rejouer tranquillement dans votre propre tenant.
Si vous avez lu mon article sur l’agent autonome qui trie les mails dans Copilot Studio, vous retrouverez certains réflexes côté Workflows. Ici, on pousse le curseur beaucoup plus loin : jusqu’où un seul agent peut-il aller ?
Pour vous guider plus facilement dans cet article, voici des liens rapides :
1. Le scénario : une facture qui dépasse le contrat
Caldova Pharmaceuticals (entreprise fictive) reçoit une facture d’Astor Ridge Biologics, son façonnier de production. Problème : certaines lignes semblent dépasser ce que prévoit le contrat. Avant que la Finance ne la traite, un responsable achats doit croiser la facture avec les enregistrements opérationnels à jour, le contrat en vigueur, les approbations écrites et un éventuel blocage qualité.
Le genre de vérification qui fait ouvrir six onglets et trois boîtes mail. Le lab confie ce travail de fourmi à un agent, le Supplier Assurance Agent, qui va :
lire la facture Excel que vous lui joignez ;
récupérer les enregistrements à jour dans les listes SharePoint ;
appuyer ses conclusions sur les contrats, la politique, les approbations et les documents qualité ;
enchaîner deux skills, dont une qui exécute du Python packagé ;
générer un rapport de revue au format PDF ;
consigner sa recommandation dans un journal, après votre confirmation ;
et enfin traiter une seconde facture via un workflow, sans aucune conversation.
Le garde-fou est posé dès le départ : l’agent ne paie jamais une facture, ne rejette aucune ligne, ne modifie pas le statut d’un fournisseur et ne pose pas de blocage qualité. Il recommande, une personne habilitée décide. Toutes les données du lab (fournisseurs, factures, contrats) sont fictives.
2. Les briques mobilisées par un seul agent
Ce qui rend ce lab intéressant, c’est le nombre de briques qu’un seul agent fait travailler ensemble :
Brique
Rôle dans le lab
Instructions
Cadrer la mission de l’agent et ses interdits
Knowledge SharePoint
Dire ce qui est permis : contrats, politique, approbations, documents qualité
Outils SharePoint (MCP ou connecteur)
Dire ce qui est vrai maintenant : lire et mettre à jour les listes en direct
Skill invoice-fact-check
Rassembler et structurer les faits cités, sans calculer ni décider
Skill invoice-review-decision
Exécuter le Python packagé, appliquer la politique et générer le PDF
Memory
Retenir les préférences de communication, jamais les faits du dossier
Evaluate
Rejouer des conversations de référence pour détecter les régressions
Workflows
Déclencher l’agent à la création d’une demande dans SharePoint
💡 La nuance entre knowledge et outil est la clé de tout le lab. Les deux pointent sur SharePoint, mais la knowledge retrouve des passages dans des documents, alors que l’outil interroge et modifie des enregistrements structurés.
3. Ce qu’il faut préparer avant de commencer
En session guidée, tout est préparé à l’avance dans une VM Skillable. Pour le rejouer chez vous, voici ce qu’il vous faut :
Élément
Détail
Copilot Studio
Un environnement où sont activés le harness GitHub Copilot, les skills, l’exécution de code en sandbox, la création de fichiers, la mémoire, l’évaluation et les Workflows
Capacité
Des Copilot Credits en quantité suffisante, chaque test consomme
Site SharePoint
Caldova Supplier Operations : une bibliothèque Contracts (six documents) et six listes (Suppliers, Supplier Invoices, Invoice Lines, Quality Events, Invoice Review Requests, Invoice Review Log)
Provisioning
Le script PowerShell Provision-ILL224SharePoint.ps1 du dépôt (module PnP.PowerShell et application Entra approuvée), idempotent
Fichiers du lab
Dans package/LearnerVM : la facture Caldova_Astor_Ridge_Invoice.xlsx, la skill invoice-review-decision.zip et le CSV Supplier-Assurance-Baseline.csv
Identité
Le même compte pour les connexions SharePoint et Copilot Studio
Durée
Environ 60 minutes en session guidée
Attention : les instructions du dépôt utilisent des variables Skillable pour les URL. À la maison, remplacez-les par vos propres valeurs. Dans cet article, l’URL du tenant de démo est remplacée par https://VOTRE-TENANT.sharepoint.com/sites/CaldovaSupplierOps.
4. Créer l’agent et ajouter la connaissance SharePoint
On commence par poser le rôle de l’agent et ses limites, avant de lui donner accès à la moindre donnée. Connectez-vous à Copilot Studio et vérifiez que vous êtes dans le bon environnement (DevOne dans le lab).
Étape 1 : Créez l’agent
Sur la page d’accueil de Copilot Studio, sélectionnez la vignette Agent :
Le canevas Build de l’agent s’ouvre.
Étape 2 : Nommer l’agent
Cliquez sur Untitled Agent et renommez l’agent en Supplier Assurance Agent :
Le nouveau nom s’affiche en haut du canevas Build.
Étape 3 : Ajouter les instructions
Dans Instructions, collez le texte suivant :
You are the Caldova Supplier Assurance Agent.
Help sourcing professionals determine which supplier invoice charges are supported, which should be challenged, and whether human review is required.
Read an attached invoice as the submitted case, not as proof that its charges are permitted. Use the SharePoint MCP for current supplier, invoice, line-item, and quality records. Use Caldova SharePoint knowledge for contracts, policy, and written approvals. Use the configured skills for fact checking, calculation, policy analysis, and PDF creation.
Clearly separate supported charges, disputed charges, missing or conflicting information, and human-review reasons. Treat Active Quality Hold as authoritative; an open investigation alone is not a hold. Cite governed documents.
Ask for confirmation before creating an Invoice Review Log item. Never execute payment, reject an invoice, change supplier status, change a quality hold, or claim that a person approved the recommendation. Use memory only for communication preferences, never case facts.
La zone Instructions contient l’intégralité du cadrage de l’agent.
Relisez le dernier paragraphe : confirmation obligatoire avant toute écriture dans le journal, aucune action financière et une mémoire limitée aux préférences. Tout le reste du lab s’appuie sur ces trois règles.
Étape 4 : Ajouter la connaissance SharePoint
Dans le panneau de droite, sous Knowledge, sélectionnez + puis SharePoint. Dans Enter URL of a SharePoint site, saisissez l’URL de votre site, puis sélectionnez Add et Add to agent :
La section Knowledge affiche Caldova Supplier Operations comme source.
Le piège classique : les instructions du dépôt demandent aussi de retirer la pastille Search all websites dans Knowledge (la petite croix), puis d’enregistrer avec Save. Sans cela, l’agent peut aller chercher ses réponses sur le web au lieu de s’en tenir aux documents gouvernés de Caldova.
5. Tester les citations et ajouter les outils SharePoint
Étape 5 : Préparer une question de test
En haut de l’écran, sélectionnez Preview, puis saisissez la question suivante dans Message Supplier Assurance Agent :
Under contract CMO-2026-041, what is the maximum expedited-production premium for a $185,000 batch, and what approval is required above that amount?
La question est prête à être envoyée.
Étape 6 : Envoyer la question
Sélectionnez le bouton d’envoi ↑ à droite de la zone de message :
La question part et l’agent commence à répondre.
Concrètement, ça donne quoi ? La réponse doit annoncer un plafond de 4 % du lot, soit 7 400 $ pour un lot à 185 000 $, et préciser qu’au-delà il faut un bon de commande révisé et une approbation écrite d’un VP. La formulation peut varier : vérifiez les faits et la source, pas la phrase exacte.
✅ Point de contrôle : l’agent s’appelle Supplier Assurance Agent et la source Caldova Supplier Operations est bien sélectionnée dans Knowledge.
Étape 7 : Ouvrir le contrat cité
Sous Citations, sélectionnez Caldova_Astor_Ridge_Manufacturing_Agreement.docx :
Le contrat cité s’ouvre dans Word : la réponse est bien ancrée dans un document gouverné.
Vérifiez que le document vient bien sur site SharePoint renseignée, puis fermez la page :
Étape 8 : Revenir à la vue Build
Revenez dans l’onglet de Copilot Studio et sélectionnez Build dans la navigation supérieure :
L’agent s’ouvre dans la vue Build, avec le panneau de configuration à droite.
Attention : le dépôt propose deux façons de donner à l’agent un accès en direct aux listes : le SharePoint MCP (onglet MCP, parcours principal du lab) ou quatre actions du connecteur SharePoint (onglet Connectors). Ma démo suit la variante connecteur. Si vous partez sur le MCP, désactivez Allow all et laissez éteints les outils de suppression et de partage : c’est le principe du moindre privilège.
Étape 9 : Ajouter l’outil Get item
Sous Tools, sélectionnez +, ouvrez l’onglet Connectors, saisissez le texte ci-dessous dans Search, puis sélectionnez Get item et Add :
sharepoint get item
La fenêtre de connexion s’affiche et l’outil Get item est ajouté à l’agent.
Étape 10 : Ajouter l’outil Create item
Sous Tools, sélectionnez à nouveau +, recherchez le texte ci-dessous, puis sélectionnez Create item :
SharePoint Create
Étape 11 : Ajouter l’outil Update item
Même chose avec le texte ci-dessous, puis sur la fiche Update item, sélectionnez Add :
SharePoint update
La boîte de dialogue se ferme et Update item apparaît sous Tools.
Étape 12 : Ajouter l’outil Get lists
Dernier outil : recherchez le texte ci-dessous, sélectionnez Get lists, puis enregistrez l’agent avec Save :
SharePoint Get
Get lists est ajouté : l’agent dispose maintenant de ses quatre outils SharePoint.
6. Premier test d’écriture et skill créée de zéro
Premier vrai test des outils : on demande à l’agent de contrôler le fournisseur et le lot, puis d’écrire dans deux listes, sans encore toucher au contrat.
Étape 13 : Démarrer une nouvelle conversation
Sélectionnez Preview, puis New chat :
Une nouvelle conversation s’ouvre avec le message d’accueil de l’agent.
Étape 14 : Envoyer la demande de prise en charge
Dans Message Supplier Assurance Agent, collez le message suivant, puis appuyez sur Entrée :
Astor Ridge Biologics has asked us to review invoice ARB-260814.
Verify that the supplier is active and whether batch CDV-AX47 has an active quality hold. If the supplier is active and there is no active hold:
1. Update invoice ARB-260814 from Pending Review to Review Requested.
2. Look for an Invoice Review Requests item whose Title is Astor Ridge invoice review - ARB-260814. If it does not exist, create it. If it already exists, update it instead so there is only one request.
3. Set Invoice ID to ARB-260814, Request Notes to Review the expedited production premium, cold-chain freight, and validation documentation charges against the contract, approvals, policy, and quality records, and Status to New.
Read the invoice and request back. Report the supplier and quality checks, the invoice's new status, the request item ID, and whether you created or updated the request. Do not analyze the contract or decide which charges are supported yet.
Le message apparaît dans la conversation et l’agent se met au travail.
Si un message Permission Required s’affiche, sélectionnez Approve pour autoriser l’appel aux outils SharePoint. La réponse attendue : fournisseur actif, aucun blocage qualité actif, facture passée en Review Requested, et l’ID de l’élément de demande.
Étape 15 : Vérifier la demande dans SharePoint
Ouvrez la liste Invoice Review Requests du site Caldova Supplier Operations pour contrôler sa création :
La liste contient un seul élément Astor Ridge invoice review – ARB-260814.
Place aux skills. Une skill, c’est une procédure réutilisable que l’agent sait appeler au bon moment. La première, on l’écrit nous-mêmes : elle rassemble les faits, sans calculer ni décider.
Étape 16 : Créer une skill vierge
Revenez dans Build. Sous Skills, sélectionnez + puis Create from blank. Dans Name, saisissez invoice-fact-check, et dans Description, collez :
Use when a user asks to review a supplier invoice. Read the submitted invoice, retrieve current SharePoint records, and gather governing contract terms, approvals, policy, and active quality-hold information before a decision is made.
Le nom et la description de la skill sont renseignés.
Étape 17 : Ajouter les instructions de la skill
Dans Instructions, remplacez le texte du modèle par :
1. Read the attached invoice and capture its supplier, invoice ID, PO, contract, batch or lot, total, and every line.
2. Use the SharePoint MCP to retrieve the matching invoice, lines, supplier, and quality-event records.
3. Use SharePoint knowledge to find the governing contract, policy, and written approvals.
4. Compare the submitted file with current records. Never resolve a conflict by guessing.
5. For each line, identify the invoiced amount, contract-permitted amount, and supporting source.
6. Return valid JSON with supplierName, supplierId, invoiceId, purchaseOrder, contractId, invoiceTotal, lineItems, missingEvidence, conflictingEvidence, activeQualityHold, policyUnclear, evidenceSummary, and evidenceCitations.
7. Do not calculate totals, recommend an outcome, or write to SharePoint.
Le champ Instructions contient la check-list en 7 points.
Le point 6 compte : ce JSON structuré est exactement ce que la seconde skill attend en entrée. Et le point 7 garde une séparation nette entre collecte des faits et décision.
Étape 18 : Enregistrer la skill
Sélectionnez Create :
La skill invoice-fact-check est enregistrée et la boîte de dialogue se ferme.
✅ Point de contrôle : la skill invoice-fact-check existe et ses instructions contiennent bien les 7 points.
7. Importer la skill Python et lancer la revue
La seconde skill arrive toute faite dans un ZIP. Son intérêt : elle embarque un script Python qui calcule les montants en arithmétique décimale et génère le PDF dans le sandbox. Pas de calcul « à la louche » par le modèle.
Étape 19 : Ouvrir le sélecteur de fichiers
Sous Skills, sélectionnez +, restez sur l’import et cliquez sur Drag and drop or click to upload. Dans le sélecteur, naviguez jusqu’au dossier package\LearnerVM\skills du dépôt décompressé :
Le sélecteur affiche le contenu du dossier skills.
Étape 20 : Importer invoice-review-decision.zip
Sélectionnez invoice-review-decision.zip, puis Open :
Copilot Studio revient sur la fenêtre Add skill et affiche Saving skill.
Le piège classique : une fois importée, la skill n’apparaît pas sous le nom du ZIP mais sous supplier-policy-triage, le nom déclaré dans son fichier SKILL.md. Ouvrez-la : vous devez y trouver deux fichiers, SKILL.md et calculate_supplier_review.py. Si l’import échoue, vérifiez que ces deux fichiers sont bien à la racine du ZIP.
Étape 21 : Préparer la pièce jointe dans Preview
Sélectionnez Preview, ouvrez un New chat, puis cliquez sur le + de la zone de message pour joindre un fichier :
La boîte de dialogue Windows Open s’affiche.
Étape 22 : Joindre la facture Excel
Dans Open, ouvrez le dossier package\LearnerVM\case-inputs, sélectionnez Caldova_Astor_Ridge_Invoice.xlsx, puis Open :
La facture est jointe au message.
Étape 23 : Saisir la demande de revue
Dans Message Supplier Assurance Agent, saisissez la demande suivante, en laissant la pièce jointe en place :
Review this Astor Ridge invoice for Finance. Check the submitted charges against current SharePoint records, the governing contract, written approvals, policy, and any active quality hold. Tell me what is supported, what should be challenged, and whether human review is required. Cite the sources and create a review brief. Do not take financial action.
La demande est saisie, avec la pastille du fichier joint.
Étape 24 : Envoyer la demande
Cliquez sur Send :
L’agent commence à répondre et affiche son activité.
Approuvez les demandes de permission au fil de l’eau, et prenez le temps de regarder l’activité : lecture du fichier Excel, appel de la skill invoice-fact-check, lectures SharePoint, citations de la knowledge, appel de la seconde skill, puis exécution du Python. C’est là qu’on voit l’agent orchestrer, pas seulement dans la réponse finale.
Et là, magie : le verdict tombe, chiffres à l’appui. Voici ce que l’agent doit retrouver, ligne par ligne :
Ligne de facture
Facturé
Permis
Contesté
Commercial manufacturing batch
185 000 $
185 000 $
0 $
Expedited production premium
14 800 $
7 400 $
7 400 $
Cold-chain freight
12 200 $
12 200 $
0 $
Validation documentation package
5 700 $
0 $
5 700 $
Total
217 700 $
204 600 $
13 100 $
Écart de rapprochement : 0 $. Aucun blocage qualité actif (l’événement QE-2026-118 est ouvert, mais sans hold). Revue humaine requise, car le montant contesté dépasse le seuil de 10 000 $ fixé par la politique Caldova.
✅ Point de contrôle : la demande est partie avec Caldova_Astor_Ridge_Invoice.xlsx en pièce jointe et l’agent a appelé ses deux skills.
8. Le rapport PDF et la demande de journalisation
Étape 25 : Télécharger le PDF généré
Dans la réponse de l’agent, sélectionnez la pastille PDF Caldova_Supplier_Review… :
La boîte de dialogue d’enregistrement du rapport s’ouvre.
Étape 26 : Enregistrer le rapport
Conservez le nom Caldova_Supplier_Review_ARB-260814.pdf et cliquez sur Save :
Le téléchargement du PDF se termine.
Étape 27 : Ouvrir le PDF
Dans la notification de téléchargement, en haut à droite, cliquez sur Caldova_Supplier_Review_ARB-260814.pdf :
Le PDF s’ouvre dans la visionneuse.
Étape 28 : Contrôler le rapport
Vérifiez l’en-tête CALDOVA PHARMACEUTICALS | SUPPLIER ASSURANCE et la référence ARB-260814 :
Le rapport affiche la recommandation et la synthèse financière, produits par le script Python dans le sandbox.
Étape 29 : Demander la journalisation
De retour dans Preview, saisissez le message suivant :
Record this recommendation in the Invoice Review Log.
Le message est prêt dans la zone de saisie.
Étape 30 : Envoyer la demande de journalisation
Cliquez sur Send :
L’agent prend en charge la demande d’écriture dans le journal.
Attention : les instructions de l’agent lui imposent de demander une confirmation avant de créer l’élément de journal : validez-la. S’il ne trouve pas la liste Invoice Review Log, il peut vous demander son URL, donnez-la lui tout simplement.
✅ Point de contrôle : le PDF affiche l’en-tête CALDOVA PHARMACEUTICALS | SUPPLIER ASSURANCE et la référence ARB-260814.
9. Vérifier le journal Invoice Review Log
Étape 31 : Ouvrir le journal de revue
Ouvrez la liste Invoice Review Log du site Caldova Supplier Operations :
La liste affiche une entrée Astor Ridge invoice review pour la facture ARB-260814.
Étape 32 : Sélectionner la nouvelle entrée
Cliquez sur la ligne Astor Ridge invoice review – ARB-260814 pour la sélectionner :
La ligne est sélectionnée et la barre d’outils indique 1 selected.
Contrôlez les montants (204 600 $ soutenus, 13 100 $ contestés) et la source Interactive Agent. La trace d’audit est en place, sans la moindre action financière.
10. Activer la mémoire de l’agent
Petite couche de personnalisation. J’en parlais déjà dans mon article Boostez la mémoire de Copilot : ici, la règle est stricte, la mémoire ne sert qu’aux préférences, jamais aux faits du dossier.
Étape 33 : Ouvrir l’onglet Build
En haut de l’agent, sélectionnez Build :
La page Build affiche les sections Instructions, Skills, Tools et Memory.
Étape 34 : Activer la mémoire
Dans le panneau de droite, basculez Memory sur On, puis enregistrez avec Save :
La bascule Memory est activée.
Étape 35 : Revenir dans Preview
Sélectionnez Preview :
L’interface de test de l’agent s’affiche.
Étape 36 : Démarrer une nouvelle conversation
Cliquez sur New chat :
Une nouvelle conversation vide s’ouvre.
Étape 37 : Saisir une préférence
Dans Message Supplier Assurance Agent, saisissez :
Remember that I am based in London. Use UK date and time conventions, and put anything that needs my attention first under a heading called My actions.
La préférence est prête à être envoyée.
Étape 38 : Envoyer la préférence
Cliquez sur Send. L’agent confirme l’enregistrement, et vous pouvez contrôler ce qu’il a retenu via Manage memories :
Le message est envoyé et l’agent enregistre la préférence.
Étape 39 : Ouvrir une autre conversation
Cliquez à nouveau sur New chat pour repartir de zéro :
Une nouvelle conversation vide s’ouvre, prête pour le test.
Étape 40 : Saisir la demande de rappel
Saisissez la demande suivante :
Give me the Astor Ridge ARB-260814 review result. Include the invoice date.
La demande est prête à être envoyée.
Étape 41 : Envoyer la demande
Cliquez sur Send :
Le message est envoyé dans une conversation qui ne connaît rien de la précédente.
Concrètement, ça donne quoi ? La réponse doit commencer par une rubrique My actions et afficher la date de facture au format britannique (14 August 2026, et non 08/14/2026). Les montants, eux, sont relus dans SharePoint : rien ne vient de la mémoire.
✅ Point de contrôle : Memory est activée et la préférence s’applique dans une nouvelle conversation.
11. Évaluer l’agent avec un jeu de tests
Tester à la main, c’est bien. Rejouer automatiquement des conversations de référence à chaque modification, c’est mieux. Le dépôt fournit un CSV au format d’import de Copilot Studio avec deux conversations : la revue Astor Ridge en plusieurs tours, et le cas limite d’un montant contesté d’exactement 10 000 $.
Étape 42 : Ouvrir l’onglet Evaluate
Dans la barre d’onglets supérieure, sélectionnez Evaluate :
La page d’évaluation se charge.
Étape 43 : Créer une évaluation
Cliquez sur Create your first evaluation :
La page Data source s’affiche avec une zone d’import CSV.
Étape 44 : Parcourir les fichiers
Dans Data source, cliquez sur browse dans la zone Drag a CSV file or browse :
Le sélecteur de fichiers s’ouvre.
Étape 45 : Sélectionner le CSV
Choisissez Supplier-Assurance-Baseline.csv (dossier package\LearnerVM\evaluation), puis Open :
Le CSV se charge et les conversations de test sont importées.
Étape 46 : Nommer l’évaluation
Dans Configure test set, saisissez Supplier Assurance baseline dans Enter the evaluation name :
Le nom est renseigné et le bouton Evaluate est disponible.
Étape 47 : Lancer l’évaluation
Cliquez sur Evaluate :
La fenêtre Manage profile and connections vous demande un compte.
Étape 48 : Ajouter un compte
Dans la liste déroulante, sélectionnez Add an account et connectez-vous :
Une fenêtre de connexion distincte s’ouvre.
Étape 49 : Vérifier le compte utilisé
Dans Manage profile and connections, vérifiez que votre compte est sélectionné dans User, sans toucher au reste.
Le bouton Run devient actif.
Étape 50 : Exécuter l’évaluation
Cliquez sur Run :
Une bannière confirme le lancement : comptez 5 à 10 minutes.
Étape 51 : Ouvrir l’évaluation
Sélectionnez Supplier Assurance baseline :
La page de détails de l’évaluation s’ouvre.
Étape 52 : Ouvrir l’exécution
Dans la liste des résultats, sélectionnez la ligne d’exécution horodatée de Supplier Assurance baseline :
Les métriques de synthèse et la liste des conversations testées s’affichent.
Étape 53 : Ouvrir une conversation
Sélectionnez la conversation Review Astor Ridge invoice ARB-260814 :
Le détail de la conversation s’ouvre, avec la réponse de l’agent et le panneau Details.
Tout doit ressortir en passed. Déroulez la conversation pour voir la knowledge utilisée et les outils appelés. Les réponses de référence du CSV servent de repère aux relecteurs : la méthode General quality juge le sens, pas la formulation exacte.
💡 Le cas à 10 000 $ pile est malin : la politique déclenche la revue humaine au-delà de 10 000 $, pas à 10 000 $. Exactement le genre de frontière qu’un modèle peut rater, et qu’une évaluation attrape.
12. Publier l’agent et créer le workflow
Dernière brique : rendre l’agent autonome. Le workflow ne fait qu’orchestrer, l’agent garde toute l’investigation. Il faut d’abord publier l’agent, sinon il n’apparaîtra pas dans le workflow.
Étape 54 : Ouvrir la publication
En haut à droite, cliquez sur Publish :
La boîte de dialogue Publish s’ouvre avec le bouton Publish agent.
Étape 55 : Publier l’agent
Cliquez sur Publish agent, puis sur Done une fois la publication terminée :
La publication démarre, le bouton en haut à droite indique Publishing.
Étape 56 : Ouvrir les workflows
Dans la navigation de gauche, sélectionnez Workflows :
La page Workflows s’ouvre.
Étape 57 : Créer un workflow
Cliquez sur Create your first workflow :
Un workflow vierge s’ouvre sur le canevas, avec un nœud de départ Start.
Étape 58 : Renommer le workflow
Cliquez sur Untitled workflow, en haut à gauche, et remplacez-le par :
Process Supplier Invoice Review Request
Le workflow porte son nouveau nom et reste au statut Draft.
Étape 59 : Passer le déclencheur en Connector
Sélectionnez le nœud Start, puis dans Trigger type, choisissez Connector :
Le sélecteur de déclencheurs de connecteurs s’ouvre.
Étape 60 : Choisir le déclencheur SharePoint
Recherchez SharePoint et sélectionnez When an item is created :
Le nœud When an item is created apparaît, avec les champs Site address et List name.
Le piège classique : prenez bien When an item is created et non When an item is created or modified. Le workflow met à jour ce même élément à la fin : avec le second déclencheur, il se relancerait lui-même en boucle.
Le champ Site address pointe vers Caldova Supplier Operations.
Étape 62 : Sélectionner la liste
Dans List name, sélectionnez Invoice Review Requests :
Le déclencheur est configuré et n’indique plus d’erreur.
✅ Point de contrôle : le déclencheur When an item is created surveille la liste Invoice Review Requests du site Caldova Supplier Operations.
13. Brancher l’agent et la mise à jour SharePoint
Étape 63 : Ajouter une étape
Cliquez sur le + à droite du nœud When an item is created :
La fenêtre Add liste les types d’actions disponibles.
Étape 64 : Ajouter une action Agent
Sélectionnez Agent :
Un nœud Agent est ajouté après le déclencheur et son panneau de configuration s’ouvre.
Étape 65 : Choisir l’agent
Dans la liste déroulante Agent, sélectionnez Supplier Assurance Agent :
L’agent est sélectionné et un champ obligatoire Message apparaît.
Étape 66 : Saisir le message
Dans Message, collez le texte suivant. Les deux valeurs entre crochets seront remplacées juste après par du contenu dynamique :
Review supplier invoice [Invoice ID].
Request notes: [Request Notes]
Use the SharePoint MCP for current invoice, line, supplier, and quality records. Use Caldova SharePoint knowledge for the governing contract, approvals, and policy. Run both configured skills.
Return supported and disputed amounts, reconciliation difference, human-review status and reasons, evidence citations, and a statement that no financial or supplier action was taken.
Le champ Message contient l’ensemble des consignes pour l’agent.
Étape 67 : Insérer Invoice ID
Supprimez [Invoice ID], cliquez sur l’icône éclair à cet emplacement, puis choisissez Invoice ID dans les sorties du déclencheur :
Invoice ID apparaît sous forme de jeton dynamique après Review supplier invoice.
Étape 68 : Insérer Request Notes
Même manipulation pour [Request Notes] : supprimez-le, cliquez sur l’icône éclair et choisissez Request Notes :
Le jeton Request Notes est en place sur la ligne Request notes.
Étape 69 : Ajouter une étape après l’agent
Cliquez sur le + à droite du nœud Agent :
Le sélecteur Add s’ouvre pour choisir l’action suivante.
Étape 70 : Choisir Update item
Recherchez SharePoint update item et sélectionnez Update item :
L’étape Update item est ajoutée et son panneau de configuration s’ouvre.
Étape 71 : Sélectionner le site
Dans Site address, sélectionnez le même site que pour le déclencheur :
L’adresse du site est renseignée et les listes se chargent.
Étape 72 : Sélectionner la liste
Dans List name, sélectionnez Invoice Review Requests :
Le schéma de la liste se charge.
Étape 73 : Mapper les champs
Renseignez les champs à l’aide de l’icône éclair, en suivant le tableau ci-dessous :
Chaque champ contient le bon jeton dynamique et Status affiche Complete.
Champ
Valeur
Id
ID (déclencheur)
Title
Title (déclencheur)
Invoice ID
Invoice ID (déclencheur)
Request Notes
Request Notes (déclencheur)
Status
Complete
Agent Response
Result (sortie de l’étape Agent)
Error Detail
Laisser vide
Attention : recopiez Title, Invoice ID et Request Notes même s’ils ne changent pas, sinon la mise à jour risque de vider ces champs obligatoires. Et pour Agent Response, prenez bien la sortie Result de l’étape Agent, pas un champ du déclencheur.
Étape 74 : Publier le workflow
Cliquez sur Publish en haut à droite :
Le workflow est publié.
✅ Point de contrôle : le workflow est publié avec trois nœuds : déclencheur, agent, puis Update item avec Status sur Complete.
14. Le test de bout en bout
Le moment de vérité. On crée une nouvelle demande pour un second fournisseur, Northwind Therapeutics, et on laisse tourner sans ouvrir la moindre conversation.
Étape 75 : Créer une nouvelle demande
Dans la liste Invoice Review Requests, cliquez sur New. Saisissez Review NWT-260821 dans Title, NWT-260821 dans Invoice ID, choisissez New dans Status, et collez ceci dans Request Notes :
Review the submitted charges against current records, contract, approvals, policy, and quality holds.
Le formulaire est complet, avec le statut New.
Étape 76 : Enregistrer la demande
Cliquez sur Save :
La liste affiche la nouvelle ligne Review NWT-260821 au statut New.
Étape 77 : Suivre l’exécution
Revenez sur le workflow, ouvrez l’onglet Activity, actualisez jusqu’à voir une exécution Running, puis ouvrez-la :
Le détail de l’exécution s’affiche, en cours de traitement.
Étape 78 : Lire le résultat
Une fois l’exécution terminée, revenez dans Invoice Review Requests, ouvrez Review NWT-260821 (désormais en Complete) pour lire l’Agent Response générée par le Workflow :
La demande est traitée et la liste réapparaît.
Et là, magie : sans aucune conversation, l’agent a fait tout le travail. Voici ce que doit contenir l’Agent Response :
Ligne de facture
Facturé
Permis
Contesté
Packaging and labeling production run
96 000 $
96 000 $
0 $
Serialized label setup
12 000 $
8 000 $
4 000 $
Standard freight
4 800 $
4 800 $
0 $
Rush changeover fee
9 500 $
0 $
9 500 $
Total
122 300 $
108 800 $
13 500 $
Écart de rapprochement : 0 $, pas de blocage qualité, et revue humaine requise puisque 13 500 $ dépasse le seuil de 10 000 $. La mise en place des étiquettes sérialisées est plafonnée à 8 000 $, et le changement de série en urgence n’est couvert ni par le contrat ni par une approbation écrite.
15. Ce qui s’est passé, couche par couche
Prenons un peu de recul sur ce que chaque couche a réellement fait :
Couche
Responsabilité
Liste de demandes et workflow
Démarrer la revue et stocker la réponse lisible
Outils SharePoint (MCP ou connecteur)
Lire les enregistrements à jour et écrire le journal de façon contrôlée
Knowledge SharePoint
Fournir les faits issus du contrat, des approbations, de la politique et de la qualité
Skills et sandbox
Organiser les faits, calculer le résultat et produire le PDF
Relecteur humain
Prendre chaque décision financière
Aucun paiement, aucun rejet, aucun changement côté fournisseur ou blocage qualité : l’agent a tout préparé, l’humain garde la main.
16. Conclusion
Voilà, en 11 parties et 78 étapes, on est passé d’un agent vierge à une chaîne complète : un seul agent qui lit, vérifie, calcule, documente, se souvient, s’évalue et tourne tout seul depuis SharePoint.
Concrètement, ça donne quoi ? Une démonstration très propre de la séparation des rôles. La knowledge dit ce qui est permis, les outils disent ce qui est vrai maintenant, les skills rendent le calcul répétable, le workflow orchestre, et l’humain décide.
Les 6 pièges à retenir :
Retirer Search all websites pour que l’agent reste sur les documents gouvernés.
Choisir entre SharePoint MCP et connecteur, et dans les deux cas ne laisser aucun outil de suppression ou de partage.
Chercher la skill importée sous le nom supplier-policy-triage, pas sous le nom du ZIP.
Publier l’agent avant de créer le workflow, sinon il reste introuvable.
Utiliser When an item is created, jamais created or modified, pour éviter la boucle.
Recopier les champs du déclencheur dans Update item et mapper Agent Response sur la sortie de l’agent.
Et pour aller plus loin, le guide formateur propose quelques défis bonus : retrouver le fournisseur qui fait l’objet d’un blocage qualité actif, ou repérer un conflit entre le tableur optionnel et le contrat sans laisser l’agent deviner. À tester d’urgence en lab !
🤖
Contenu assisté par IACet article a été rédigé avec l’assistance d’une intelligence artificielle et relu par l’auteur.
Vous avez une page web que vous ouvrez régulièrement pour vérifier si quelque chose a changé ? Une inscription qui doit ouvrir, un mot-clé qui doit apparaître, ou une annonce que vous attendez ? À force, on finit par actualiser la page plus souvent que nécessaire.
Avec webpagecheck, l’idée est simple : laisser un outil surveiller ces pages et vous prévenir par email lorsqu’une condition est détectée. Vous pouvez suivre un changement de texte, la présence d’un mot-clé ou décrire une condition en langage naturel pour une évaluation par IA. Le tableau de bord permet aussi de lancer une analyse ponctuelle et de consulter la dernière capture de la page.
Pourquoi un outil comme celui-ci ?
Des services de surveillance de pages existent déjà. Mais ils tournent chez un tiers, avec leurs limites d’abonnement, et voient passer vos URL comme vos adresses email. webpagecheck s’installe dans votre propre subscription Azure : vous gardez la main sur les données, les identités et le coût.
Quelques exemples d’usage :
L’ouverture des inscriptions à un événement, une certification ou une formation.
Le retour en stock d’un produit ou un changement de prix.
La publication d’une offre d’emploi ou d’un appel à candidatures.
La mise à jour de conditions générales, d’une documentation ou d’une page de statut.
Une annonce attendue sur un blog ou une page produit.
Ce que fait l’application
Le tableau de bord regroupe les pages surveillées, leur mode, leur état, la dernière capture et la dernière alerte :
Trois modes de détection : un changement de contenu, l’apparition ou la disparition d’un mot-clé, ou une condition en langage naturel évaluée par Azure OpenAI avec un score et un seuil réglable.
La lecture de la page rendue : les modes mot-clé et IA lisent la page après exécution du JavaScript dans Chromium, comme le ferait votre navigateur.
Une capture à chaque contrôle : visible dans le tableau de bord et jointe à l’email d’alerte.
Des alertes email via Azure Communication Services, marquées URGENT et en priorité haute, avec des destinataires supplémentaires possibles par page.
Scan et Check now : analyser une page sans rien envoyer, ou forcer un vrai contrôle. Chaque surveillance peut aussi être mise en pause, modifiée ou supprimée.
Un mode test : les alertes sont simulées et consultables dans Alerts, sans envoyer d’email.
Une sécurité de base : identité managée pour ACR et Azure OpenAI (aucune clé à gérer), mot de passe sur l’interface, URL publiques uniquement et données conservées dans Azure Files.
Dans cet article, on va déployer l’application sur Azure Container Apps à partir du script PowerShell du projet. Puis on configurera les notifications et une première surveillance, jusqu’au test de fonctionnement. L’IA reste optionnelle : les modes changement et mot-clé n’en ont pas besoin.
Pour vous guider plus facilement dans cet article, voici des liens rapides :
Concrètement, ça donne quoi ? Plutôt que de tout faire reposer sur l’IA, l’outil propose trois modes. Le bon choix dépend de ce que vous cherchez à détecter.
Mode
Ce que l’outil vérifie
Comportement de l’alerte
Change
Une empreinte du texte extrait de la réponse HTML.
Le premier passage sert de référence. Les changements suivants déclenchent une alerte.
Keyword
La présence d’un mot-clé dans le texte de la page rendue par Chromium, sans distinction de casse.
Une alerte à l’apparition, puis à la disparition. Un mot-clé déjà présent au premier passage peut donc déclencher une alerte.
AI
Une condition décrite en langage naturel, évaluée par Azure OpenAI sur le texte de la page rendue.
Une alerte lorsque le score atteint le seuil. Une nouvelle alerte nécessite ensuite un passage sous le seuil, puis un nouveau franchissement.
Exemple : pour détecter l’ouverture d’inscriptions, un mot-clé très précis peut suffire. Si la formulation varie, le mode IA permet d’exprimer une condition comme « Les inscriptions à cet événement sont ouvertes ». Son score reste une estimation du modèle, pas une garantie que l’événement a réellement eu lieu.
2. Les prérequis et les services Azure utilisés
Ce tutoriel utilise un poste Windows avec PowerShell et Azure CLI. Le script de déploiement protège son fichier temporaire de paramètres sensibles avec des ACL Windows : ne le lancez pas tel quel depuis un Cloud Shell Linux ou WSL.
Une subscription Azure autorisant les services nécessaires et leur facturation.
Les droits de créer un groupe de ressources, de déployer l’infrastructure et d’attribuer les rôles à l’identité managée.
Azure CLI installé et un terminal PowerShell autorisant l’exécution du script selon votre politique d’entreprise.
Si vous activez l’IA, un accès au modèle et un quota suffisants pour le déploiement Azure OpenAI choisi.
Attention : le rôle Contributor seul ne permet pas d’attribuer des rôles Azure. Faites valider les autorisations nécessaires par votre administrateur, notamment Microsoft.Authorization/roleAssignments/write. Il n’est pas nécessaire de donner des droits permanents excessifs au compte qui réalise le déploiement.
L’application repose sur Python et Flask, avec Waitress pour servir l’interface. Playwright et Chromium réalisent les captures. Le script Bicep prépare les composants suivants :
Composant
Rôle dans le projet
Azure Container Apps et son environnement
Exécuter le conteneur et exposer l’interface en HTTPS.
Azure Container Registry
Construire à distance et conserver l’image Docker.
Identité managée utilisateur
Récupérer l’image avec AcrPull et, si activé, appeler Azure OpenAI avec le rôle Cognitive Services OpenAI User.
Compte de stockage et partage Azure Files
Conserver la configuration et les captures sous /data, au-delà du cycle de vie du conteneur.
Log Analytics
Recevoir les journaux de l’application.
Azure OpenAI, optionnel
Évaluer les conditions en langage naturel.
Email Communication Service, domaine Azure et Communication Services, optionnels
Fournir le domaine expéditeur et envoyer les notifications.
Pas besoin de Docker ni de Python sur le poste pour ce parcours de déploiement : le build se fait dans ACR et l’installation Python se déroule dans l’image. Il faut en revanche récupérer tous les fichiers du projet nécessaires au build.
Attention : ce déploiement n’est pas une promesse de coût nul. Le modèle prévoit une réplique minimum, un registre ACR, du stockage, des journaux et, selon les options, des emails et des appels IA. Vérifiez les tarifs applicables à votre région et configurez un budget Azure avant de lancer le lab. Une estimation chiffrée est proposée en section 12.
3. Récupérer le projet et préparer le dossier
Ouvrez Visual Studio Code, puis récupérez la version du projet mise à disposition avec cet article :
https://github.com/jlou07/webpagecheck
Puis clonez le dans un dossier de travail. Dans les exemples, j’utilise C:\Lab\webpagecheck : adaptez ce chemin à votre poste :
À la racine, vous devez notamment retrouver deploy.ps1, Dockerfile, .dockerignore, requirements.txt, les modules Python, le dossier static et infra\main.bicep. Gardez les exemples sans secret : pas de fichier de configuration personnel, de captures privées ni d’identifiants de votre environnement dans le paquet partagé.
Set-Location 'C:\Lab\webpagecheck'
Get-ChildItem
4. Préparer Azure CLI et la bonne subscription
Installez Azure CLI avec la procédure Microsoft adaptée à votre poste, puis ouvrez un nouveau terminal. Une fois l’outil disponible, connectez-vous et sélectionnez explicitement la subscription cible.
az version
az login --use-device-code
az account list --output table
$subscriptionId = Read-Host 'ID de la subscription cible'
az account set --subscription $subscriptionId
az account show --query "{Subscription:name,Id:id}" --output table
az bicep version
az extension add --name containerapp --upgrade
Si Bicep n’est pas encore disponible, la CLI sait l’installer lorsqu’une commande en a besoin. La documentation Microsoft explique également son installation et sa mise à jour. Si votre poste ou votre subscription applique des restrictions, réglez-les avant le lancement plutôt que de contourner les politiques de sécurité.
Le piège classique : être connecté au bon tenant, mais sur la mauvaise subscription. Vérifiez le résultat de az account show avant de continuer. Sur une capture destinée au blog, masquez l’identifiant de subscription et les informations de compte.
5. Lancer le déploiement PowerShell
Choisissez un groupe de ressources dédié à ce lab et un préfixe court. Le préfixe doit comporter de trois à huit caractères, en lettres minuscules et chiffres. Les valeurs ci-dessous sont des exemples, pas les identifiants d’une instance existante.
$resourceGroup = 'rg-webpagecheck-demo'
$namePrefix = 'wpcdemo'
$appName = "${namePrefix}-web"
$deployParameters = @{
ResourceGroup = $resourceGroup
NamePrefix = $namePrefix
Location = 'francecentral'
OpenAiLocation = 'swedencentral'
ChromiumSandbox = $false
}
# Redéploiement uniquement : réutiliser le mot de passe existant
if (az containerapp show -g $resourceGroup -n $appName --query name -o tsv 2>$null) {
$deployParameters.UiPassword = az containerapp secret list -g $resourceGroup -n $appName --show-values `
--query "[?name=='ui-password'].value | [0]" -o tsv
}
.\deploy.ps1 @deployParameters
Au premier déploiement, l’application n’existe pas encore : le script génère alors un mot de passe initial. Lors d’un redéploiement, le bloc if réutilise le mot de passe existant. Le paramètre ChromiumSandbox = $false est nécessaire pour les captures sur Container Apps : il est expliqué en section 10.
Les ressources Azure commencent à apparaître :
Par défaut, l’email et Azure OpenAI sont activés. Le modèle configuré dans le Bicep du projet est gpt-4.1-mini, version 2025-04-14, en déploiement Global Standard. Vérifiez sa disponibilité, son cycle de vie et votre capacité à le déployer avant de lancer le script. Les régions d’exemple ne constituent pas une garantie de disponibilité pour votre subscription.
Pour commencer sans IA, ajoutez cette ligne avant l’appel du script :
$deployParameters.DeployOpenAi = $false
Cette option conserve les modes changement et mot-clé. L’option DeployEmail = $false existe également, mais elle retire l’envoi d’emails attendu dans ce tutoriel. Choisissez vos options avant l’exécution, ne lancez pas chaque variante à la suite.
Le script déroule quatre opérations :
Créer le groupe de ressources.
Déployer l’infrastructure avec Bicep, sans l’application dans cette première passe.
Construire l’image dans Azure Container Registry.
Déployer la Container App avec l’image qui vient d’être construite.
À la fin, le script affiche l’URL de l’interface, l’adresse expéditrice si l’email est activé et l’endpoint OpenAI si l’IA est activée :
Il n’affiche pas automatiquement le mot de passe initial. Vous pouvez le retrouver ici côté portail Azure :
L’URL est aussi disponible juste là:
Attention : le script est un parcours complet d’infrastructure et de build, pas une simple commande de mise à jour de l’application. Sans paramètre UiPassword, chaque exécution génère un nouveau mot de passe initial et remplace ce secret. Ne le relancez pas au hasard pour corriger un réglage. Un identifiant déjà enregistré dans l’interface reste, lui, prioritaire sur ce mot de passe initial.
6. Ouvrir l’application et configurer l’accès
Ouvrez la page de l’application, puis saisissez les identifiants :
Vous voilà dans l’application, rien de plus !
7. Configurer les notifications email
Dans le panneau Configuration, renseignez l’adresse expéditrice indiquée à la fin du déploiement et une adresse de destination que vous contrôlez. Pour le premier test, un seul destinataire suffit :
Renseignez Sender address avec l’expéditeur fourni par le domaine Azure Communication Services. Une adresse arbitraire de votre messagerie ne convient pas.
Renseignez Recipient addresses. Plusieurs adresses peuvent être séparées par des virgules.
Enregistrez les paramètres.
Vérifiez que l’envoi est actif et utilisez Send test notification pour recevoir un véritable email.
En mode test, les alertes sont conservées comme simulées dans l’interface, mais aucun email ne part. Le test de notification est lui aussi simulé lorsque l’envoi est désactivé. Un statut simulé ne prouve donc pas que votre messagerie a reçu quelque chose.
Attention : pour un domaine géré par Azure, la documentation Microsoft indique une limite de 5 emails par minute et 10 par heure, à l’échelle de la subscription. Ces limites ne sont pas augmentables pour ce type de domaine. Les essais et les destinataires multiples consomment ce budget. Un domaine personnalisé vérifié permet de demander des limites supérieures.
Si vous utilisez votre propre domaine, c’est parfaitement possible. Voici un domaine déjà utilisé dans Microsoft 365 :
Et dont la zone DNS est gérée sous Azure :
Depuis le portail Azure, sur les ressources créées, commencez par le vérifier dans le service Email :
Créez si besoin un MailFrom :
Puis liez-le à la ressource Communication Services :
Reconfigurez puis refaites un test d’envoi :
Contrôlez la bonne réception du test :
L’option CustomEmailDomain du script doit être conservée lors de ses prochaines exécutions : sinon, le déploiement revient au seul lien avec le domaine Azure.
8. Créer et tester une première surveillance
On commence avec un cas simple et sans IA. Ajoutez une page avec les valeurs suivantes :
Champ
Valeur d’exemple
Name
Test Example Domain
URL
https://example.com/
Mode
Keyword
Keyword
servicio
Interval
60 minutes
Extra email addresses
Laisser vide pour le premier test.
Enregistrez la page, puis attendez quelques secondes le résultat de l’analyse automatique :
Quelques secondes plus tard, le mail d’alerte arrive également :
Modifiez le test existant en remplaçant le mot par un autre qui n’existe pas, sauvegardez :
Quelques secondes plus tard, constatez le résultat de la seconde analyse automatique :
L’icône Scan affiche l’analyse et le contenu de l’email qui serait préparé. Le Scan ne modifie pas l’état de référence de la surveillance et n’envoie pas d’email :
L’icône Check now est différente : elle réalise une vraie vérification, met à jour l’état et peut déclencher une alerte si la condition le justifie :
Le piège classique : réactiver les emails après une détection simulée ne rejoue pas cette alerte. Le moteur suit des transitions. Pour vérifier une alerte réelle, utilisez ensuite un changement contrôlé sur une page publique que vous maîtrisez, ou une surveillance de test distincte. N’attendez pas qu’un Scan expédie un message : ce n’est pas son rôle.
Le moment de vérité : une fois l’analyse validée, réactivez l’envoi et provoquez une transition contrôlée. Vérifiez la réception de l’email, puis son statut dans Alerts. Une fois ce parcours validé, choisissez un intervalle raisonnable pour vos vraies surveillances.
9. Aller plus loin avec le mode IA
Si Azure OpenAI a été déployé, le badge de l’interface indique que l’IA est active. Vous pouvez créer une surveillance en mode AI, décrire votre condition et fixer le seuil de déclenchement. La valeur par défaut est 70 %.
Sur une page d’inscription publique, une condition utile serait par exemple : « Les inscriptions sont ouvertes et un lien permet de s’inscrire maintenant, pas seulement de consulter la date d’ouverture. » Soyez précis sur ce qui distingue le résultat attendu d’une simple annonce.
Le modèle reçoit la condition et le texte extrait de la page, limité aux 12 000 premiers caractères. Il retourne un score et une explication. L’application utilise son identité managée pour appeler Azure OpenAI dans ce déploiement : vous n’avez pas de clé OpenAI à coller dans le navigateur.
Attention : le score n’est pas une probabilité statistiquement calibrée. Une page peut être ambiguë ou contenir des instructions trompeuses pour le modèle. Vérifiez la page avant une décision importante et gardez à l’esprit que même un Scan en mode IA consomme des appels au service.
Changez le test pour vérifier le comportement :
L’IA arrive bien à faire la distinction avec ce changement de test :
Et l’email d’alerte arrive bien :
10. Comprendre les captures et le choix de sandbox
Chaque véritable contrôle essaie de prendre une capture, même sans alerte à envoyer. La colonne Last capture donne accès à cette image. Seule la dernière capture de contrôle est conservée par page, dans le stockage persistant. Le Scan dispose de sa propre capture et ne remplace pas celle du dernier contrôle :
Si une capture échoue, l’ancienne image est retirée plutôt que présentée comme récente. La collecte du texte et les alertes peuvent continuer sans image. Consultez les journaux pour distinguer un échec de navigation, un blocage du site et un problème de lancement de Chromium.
La sandbox Chromium est activée par défaut dans le code et dans le Bicep. Sur Azure Container Apps, elle ne peut pas démarrer : le conteneur n’a pas accès aux namespaces utilisateur et Chromium s’arrête avec l’erreur No usable sandbox!. C’est pourquoi le déploiement de la section 5 passe ChromiumSandbox = $false. Il n’existe aucun basculement automatique vers un navigateur sans sandbox.
Attention : désactiver la sandbox réduit l’isolation du navigateur. Le navigateur partage alors toujours le conteneur de l’application, ses données et son accès aux secrets. Pour une isolation plus forte, préférez un service de capture séparé. L’anti-SSRF ne remplace pas une sandbox.
Si vous avez déployé sans ce paramètre et que les journaux affichent cette erreur, la commande suivante change uniquement cette variable d’environnement et crée une nouvelle révision, sans relancer tout le déploiement :
Ce choix ne désactive ni le proxy public uniquement, ni les vérifications TLS, ni l’utilisateur non-root du conteneur. Si vous rejouez plus tard le déploiement complet, l’option PowerShell correspondante est -ChromiumSandbox:$false. Sans cette option, le modèle Bicep réactive la sandbox. Ne réduisez pas l’isolation simplement pour faire disparaître un message d’erreur non diagnostiqué.
11. Les pièges à connaître avant de laisser tourner
Une capture visible n’est pas la preuve que le texte surveillé est complet
Les modes mot-clé et IA lisent le texte de la page rendue par Chromium, après exécution du JavaScript : un texte ajouté dynamiquement, comme les traductions de la page example.com, est donc bien détecté. Si Chromium échoue, l’application se rabat sur le HTML brut de la collecte HTTP, qui peut ne pas contenir ce texte. Le mode changement compare toujours le HTML brut, pour éviter les fausses alertes dues aux éléments dynamiques. Les pages avec authentification, CAPTCHA ou protection anti-bot peuvent également ne pas convenir. Testez votre cible avec le Scan avant de lui faire confiance.
Uniquement des destinations publiques
Les URL privées, locales et de métadonnées cloud sont refusées. Les redirections et les ressources chargées par Chromium passent par un proxy temporaire authentifié qui vérifie les adresses et se connecte à l’adresse IP contrôlée. Ce n’est donc pas un outil pour surveiller votre intranet. Respectez aussi les conditions d’utilisation des sites surveillés et évitez les fréquences agressives.
Une seule réplique pour cette version
La persistance repose sur un fichier JSON et des images dans Azure Files. Le déploiement fixe une réplique minimum et maximum. Ne montez pas simplement le nombre de répliques pour « faire plus robuste » : cette version ne dispose pas d’un ordonnanceur distribué ni d’une coordination multi-instance.
Prévoir une vraie frontière de sécurité
L’interface utilise une authentification Basic sur HTTPS. Cela ne fournit pas, à lui seul, un SSO Entra ID, du MFA ou une gestion multi-utilisateur. Pour une exposition plus large qu’un usage personnel ou de lab, étudiez un contrôle d’accès en amont, des restrictions réseau adaptées et une protection contre les tentatives répétées de connexion.
Les dépendances Python sont verrouillées avec des hachages et l’image s’exécute avec un utilisateur non-root. Des tests couvrent notamment les URL privées, les redirections, le DNS rebinding, la validation TLS et le traitement du mot de passe au déploiement. Ces protections ne constituent pas une certification de sécurité : maintenez aussi l’image de base, les paquets système et Chromium à jour, et réalisez un audit de vulnérabilités avant une exposition sensible.
12. Combien ça coûte ?
Voici une estimation pour un mois complet avec les paramètres par défaut du script : une page ou quelques pages contrôlées toutes les heures, Container Apps en France Central et Azure OpenAI en Sweden Central. Les prix sont les tarifs publics en dollars, relevés en octobre 2026, hors remise et hors taxes.
Composant
Base de facturation
Estimation mensuelle
Container Apps (0,5 vCPU, 1 Gio, une réplique permanente)
vCPU actif 0,000024 $/s, inactif 0,000003 $/s. Mémoire 0,000003 $/Gio-s. Offre gratuite mensuelle de 180 000 vCPU-s et 360 000 Gio-s par subscription.
≈ 10 $ si la réplique est surtout inactive, jusqu’à ≈ 34 $ si elle est active en permanence.
Container Registry Basic
0,1666 $ par jour.
≈ 5 $
Azure Files (Standard LRS, quota 1 Gio)
0,075 $ par Go et par mois, plus les transactions.
< 0,50 $
Log Analytics
5 Go gratuits par mois, puis 2,76 $ par Go.
≈ 0 $ pour ce lab
Azure OpenAI gpt-4.1-mini (Global Standard)
0,40 $ par million de tokens en entrée, 1,60 $ en sortie.
≈ 0,15 à 1,20 $ pour une page en mode IA contrôlée toutes les heures
Communication Services Email
0,00025 $ par email, plus 0,00012 $ par Mo.
Quelques centimes
Total
≈ 15 à 16 $ par mois (environ 14 €) pour un usage léger
La facture est dominée par deux postes fixes : la réplique Container Apps qui tourne en permanence et le registre ACR. Les appels IA, le stockage et les emails restent marginaux à cette échelle.
Ce que j’ai réellement payé
Sur mon lab, du 16 au 21 octobre 2026, soit environ 5 jours, Cost Management affiche environ 1,17 € pour le groupe de ressources : 0,72 € pour ACR, 0,30 € pour Container Apps, 0,11 € pour Azure OpenAI, 0,03 € pour le stockage, 0,01 € pour l’email et 0 € pour Log Analytics.
Attention : ne multipliez pas ce chiffre par six pour obtenir un mois. L’offre gratuite mensuelle de Container Apps a absorbé l’essentiel du calcul sur ces premiers jours. Elle est partagée entre toutes les Container Apps de la subscription : si vous en avez déjà d’autres, elle sera consommée plus vite.
Comment réduire la facture
Désactivez l’IA si les modes changement et mot-clé suffisent : $deployParameters.DeployOpenAi = $false.
Choisissez des intervalles raisonnables : chaque contrôle lance Chromium et, en mode IA, un appel au modèle.
Ne comptez pas sur le scale to zero : le planificateur tourne dans le processus de l’application, la réplique minimum est donc fixée à 1 dans cette version.
Créez un budget Azure avec une alerte sur le groupe de ressources avant de laisser tourner le lab.
À la fin du lab, supprimez tout le groupe de ressources : az group delete --name $resourceGroup --yes --no-wait. La ressource Azure OpenAI passe alors en suppression réversible : purgez-la si vous voulez réutiliser le même nom.
Voilà, du déploiement PowerShell à la première surveillance, vous avez de quoi automatiser une vérification que vous faisiez jusque-là à la main. Le plus intéressant n’est pas forcément d’ajouter de l’IA partout : un mot-clé bien choisi ou un simple suivi de changement peut déjà répondre au besoin.
Les pièges à retenir : choisir la bonne subscription, distinguer Scan et Check now, surveiller les quotas email et ne pas confondre une capture réussie avec une analyse complète de la page. Pour les captures, le compromis de sandbox doit rester un choix explicite, pas un détail caché.
Foncez tester en lab, avec une page publique et une boîte de réception que vous contrôlez. Validez le parcours complet avant de laisser tourner vos vraies surveillances.
🤖
Contenu assisté par IACet article a été rédigé avec l’assistance d’une intelligence artificielle et relu par l’auteur.
Vous utilisez la Lecture à voix haute de Word pour écouter vos lonnnnnnnnnng textes, mais vous aimeriez les emporter ailleurs, dans le train, en voiture ou en balade ? Le problème, c’est que Word lit le document pendant qu’il est ouvert, et c’est tout. Moi, je voulais un vrai fichier MP3, autonome, qu’on peut réécouter n’importe où. Et comme mes documents sont longs (très longs), j’ai automatisé la conversion avec un petit outil maison : WordToMp3.
Au programme : le fonctionnement de l’outil en quelques lignes, puis trois tests concrets, du dry run jusqu’à un document de 183 773 caractères transformé en plus de 3 heures d’audio.
1. Dictée, Lecture à voix haute, WordToMp3 : de quoi on parle ?
Premier réflexe à prendre : ne pas confondre les fonctionnalités. Word sait transformer la voix en texte, et le texte en voix. Mais aucune des deux ne correspond exactement à ce que je cherchais.
Fonctionnalité
Sens
À quoi ça sert
Dicter (Word)
Voix ➜ texte
Parler pour écrire un document.
Lecture à voix haute (Word)
Texte ➜ lecture audio
Écouter un document dans Word.
WordToMp3
Document ➜ texte extrait ➜ voix de synthèse ➜ MP3
Produire un fichier audio autonome.
Mon point de départ, c’est donc la Lecture à voix haute, pas la Dictée. L’idée n’est pas d’enregistrer ce que Word lit :
WordToMp3 extrait le texte du document et demande une narration toute neuve à Azure Speech. La voix ne sera donc pas forcément celle que vous entendez dans Word.
2. Pourquoi un script pour un long document ?
Un script n’est pas la seule solution possible : une appli d’export audio ou un enregistrement de l’écran pourraient aussi faire l’affaire. Mais dès que le document dépasse quelques pages, les questions pratiques arrivent vite :
comment lire un vieux .doc sans toucher au fichier d’origine ?
comment éviter une seule requête de synthèse énorme ?
que se passe-t-il si le réseau coupe à la moitié ?
comment garder les passages dans le bon ordre ?
comment obtenir un seul MP3 plutôt qu’une centaine de petits fichiers ?
comment garder ma clé Azure et mes textes privés hors de GitHub ?
Ce qui m’intéresse ici, c’est d’avoir un traitement reproductible et capable de reprendre là où il s’est arrêté. La répartition des rôles est simple : Python orchestre, Word sert uniquement à extraire le texte, Azure Speech génère la voix et FFmpeg assemble le MP3 final.
3. Comment ça marche ?
WordToMp3 est une application en ligne de commande pour Windows, qu’on lance depuis PowerShell. Pas d’interface graphique, pas de site web : un lanceur convert.ps1 qui appelle le script Python convert.py, et c’est tout :
Concrètement, ça donne quoi ? Le traitement se déroule en cinq temps :
Extraction : pour un .doc ou un .docx, le script ouvre une instance Word séparée et invisible, en lecture seule, macros désactivées. Il récupère le corps du texte (tableaux compris), puis les notes de bas de page et de fin. Il referme ensuite sans enregistrer. Les fichiers .txt en UTF-8 sont lus directement, sans Word.
Découpage : le texte est nettoyé puis coupé en segments de 2 000 caractères maximum, de préférence à la fin d’un paragraphe, sinon d’une phrase.
Synthèse : chaque segment est envoyé à Azure Speech (voix fr-FR-DeniseNeural par défaut), un par un, et revient sous forme de fichier WAV.
Cache : chaque WAV est vérifié puis conservé à côté du futur MP3. Si on relance, les segments valides sont réutilisés.
Assemblage : FFmpeg encode tous les WAV en une seule passe (MP3 128 kbit/s, 24 kHz, mono), puis relit le MP3 en entier pour vérifier qu’il est lisible avant de le publier.
Pourquoi passer par des WAV plutôt que de coller directement des MP3 ? Parce qu’un WAV non compressé se vérifie et s’ordonne facilement. Et un seul encodage final évite de mettre bout à bout des dizaines de MP3 compressés séparément.
4. Installation et lancement
Côté prérequis, rien d’exotique :
Élément
Détail
Système
Windows, avec Microsoft Word installé (pour les fichiers .doc et .docx)
Python
Un environnement virtuel local (testé chez moi avec Python 3.11.9)
Dépendances
Azure Speech SDK, pywin32 et imageio-ffmpeg (qui fournit FFmpeg, pas besoin de l’installer à part)
Si la variable AZURE_SPEECH_KEY n’est pas définie, le script demande la clé avec une saisie masquée :
Quelques options utiles : --voice pour changer de voix, --chunk-size pour la taille des segments (de 100 à 3 000 caractères), --attempts pour le nombre de tentatives par segment, et --overwrite pour remplacer un MP3 existant.
Attention : ne mettez jamais votre vraie clé dans une commande publiée, dans l’historique du terminal ou sur une capture. Masquez aussi le nom de votre ressource Azure dans vos captures. Le fichier .env.example du dépôt ne contient que des valeurs d’exemple, et le script ne charge pas les fichiers .env tout seul.
5. Trois tests concrets
Le moment de vérité. Trois tests, du plus prudent au plus costaud.
Test n°1 : le dry run, sans toucher à Azure
Avant de dépenser le moindre centime, on vérifie que l’extraction et le découpage se passent bien. Le mode --dry-run s’arrête juste avant la synthèse : pas de clé demandée, pas d’appel à Azure, pas de fichier audio.
Sur le texte de démonstration fourni dans le dépôt, résultat : 14820 caractères, un seul segment, aucun appel à Azure :
Attention, le dry run ne vérifie ni la clé, ni les quotas, ni la disponibilité de la voix, ni la qualité audio. Il valide juste la partie locale.
Test n°2 : un document Word de taille raisonnable
Premier vrai passage par Azure Speech avec un .docx : 14 820 caractères, découpés en 8 segments, voix fr-FR-DeniseNeural. Le script affiche l’avancement segment par segment, puis assemble et vérifie le MP3.
Extracting: C:\audio\book.docx
14,820 characters, 8 segment(s), voice fr-FR-DeniseNeural.
Document body and tables included; notes appended at the end. Images excluded.
Azure Speech key (hidden):
[1/8] Synthesizing (1638 characters)...
[2/8] Synthesizing (1957 characters)...
...
[8/8] Synthesizing (1670 characters)...
Assembling and verifying the MP3...
Done: C:\audio\book.mp3
Duration: 14.9 minutes
Et là, magie : un seul fichier MP3 de 14,9 minutes, prêt à être copié sur un téléphone :
Test n°3 : le gros morceau, un vieux .doc de plus de 180 000 caractères
C’est pour ce cas-là que j’ai écrit l’outil. Un ancien document au format .doc, de 183 773 caractères, découpé en 99 segments d’environ 1 850 caractères en moyenne.
Extracting: C:\audio\book2.doc
183,773 characters, 99 segment(s), voice fr-FR-DeniseNeural.
Document body and tables included; notes appended at the end. Images excluded.
Azure Speech key (hidden):
[1/99] Synthesizing (1812 characters)...
[2/99] Synthesizing (1122 characters)...
...
[99/99] Synthesizing (1348 characters)...
Assembling and verifying the MP3...
Done: C:\audio\book2.mp3
Duration: 191.2 minutes
Résultat : 191,2 minutes d’audio, soit un peu plus de 3 heures de narration, produites en environ 2 minutes de traitement chez moi. Au passage, ce test confirme que l’extraction via Word fonctionne aussi sur l’ancien format .doc :
Côté taille, à 128 kbit/s, on peut estimer environ 184 Mo pour ce MP3 (c’est un calcul, pas une mesure). Prévoyez aussi de la place pour le cache WAV, nettement plus gros : de l’ordre de 500 Mo pour la même durée :
6. Le cache et la reprise
Sur un document de 99 segments, une coupure réseau au segment 70 serait rageante. C’est là que le cache entre en jeu. Les WAV sont rangés dans un dossier .speech-cache à côté du MP3, dans un sous-dossier identifié par une empreinte du texte découpé, de la voix et de l’endpoint.
Si on relance la même commande, chaque WAV existant est vérifié : les segments valides sont réutilisés, les manquants ou abîmés sont régénérés. Un Ctrl+C en plein traitement affiche d’ailleurs la commande pour reprendre. En cas d’erreur passagère côté Azure (timeout, service indisponible, trop de requêtes), le script fait jusqu’à 4 tentatives par segment avant d’abandonner.
Le piège classique : changer le texte, la voix, l’endpoint ou l’emplacement du MP3 crée un nouveau cache, et donc une nouvelle synthèse complète. Pour reprendre, on relance exactement la même commande.
Attention : les segments déjà en cache ne repartent pas chez Azure, mais une relance n’est pas forcément gratuite pour autant. Tout segment manquant ou invalide sera de nouveau synthétisé et facturé. Et la reprise après coupure est couverte par des tests locaux simulés, pas encore par une vraie coupure en conditions réelles.
7. Pièges et vigilance
Le texte part chez Azure : chaque segment est envoyé à Azure Speech. Le fichier Word lui-même n’est pas envoyé, mais tout son contenu l’est. À éviter pour un document confidentiel sans avoir vérifié les règles de traitement des données.
Le cache n’est pas chiffré : les WAV et le MP3 contiennent l’intégralité du document, en audio. Supprimez le cache une fois le MP3 validé.
Tout n’est pas lu : pas d’OCR pour les images et pages scannées, pas d’extraction dédiée des en-têtes, pieds de page et zones de texte flottantes. Les notes sont lues à la fin, pas à leur emplacement d’origine.
Le coût : il dépend de la voix, de l’offre et de la région. Vérifiez la page de tarification Azure Speech avant de lancer un gros document. Le dry run compte les caractères, mais ne donne pas de devis.
L’écoute reste indispensable : FFmpeg vérifie que le MP3 est lisible techniquement, pas que les noms propres, les dates ou les tableaux sonnent bien.
8. Conclusion
Voilà, en cinq étapes (extraction, découpage, synthèse, cache, assemblage), un long document Word devient un seul MP3 qu’on emporte partout. Concrètement, ça donne quoi ? Chez moi, un .doc de 183 773 caractères transformé en 3 h 11 d’audio en environ 2 minutes, sans toucher au fichier d’origine.
Les trois pièges à retenir :
le contenu du document part chez Azure Speech, et le cache local n’est pas chiffré ;
une relance réutilise les segments valides, mais pas si vous changez le texte, la voix, l’endpoint ou l’emplacement du MP3 ;
un MP3 lisible n’est pas forcément une bonne narration, écoutez avant de partager.
Côté pistes d’évolution, rien n’est encore livré, mais plusieurs idées sont sur la table : un découpage par chapitre, des réglages de vitesse et de pauses, de l’OCR pour les pages scannées ou un mode pour réassembler le MP3 depuis le cache sans repasser par Azure.
Le code est sur GitHub. Foncez tester, en commençant par un dry run sur un texte non sensible.
Deux petites actus Microsoft à regarder cette semaine : les connexions Remote PC passent en disponibilité générale dans Windows App sur Windows, et Azure Virtual Desktop fait évoluer ses host pools avec le modèle Regional. On commence par Windows App, puis on passe à AVD, avec quelques manipulations simples pour voir concrètement de quoi il retourne.
Pas besoin de refaire tout votre lab pour découvrir ces évolutions. Pour Windows App, on regarde l’ajout d’un PC et le presse-papier. Pour AVD, on vérifie le nouveau choix de scope sur un pool de test, sans déployer de VM.
Petit article aujourd’hui, donc petit sommaire qui va avec :
Remote PC dans Windows App sur Windows passe en GA : connexions enregistrées et favoris, sans compte professionnel ou scolaire dans l’application, avec authentification sur la cible. C’est l’annonce de Remote PC connections in Windows App on Windows is now generally available, sur Microsoft Tech Community.
L’intérêt est facile à voir : garder sous la main les connexions vers les machines que vous utilisez souvent dans une seule unique application que vous utilisez déjà pour vos accès Windows 365 et Azure Virtual Desktop :
On va commencer par une seule cible, puis regarder un réglage qui mérite toujours un contrôle : le presse-papier.
Ce que cela change pour vos connexions
Le scénario est celui d’une machine que vous connaissez déjà et à laquelle vous avez le droit de vous connecter. Le nom saisi dans Windows App désigne cette cible : ce n’est pas une recherche automatique de tous les PC du réseau.
Préparez donc le nom réel de l’ordinateur, ou son adresse IP, avant de commencer :
Un nom convivial pour la carte vous aidera ensuite à retrouver le lab sans confondre plusieurs machines :
Autre détail important : ne pas ajouter de compte professionnel dans Windows App ne dispense pas de fournir les identifiants acceptés par le PC distant. Pour isoler ce point, vous pouvez utiliser un profil Windows de lab non connecté à votre compte d’entreprise, puis un compte de test autorisé sur la cible. Il n’est pas nécessaire de retirer les comptes de votre poste de travail habituel.
Test n°1 : ajouter un PC et ouvrir une session
Pour cet essai, prévoyez Windows App à jour, un PC Windows 11 Pro ou Windows Serveur avec le Bureau à distance activé, un compte autorisé sur cette machine et un accès réseau de confiance. Conservez NLA et le pare-feu. Les prérequis côté PC sont détaillés dans Enable Remote Desktop on your PC.
Sur le PC distant, ouvrez Paramètres, puis Système et Bureau à distance. Vérifiez que l’accès est activé et que le compte choisi est autorisé. La machine doit être allumée et joignable.
Sur le poste client, ouvrez Windows App à jour et choisissez Add a remote PC, ou le bouton d’ajout si vous êtes déjà dans l’application.
Dans PC Name, saisissez le nom exact ou l’adresse IP de votre PC de lab, puis cliquez ici :
Dans Additional settings, donnez un nom convivial à la carte, par exemple PC de lab. Conservez les autres réglages pour le premier essai et notez leur état.
Choisissez Add & Connect, puis authentifiez-vous avec le compte autorisé sur le PC :
Si une alerte de certificat apparaît, vérifiez la cible et le certificat avant de poursuivre :
Dans un terminal de la session distante, lancez les commandes ci-dessous. Le nom de machine et l’identité doivent correspondre à ce que vous aviez prévu :
hostname
whoami
ipconfig
Déconnectez la session, fermez puis rouvrez Windows App et relancez la carte enregistrée. Notez si une nouvelle demande d’identifiants apparaît et si la connexion aboutit :
Ce qu’on cherche à vérifier : la bonne machine, le bon compte, puis une reconnexion depuis l’entrée sauvegardée. Les commandes de l’interface sont décrites dans « Connect to a remote PC », onglet Windows, de Get started with Windows App to connect to devices and apps.
Si la connexion ne s’ouvre pas
Commencez par vérifier le réseau, sans toucher aux mots de passe ni désactiver les protections. Depuis Windows PowerShell sur le poste client, la commande suivante contrôle le port RDP standard de la machine que vous indiquez. Si votre lab utilise un port personnalisé, remplacez -CommonTCPPort RDP par -Port suivi du port configuré.
$RemotePC = 'Nom ou adresse IP du PC de lab'
Test-NetConnection -ComputerName $RemotePC -CommonTCPPort RDP -InformationLevel Detailed
TcpTestSucceeded : True confirme que le test TCP aboutit. Cela ne prouve pas que vos identifiants sont valides ou que votre compte a le droit d’ouvrir une session. Si le test échoue, vérifiez la cible, son état, le chemin réseau ou le VPN et les règles autorisées. Un échec ne désigne pas automatiquement le pare-feu. La commande est documentée dans Test-NetConnection (NetTCPIP).
Test n°2 : vérifier le copier-coller
La procédure Remote PC de Microsoft indique que les redirections sont désactivées par défaut sur une nouvelle connexion :
Dans les paramètres de la carte, retrouvez l’accès aux ressources locales et activez uniquement le presse-papier si l’option est disponible et autorisée. Enregistrez, puis reconnectez-vous.
Faites les essais avec des fichiers locaux et distants. Ces nouveaux marqueurs permettent d’éviter de prendre un ancien contenu du presse-papier pour le résultat du nouvel essai :
Attention : activer une option côté client ne contourne pas une restriction d’administration. Si le collage reste bloqué, vérifiez les stratégies plutôt que de tout désactiver. La page Redirect local devices, audio, and folders in Windows App explique la priorité des réglages les plus restrictifs.
2. Azure Virtual Desktop : découvrir les Regional Host Pools
Autre actualité, cette fois dans Azure Virtual Desktop. Les Regional Host Pools sont GA depuis septembre 2026 ; leurs métadonnées sont régionalisées pour améliorer la résilience en réduisant les dépendances interrégionales. Le statut est confirmé dans What’s new in Azure Virtual Desktop ?, rubrique « September 2026 ».
Au lancement, seules East US 2 et Central US sont disponibles ; une réplication vers une région jumelée reste possible. Voir Now generally available : Regional resiliency for Azure Virtual Desktop, publié le 30 septembre 2026. Pour notre essai, on retient East US 2 avec des données de lab, pas comme recommandation d’hébergement pour vos données européennes.
Le réglage à repérer est Deployment scope. La région des métadonnées et celle des VM restent des choix distincts : sélectionner Regional n’est pas une opération de déplacement de vos session hosts. Pour un administrateur, la première vérification utile est donc le type d’objets créé et leur compatibilité.
Ce que signifie Regional pour un host pool
La page Regional Host Pools décrit une infrastructure de service dédiée aux objets régionaux. Le sujet concerne notamment la manière dont les métadonnées sont stockées et les dépendances de cette infrastructure. Ce n’est pas une option qui recrée automatiquement les VM, déplace les profils FSLogix ou modifie vos applications.
Pour votre lab, gardez donc deux vérifications simples : la région retenue doit proposer le scope Regional, et les objets que vous associerez au pool doivent être compatibles avec ce nouveau scope. Un groupe de ressources commun ne suffit pas à rendre une association valide.
La GA ne signifie pas non plus que toutes les régions Azure proposent immédiatement le nouveau modèle. Vérifiez la disponibilité au moment du test. Si le champ n’est pas visible dans la région choisie, ne continuez pas avec les valeurs par défaut en pensant avoir créé un pool régional.
Test n°3 : créer un pool Regional, sans VM
Utilisez une subscription et un groupe de ressources de lab, avec les permissions de création nécessaires. Ce test crée des objets AVD, pas un environnement complet : aucune ouverture de bureau n’est attendue puisqu’on n’ajoute pas de session host.
La procédure de référence est « Create a host pool with standard management » dans Deploy Azure Virtual Desktop.
Dans le portail Azure, ouvrez Azure Virtual Desktop, puis Host pools et Create. Utilisez uniquement le groupe de ressources réservé au lab.
Sur Basics, choisissez votre subscription et le groupe de ressources. Donnez un nom identifiable au pool de test pour le retrouver facilement après déploiement.
Dans Location, choisissez East US 2 pour cet exemple. Dans Deployment scope, sélectionnez explicitement Regional. Si le champ n’apparaît pas, arrêtez l’essai et vérifiez la disponibilité.
Choisissez Pooled pour le type de pool, Desktop pour le type de groupe préféré et la gestion standard. Ne configurez pas de session host configuration pour cet essai.
Ne créez aucune VM et ne rattachez pas le groupe d’applications à un workspace existant. Le test porte sur la création des objets, pas sur une session utilisateur.
Dans Review + create, relisez la région, le scope et les ressources annoncées. Le portail crée également le groupe d’applications Desktop par défaut. Lancez la création seulement si le résumé correspond au périmètre prévu.
Après déploiement, contrôlez le scope dans les propriétés du pool ou la colonne Deployment scope de la liste. La valeur attendue est Regional :
Voici d’ailleurs la commande PowerShell pour créer un pool d’hôtes régional :
Si vous poursuivez le lab avec un workspace, gardez une chaîne homogène. Le groupe d’applications hérite du scope de son host pool et ne peut être enregistré que dans un workspace du même scope. Les règles sont détaillées dans « Deployment scope and object relationships » du guide de déploiement.
Pour prolonger ce même test, vous pouvez créer un workspace Regional dans le lab :
Vérifiez le scope du workspace avant l’association :
Si le groupe n’est pas proposé ou reste grisé, contrôlez son scope et une éventuelle association existante avant de toucher aux permissions.
Cette association valide la configuration des objets ; sans session host, elle ne fournit toujours pas un bureau utilisable.
Attention : le scope n’est pas modifiable après création. Par ailleurs, Regional Host Pools contient encore des mentions de preview : pour le statut actuel, retenez l’annonce GA et le journal des nouveautés, pas ces anciens libellés.
Avant d’envisager un déploiement plus large
Gardez le nom du pool, la région choisie et une capture du scope obtenu avec vos notes de test. Ce contrôle ne démontre pas un basculement en cas de panne régionale. Pour une utilisation en production, examinez séparément les VM, les profils, les applications et la supervision : la page Regional Host Pools signale encore une limitation sur la remontée des erreurs et checkpoints dans Log Analytics, à confirmer pour votre déploiement GA.
🤖
Contenu assisté par IACet article a été rédigé avec l’assistance d’une intelligence artificielle et relu par l’auteur.
Imaginez que vous dirigez une petite entreprise du bâtiment. Dans votre boîte commune, tout arrive au même endroit : demandes clients, devis fournisseurs, questions de congés et publicité. Pendant que votre conducteur de travaux est sur un chantier, quelqu’un doit ouvrir les mails et les redistribuer. Et si vous automatisiez ce premier tri avec Copilot Studio ?
Pour cette démonstration, je me place dans cette entreprise fictive. Le but est simple : confier une tâche manuelle peu valorisante à un agent, sans demander à une personne de lancer une conversation pour chaque message. On va construire tranquillement le parcours, du mail reçu jusqu’à son transfert au bon interlocuteur, son classement et sa trace dans SharePoint.
Ce n’est pas un assistant qui négocie un devis ou décide d’un changement de cuisine. Il comprend la demande et propose son orientation. Les mails ordinaires suivent leur chemin automatiquement ; les exceptions reviennent à un humain dans Teams. C’est ce fonctionnement proactif que je veux vous montrer.
1. Le scénario : arrêter de redistribuer chaque mail à la main
Avant, une personne ouvre la boîte partagée, lit un message, cherche le chantier concerné, retrouve son responsable, transfère le mail et range l’original. Pour une question RH, elle recommence avec un autre destinataire. Rien de très compliqué, mais il faut interrompre autre chose pour le faire.
Après, l’arrivée du mail déclenche le traitement. Le système consulte les catégories et les chantiers connus, choisit un circuit, puis exécute les actions prévues. Une demande liée aux Jardins de Bellevue part vers le responsable enregistré. Une question de congés rejoint l’équipe RH. Un chantier inconnu provoque une demande de revue, pas un transfert au hasard.
Le workflow sait transférer un mail. L’agent sert à comprendre à qui il faut le transmettre, à partir de la demande et du contexte de l’entreprise.
L’agent interprète le message à partir des instructions et des informations métier qu’on lui transmet. Le workflow démarre à réception du mail, appelle cet agent et enchaîne les actions Outlook, SharePoint et Teams selon sa décision.
L’autonomie vient donc du déclenchement sur la messagerie, pas d’une personne qui tape une question dans un chat. Les instructions ne suffisent pas à envoyer des mails : nous allons aussi configurer les connexions et les branches qui réalisent le travail.
2. Préparer le terrain dans Microsoft 365
Commencez dans un espace de démonstration, avec des messages fictifs et des destinataires de test. Vous avez besoin d’un accès à Copilot Studio et de connexions autorisées à utiliser la boîte partagée, les listes SharePoint et Teams. Vérifiez aussi que votre environnement dispose des droits et de la capacité nécessaires.
À préparer
Son rôle dans la démonstration
Une boîte partagée Outlook
Recevoir les mails et permettre leur transfert, leur réponse et leur classement.
Des dossiers Outlook
Ranger les messages suivant les circuits retenus.
Deux listes de référence SharePoint
Indiquer les catégories, leurs destinataires et les responsables des chantiers.
Un journal SharePoint
Retrouver ce qui a été décidé et effectué pour chaque mail.
Un destinataire de revue dans Teams
Prendre en charge les messages nécessitant un choix humain.
Quelques catégories et un chantier connu suffisent pour démarrer. Désignez aussi une personne pour traiter les exceptions dans Teams.
3. Donner à l’agent les repères de l’entreprise
Première liste : les catégories. Pour chacune, renseignez un libellé, une description, des mots-clés et le destinataire à contacter. Vous pouvez distinguer RH, fournisseurs et commandes, livraisons, publicité et demandes à traiter. Pour RH, choisissez l’équipe ou la personne qui reçoit les questions de personnel dans votre scénario.
Les descriptions font la différence. « Livraisons » doit expliquer qu’il s’agit d’informations de transport ou de réception de matériel. « Fournisseurs / Commandes » couvre plutôt les échanges sur les achats. Si vos circuits se recouvrent, précisez où doit aller un message qui parle à la fois d’une commande et de sa livraison.
Deuxième liste : les chantiers. Renseignez le nom, les repères client, l’adresse lorsqu’elle est connue, le responsable et le statut. Ajoutez des mots-clés utiles pour retrouver le chantier dans un mail. Dans notre démo, Les Jardins de Bellevue est déjà présent ; Résidence du Parc ne l’est pas au départ.
Dans ce montage, le workflow récupère ces deux listes et les transmet à l’agent à chaque traitement. Nous ne les ajoutons pas comme une source de connaissances à parcourir séparément dans l’agent. Le référentiel reste ainsi le point de départ métier : changez un responsable dans la liste, puis vérifiez le routage au prochain test.
4. Créer l’agent et écrire ses instructions
Dans Copilot Studio, ouvrez Agents et créez un nouvel agent :
Donnez-lui un nom explicite, par exemple « Triage des mails chantier ». Si vous démarrez par une description en langage naturel, voici une base à copier :
Crée un assistant de triage des mails pour une petite entreprise du bâtiment. Il doit lire une demande entrante, utiliser les catégories et les chantiers qui lui sont fournis, proposer le bon destinataire et signaler les situations à faire revoir par une personne.
Ouvrez ensuite les instructions dans Overview, puis Instructions et Edit. Reformulez le rôle en règles simples. Voici un exemple volontairement court pour lancer vos essais :
Tu es l’assistant de triage des mails d’une petite entreprise du bâtiment. Utilise le sujet, le corps du message et les référentiels fournis. Lorsqu’un chantier connu correspond clairement à la demande, oriente le mail vers son responsable. Sinon, cherche la catégorie adaptée et son destinataire. N’invente jamais une adresse de destination. Signale une revue humaine si le choix est incertain ou si un nouveau chantier semble concerné. Pour une publicité, ne propose ni réponse ni transfert. Pour les autres demandes, propose seulement un accusé de réception neutre, sans engagement sur un prix, un délai ou une décision métier. Indique la catégorie, le destinataire, un bref résumé et la nécessité d’une revue.
Les libellés de l’interface peuvent varier suivant la langue et les évolutions de Copilot Studio.
Ce texte fixe le comportement attendu, mais ne remplace pas les réglages du workflow. Essayez quelques messages dans le test de l’agent avec leurs références, ajustez les instructions, puis publiez l’agent après vos modifications.
5. Construire le workflow qui démarre à réception d’un mail
Passons au mécanisme qui rend cette démo autonome. Dans Copilot Studio, ouvrez Workflows, puis New agent flow :
Nous allons assembler le déclencheur, les lectures SharePoint et l’appel de l’agent dans le concepteur.
Le workflow relie la réception du mail, les référentiels métier et l’appel de l’agent.
Ajoutez le déclencheur Outlook de réception d’un nouveau mail dans une boîte partagée. Choisissez votre connexion, la boîte de démonstration et le dossier Inbox :
Ajoutez une action SharePoint de récupération des éléments pour la liste des catégories :
Puis une seconde pour la liste des chantiers :
Ajoutez l’action Agent, sélectionnez votre agent et transmettez-lui le sujet, le corps du mail et les deux référentiels récupérés :
La décision de l’agent sert à choisir la suite du parcours. Configurez les conditions du workflow pour distinguer trois branches : publicité, traitement automatique et revue humaine. Une publicité est classée et journalisée, sans réponse ni transfert. Une demande dont le destinataire est identifié suit le traitement automatique. Pour un chantier connu, ce destinataire est son responsable dans le référentiel. Si le chantier est inconnu ou que l’orientation reste incertaine, le workflow demande une revue dans Teams.
Arrêtez-vous un instant ici pour tester cette première partie. Sur un mail simple, retrouvez-vous une catégorie compréhensible et un destinataire issu de vos listes ?
Corrigez les descriptions ou les instructions avant d’ajouter les envois. On construit progressivement, sans brancher immédiatement toute la boîte de l’entreprise.
6. Transférer, répondre et classer selon la décision
Ajoutez maintenant des conditions à la suite de l’appel de l’agent. Si une revue est nécessaire, le mail rejoint le circuit Teams. Si le destinataire est identifié et qu’aucune revue n’est demandée, le workflow suit la branche de traitement automatique. La catégorie publicité dispose de son propre chemin, sans réponse et sans transfert.
Dans la branche automatique, configurez les actions Outlook : envoyer l’accusé de réception lorsque votre scénario le prévoit, transférer le message au destinataire retenu, puis déplacer l’original vers le dossier choisi. Un accusé comme « Nous avons bien reçu votre demande. Elle va être orientée vers la personne concernée. » confirme la réception sans annoncer un transfert déjà effectué.
Pour les pièces jointes, l’objectif est de conserver le PDF dans le mail transféré. Nous ne demandons pas à l’agent d’analyser son contenu. Vérifiez le transfert réel dans la boîte du destinataire de test : il doit retrouver le message et pouvoir ouvrir le document.
Terminez le parcours par une écriture dans le journal SharePoint :
Gardez de quoi retrouver le mail, la catégorie retenue, la destination et les actions effectuées. Une décision proposée et un transfert réussi sont deux choses différentes : votre journal doit permettre de comprendre où le traitement en est.
Attention : prévoyez un circuit à traiter lorsque le destinataire manque ou qu’une action échoue. Dans la démo, le filtre sur « Undeliverable » permet d’écarter certains retours de non-remise. Ce filtre ciblé ne couvre pas toutes les réponses automatiques.
7. Garder la main sur les nouveaux chantiers dans Teams
Un client écrit à propos de Résidence du Parc, appartement 24. Il demande de remplacer la cuisine bois par du blanc mat. Le nom n’existe pas encore dans notre référentiel. Voilà une bonne exception : le système peut reconnaître une demande liée à un chantier, mais quelqu’un doit choisir sa destination et décider s’il faut ajouter ce chantier.
Reliez la branche de revue à une carte Teams adressée à la personne désignée. Dans la carte de la démo, elle peut choisir de répondre, de transférer, saisir l’adresse du destinataire et décider de créer le chantier avec Yes ou No, puis valider avec Submit.
Le nom proposé est Résidence du Parc, l’adresse reste vide. Les mots-clés proposés sont résidence, parc, appartement 24, rénovation et cuisine. Ne complétez pas une adresse au hasard : une information absente du mail reste à renseigner dans le référentiel.
Après validation, le workflow suit les choix de la carte. La création du chantier dépend du choix humain, elle n’est pas automatique à chaque nom nouveau. Une fois la fiche créée et son responsable renseigné, les prochaines demandes peuvent emprunter le circuit d’un chantier connu. C’est là que le référentiel devient utile au quotidien.
8. Passer les cinq mails de démonstration
Le moment de vérité. Envoyez les cinq messages à la boîte de test, puis suivez chacun jusqu’au bout :
Les parcours ci-dessous sont les attendus à vérifier, pas une promesse que toutes les exécutions réussiront au premier essai.
Publicité : « Information concernant votre abonnement ». Un message neutre sur un abonnement ne garantit pas un classement en publicité. Variante promotionnelle proposée pour ce test : « Profitez de notre offre spéciale sur votre abonnement. Découvrez nos options à prix réduit. » Attendu pour cette variante : catégorie publicité, classement et journalisation, sans réponse ni transfert. Le sujet seul ne suffit pas à reconnaître une publicité.
RH : une question sur les congés du 1er novembre. Attendu : catégorie RH et transfert au destinataire prévu dans le référentiel, sans réponse automatique sur le droit au congé.
Fournisseur : un message concernant la commande 4587 et sa livraison. Attendu : orientation vers le circuit fournisseur ou livraison défini dans vos descriptions, conservation du PDF joint et classement.
Chantier connu : une demande sur l’accès au bâtiment B des Jardins de Bellevue. Attendu : reconnaissance du chantier et transfert à son responsable, sans inventer une consigne d’accès.
Chantier absent : Résidence du Parc, appartement 24, cuisine bois à remplacer par du blanc mat. Attendu : revue Teams, choix humain du destinataire et décision sur la création du chantier, sans accepter automatiquement la modification.
Ouvrez le message reçu, retrouvez la catégorie et le destinataire choisis, puis montrez le mail transmis avec sa pièce jointe :
Revenez ensuite au dossier de classement et à la ligne du journal. Le lecteur voit une tâche réalisée, pas seulement une réponse dans un chat.
Vérifiez aussi qu’une publicité ne provoque aucun envoi :
Enfin, après avoir créé Résidence du Parc et renseigné son responsable, renvoyez une demande liée à ce chantier pour tester le nouveau trajet :
Vérifiez la réception de l’accusé de réception :
Finissez par montrer les statistiques de votre workflow :
Pensez également à regarder la consommation de crédits Copilot :
Consultez les exécutions du workflow pour repérer les erreurs techniques, puis comparez les décisions aux attendus métier. Une exécution sans erreur ne garantit pas un bon classement. Si le mail arrive au mauvais service, retravaillez d’abord la description de la catégorie ou les repères du chantier.
Sur mon lot de vingt mails du 3 octobre, j’ai relevé 248 crédits Copilot, soit 12,4 crédits par mail en moyenne pour cette démonstration. Ce relevé n’est pas un tarif fixe et ne préjuge pas de la consommation dans votre scénario.
9. Conclusion
Voilà le montage : une boîte commune, deux référentiels, un agent qui interprète les demandes et un workflow qui agit dès leur arrivée. L’humain ne redistribue plus systématiquement chaque message ; il intervient là où un choix reste nécessaire.
Retenez trois points : donnez des repères métier clairs, vérifiez les actions réellement effectuées et prévoyez une personne pour les exceptions. Commencez par vos cinq mails fictifs, montrez les PDF transférés, puis adaptez les catégories à votre activité. Foncez tester : le meilleur point de départ n’est pas un agent qui sait tout, c’est une tâche répétitive dont vous connaissez déjà le bon parcours.
🤖
Contenu assisté par IACet article a été rédigé avec l’assistance d’une intelligence artificielle et relu par l’auteur.
À la fin de mon article sur Azure Virtual Desktop Hybride, je terminais par une question ouverte : et si quelqu’un testait sur un hyperviseur que je n’avais pas couvert, du Proxmox par exemple ? Personne ne m’a répondu. Alors je l’ai fait moi-même. Le résultat tient en une phrase : ça marche, et exactement de la même façon que sur Hyper-V ou vSphere. La VM Windows 11 montée dans le premier article Proxmox sur Azure, jointe à Entra ID, devient un session host Azure Virtual Desktop à part entière. On se connecte dessus depuis la Windows App, et le bureau qui s’affiche tourne dans Proxmox.
Ce qui rend ce lab amusant, c’est l’empilement : un service AVD dans Azure, qui pilote un session host qui tourne dans Proxmox VE, lui-même hébergé dans une machine virtuelle Azure. Trois couches, et tout le monde s’en accommode.
Si vous débarquez ici sans contexte, lisez peut-être d’abord l’article Azure Virtual Desktop Hybride, qui explique ce qu’est cette préversion, ce qu’elle apporte et ses limites. Celui-ci se concentre sur un seul point : le cas Proxmox, et les deux ou trois choses qui diffèrent quand l’hyperviseur n’est pas dans la liste officielle.
Pour vous guider plus facilement dans cet article, voici des liens rapides :
La question mérite une réponse honnête, parce qu’elle a deux niveaux.
Dans son annonce, Microsoft cite nommément Hyper-V, Nutanix AHV, VMware vSphere et les serveurs Windows physiques. Proxmox n’y figure pas. Si vous cherchez une ligne de documentation qui écrit le mot Proxmox, vous ne la trouverez pas, et un support Microsoft pourra légitimement vous le rappeler.
Mais la page d’aperçu de la fonctionnalité est nettement plus large, et c’est elle qui décrit la règle réelle.
You can run Azure Virtual Desktop session hosts on your preferred on-premises hypervisor that supports Windows virtual machines.
Autrement dit, l’hyperviseur n’est pas un participant de la mécanique, il est juste le meuble sur lequel la VM est posée. Azure Arc parle à un Windows, pas à un hyperviseur. Tant que ce Windows est éligible, qu’il sort en TCP 443 et que l’agent Connected Machine s’installe, le reste suit. C’est très exactement ce que j’avais constaté entre mes trois cas Hyper-V et vSphere : la procédure est rigoureusement identique.
Attention : supporté et fonctionnel ne sont pas synonymes. Proxmox fonctionne, je l’ai vérifié de bout en bout, mais il n’est pas nommé dans la matrice Microsoft. Pour un lab, une démonstration ou un PoC, aucun problème. Pour un déploiement de production, gardez en tête que vous sortez de la liste explicitement citée, ce qui s’ajoute au fait que la fonctionnalité est déjà en préversion.
2. Le point qui mérite d’être posé clairement : Arc dans une VM imbriquée
Il y a une bizarrerie dans ce lab, et je préfère la traiter tout de suite plutôt que de laisser quelqu’un la relever en commentaire.
Azure Arc sert à gérer des machines qui ne sont pas dans Azure. Or mon nœud Proxmox est, lui, une machine virtuelle Azure. On pourrait croire qu’on essaie d’enrôler une VM Azure dans Arc, ce qui n’a pas de sens et n’est pas pris en charge :
Ce n’est pas ce qui se passe. Ce que j’enrôle, c’est la VM Windows 11 qui tourne dans Proxmox, et cette machine n’a rien d’une ressource Azure : elle n’apparaît dans aucun groupe de ressources, elle n’a pas d’identité managée, elle n’atteint pas le service de métadonnées d’instance, et son adresse est une 10.10.10.x distribuée par le dnsmasq du nœud, derrière le NAT nftables mis en place dans le premier article. Du point de vue d’Azure Arc, c’est une machine anonyme quelque part sur Internet qui sort en 443. Exactement le profil d’un serveur de datacenter.
Mon retour terrain : cette nuance n’est pas un détail de présentation, c’est ce qui fait que le lab est représentatif. Si vous refaites l’exercice sur un Proxmox posé sur une vraie machine dans votre garage ou votre salle serveur, vous obtiendrez le même résultat par le même chemin. Azure n’est ici qu’un moyen commode de disposer d’un hyperviseur.
3. Étape 0 : l’état de départ et les pré-requis
Je repars de la machine construite dans les deux articles précédents, sans rien y changer d’autre que l’identité.
Élément
Ce que j’ai
Hyperviseur
Proxmox VE 9, nœud proxmox-ve, dans une VM Azure Standard_D16s_v3
Réseau des invités
Bridge vmbr0 en 10.10.10.0/24, NAT nftables, DHCP et DNS par dnsmasq
Session host
VM Windows 11 Entreprise mono-session, 2 cœurs, 8 Gio, disque de 64 Gio
Identité
Microsoft Entra Join pur, aucun contrôleur de domaine
Licence utilisateur
Microsoft 365, éligible AVD
Abonnement
Un abonnement Azure actif, rôles Azure Connected Machine Onboarding et Desktop Virtualization Contributor
Les pré-requis côté Azure restent ceux de l’article Azure Virtual Desktop Hybride dans leurs grandes lignes, mais la documentation a évolué depuis que je l’ai écrit, et deux points ont changé. Je les signale au fil des étapes.
Azure Connected Machine Onboarding, et Desktop Virtualization Contributor
Identité du session host
Entra Join, jointure AD, ou jointure hybride pour un Windows client
Réseau
Sortie TCP 443 vers les URL requises par AVD et vers les endpoints Azure Arc
Agent Arc
Azure Connected Machine agent installé sur chaque session host
Identité managée
À assigner au host pool, avec le rôle Reader sur le groupe de ressources des machines Arc
Attention : un point d’identité que je n’avais pas détaillé dans mon article de mai et que la documentation précise désormais : un session host Windows Server ne peut pas être en Entra Join pur, à cause de la dépendance au serveur de licences Bureau à distance. Il lui faut une jointure AD ou hybride. C’est seulement sur un Windows client, comme le Windows 11 de ce lab, que l’Entra Join seul est accepté.
Attention : un rappel qui vaut pour tous les hyperviseurs et que je répète ici parce qu’il coûte cher : l’identité doit être fixée avant l’enrôlement Arc. Si vous faites l’Entra Join après avoir posé l’agent, il faut désinstaller l’agent et recommencer. Sur une VM neuve, faites l’Entra Join d’abord, Arc ensuite, extension AVD en dernier.
4. Étape 1 : vérifier l’Entra Join du session host
Ma VM Windows 11 a été jointe au tenant pendant l’OOBE, avec l’option Set up for work or school. Si la vôtre est en compte local, faites-le maintenant par Paramètres, Comptes, Accès Professionnel ou Scolaire, puis Connecter et l’option de jointure à Microsoft Entra.
La vérification se fait en une commande, dans une invite en administrateur.
dsregcmd /status
Dans la section Device State, il faut lire AzureAdJoined : YES et DomainJoined : NO. C’est la signature d’un Entra Join pur :
Vérifiez au passage dans le centre d’administration Entra que l’appareil est bien apparu dans la liste, avec son nom d’hôte :
Mon retour terrain : c’est le scénario que je préférais déjà dans mon article AVD hybride, et Proxmox ne change rien à cette préférence. Pas de contrôleur de domaine à rendre joignable depuis le réseau interne de l’hyperviseur, pas de Kerberos, pas de GPO. Avec un bridge NAT comme le nôtre, où les invités sont derrière une translation d’adresses, c’est même un vrai confort : un DC aurait demandé du routage supplémentaire. Gardez juste en tête que ce raccourci n’est ouvert qu’aux Windows client, un Windows Server exigeant une jointure AD ou hybride.
5. Étape 2 : vérifier la sortie réseau du session host
C’est le seul point où la configuration Proxmox de notre lab demande une attention particulière. Les invités sont derrière le NAT nftables du nœud, et l’agent Arc comme les composants AVD ont besoin de sortir en TCP 443.
Un test simple depuis la VM Windows, en PowerShell.
Si ces tests échouent, reprenez la configuration réseau du premier article : le routage IPv4 activé, la règle de masquerade dans la table nat, et la chaîne forward qui accepte les flux de 10.10.10.0/24 vers eth0. Côté nœud, une vérification rapide.
sudo nft list ruleset
sysctl net.ipv4.ip_forward
Attention : l’agent Arc et AVD ont besoin d’un flux sortant uniquement. Vous n’avez rien à ouvrir en entrée sur le NSG Azure, et surtout pas de RDP : la connexion utilisateur passe par le service AVD via une passerelle inversée, pas par une exposition directe du port 3389. C’est l’un des vrais bénéfices de la mécanique, et il tombe particulièrement bien dans notre montage où les invités n’ont de toute façon aucune adresse publique.
6. Étape 3 : enregistrer les resource providers
Rien de spécifique à Proxmox ici, mais c’est le préalable à tout le reste. Sur l’abonnement cible.
N’oubliez pas Microsoft.HybridConnectivity, qui porte la connectivité via Arc. Son absence laisse l’enrôlement réussir tout en faisant échouer silencieusement des opérations plus loin.
7. Étape 4 : créer le host pool et son identité managée
Ici, deux choses ont bougé depuis mon article de mai, et la seconde est un vrai piège si vous travaillez de mémoire.
Le host pool, désormais standard
Au lancement de la préversion, seul un host pool marqué comme environnement de validation acceptait un session host hybride. Ce n’est plus ce que dit la documentation, qui demande simplement de créer un host pool ordinaire sans y ajouter de machines.
Follow the Deploy Azure Virtual Desktop instructions to deploy a standard host pool without adding session hosts. Do not add virtual machines to this host pool.
Dans le portail, cherchez Azure Virtual Desktop, puis Host pools et Create.
Dans Basics, nommez le pool, choisissez la région des métadonnées et le type Pooled ou Personal.
Dans Virtual machines, choisissez No, I’ll add VMs later. La machine arrivera par Arc, pas par l’assistant.
Dans Workspace, créez ou rattachez un workspace, puis validez.
Dans Identity, assignez une identité managée. Ne sautez pas cet onglet, la suite en dépend.
L’identité managée et son rôle Reader
C’est la nouveauté qui coûte le plus cher à ignorer. L’identité managée du host pool doit disposer du rôle Reader sur le groupe de ressources qui contient vos machines Azure Arc. La documentation est explicite sur les conséquences.
If the managed identity doesn’t have Reader access to the Arc resource group, a future release will prevent session hosts from becoming available.
Ouvrez le groupe de ressources qui contient vos serveurs Arc.
Allez dans Access control (IAM), puis Add et Add role assignment.
Cherchez Reader, sélectionnez-le, puis Next.
Dans Assign access to, choisissez Managed identity, puis Select members.
Choisissez votre abonnement, le type Host pool, sélectionnez l’identité de votre host pool, et validez.
Attention : cette exigence n’existait pas au lancement de la préversion et n’apparaît donc pas dans mon article de mai. Si vous rejouez une procédure notée il y a quelques mois, c’est très précisément l’étape qui vous manquera, avec un symptôme différé et peu explicite : un session host qui ne devient jamais disponible.
8. Étape 5 : enrôler la VM Proxmox dans Azure Arc
On y est. Dans le portail, allez dans Azure Arc, Machines, Add, puis Add a single server. Renseignez l’abonnement, le groupe de ressources et la région, et téléchargez le script PowerShell d’onboarding généré :
Ouvrez PowerShell ISE puis lancez la commande suivante :
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
Collez le script d’Azure ARC dans la VM Windows 11 et exécutez-le. Il télécharge AzureConnectedMachineAgent.msi, l’installe, puis lance azcmagent connect avec les paramètres de votre tenant :
Une fenêtre d’authentification s’ouvre pour valider :
Au bout de deux à cinq minutes, la machine apparaît dans Azure Arc, Machines, avec le statut Connected :
Ouvrez la ressource et regardez ses propriétés. C’est l’écran le plus intéressant de tout l’article :
Mon retour terrain : vérifiez la valeur d’azcmagent plutôt que de vous fier au portail seul. Sur la machine, azcmagent show vous donne l’état de l’agent, le statut de la connexion et les endpoints atteints. C’est le premier endroit où regarder si quelque chose coince, et c’est beaucoup plus parlant qu’un statut dans une liste.
azcmagent show
9. Étape 6 : poser l’extension AVD
C’est l’extension Azure Arc qui installe les composants AVD sur la machine et l’enregistre auprès du host pool. La documentation précise au passage ce qu’elle fait selon le système : sur Windows Server, elle active le rôle Hôte de session Bureau à distance, et sur Windows 11, elle active la connexion en RDP.
Attention : sur un Windows Server, l’activation du rôle entraîne un redémarrage de la machine. La documentation conseille d’installer le rôle avant de déployer l’extension pour éviter un redémarrage au milieu de la configuration. Sur notre Windows 11, la question ne se pose pas.
Bonne nouvelle par rapport à mon article de mai : il existe maintenant un chemin portail, sans génération de clé d’enregistrement à la main.
Option 1 : depuis le portail
Dans le portail, cherchez Azure Arc, dépliez Infrastructure et sélectionnez Machines.
Cliquez sur le nom de votre machine, puis dans le menu de gauche dépliez Settings et choisissez Extensions.
Cliquez sur Add, sélectionnez l’extension Azure Virtual Desktop Hybrid, puis Next.
Choisissez l’abonnement, le groupe de ressources et le host pool auquel rattacher le session host.
Validez par Review + Create puis Create.
Option 2 : en PowerShell
Le chemin script reste parfaitement valable, et c’est celui qu’on garde pour industrialiser. Installez les modules, puis connectez-vous en fixant explicitement l’abonnement :
isCloudDevice = $false est le drapeau qui indique le mode hybride. Sans lui, rien ne fonctionne.
MachineName est le nom de la ressource dans Azure Arc, pas forcément le nom d’hôte Windows brut.
Location est la région du groupe de ressources Arc, pas l’endroit où tourne physiquement la machine.
La clé d’enregistrement a une durée de vie limitée, générez-la juste avant de jouer le script.
Vérifier le résultat
Dans la vue Extensions de la machine Arc, la colonne de statut de Microsoft.AzureVirtualDesktop.CloudDeviceExtension doit afficher Succeeded.
Les différentes applications commencent à faire leur apparition dans le gestionnaire des programmes Windows :
Puis, dans le host pool, la machine apparaît dans la liste Session hosts avec le statut Available :
Mon retour terrain : ne paniquez pas si le session host n’apparaît pas immédiatement après le Succeeded de l’extension. La documentation annonce jusqu’à quinze minutes de délai entre les deux, et c’est exactement le genre d’attente pendant laquelle on relance inutilement un script qui avait très bien fonctionné.
Attention : si vous partez sur le chemin PowerShell et obtenez une erreur du type machine introuvable, vérifiez Get-AzContext. Avec plusieurs abonnements rattachés au compte, l’applet va chercher la ressource Arc au mauvais endroit et le message d’erreur n’aide pas beaucoup. C’est le piège sur lequel j’avais déjà perdu du temps lors de mes premiers tests.
10. Étape 7 : assigner les utilisateurs et se connecter
Dernière ligne droite. Ouvrez l’application group, allez dans Assignments et ajoutez l’utilisateur ou le groupe Entra qui doit pouvoir se connecter :
Puis, côté utilisateur, ouvrez la Windows App et connectez-vous avec ce compte. Le bureau publié par le host pool apparaît :
Cliquez, et le bureau s’ouvre :
Pour le plaisir de la démonstration, ouvrez côté Proxmox la console de la même VM et regardez les deux écrans côte à côte. C’est la capture que je trouve la plus parlante de tout ce lab : le même Windows, vu par son hyperviseur et vu par le service AVD :
11. Ce qui change vraiment avec Proxmox
Après ce test, la réponse honnête est : presque rien du côté d’AVD, et un peu plus du côté de l’exploitation.
Sujet
Sur Hyper-V ou vSphere
Sur Proxmox
Enrôlement Arc
Script d’onboarding standard
Identique, l’agent ignore l’hyperviseur
Extension AVD
Depuis le portail, ou CloudDeviceExtension en PowerShell
Identique
Identité
Entra Join ou jointure de domaine
Identique, Entra Join testé ici
Connexion utilisateur
Windows App
Identique
Support Microsoft
Hyperviseurs nommés dans l’annonce
Non nommé, couvert par la formulation générale de l’aperçu
Les deux dernières lignes sont les seules qui demandent un vrai effort d’adaptation, et elles découlent toutes les deux d’une limite de la préversion : AVD hybride ne pilote ni l’alimentation ni le cycle de vie des machines. Ce n’est pas propre à Proxmox, c’est documenté.
Azure Virtual Desktop Hybrid doesn’t provision or manage virtual machine state, so the following capabilities aren’t supported: Power management, Autoscale, Start VM on Connect, Session Host Configuration.
Concrètement, si vous vouliez industrialiser, c’est du côté de Proxmox que se ferait le travail : un modèle de VM Windows préparé et généralisé, un clone par session host, et un script qui enchaîne l’enrôlement Arc et la pose de l’extension. La bonne nouvelle est que l’API de Proxmox se prête bien à l’exercice, la moins bonne est qu’aucun des partenaires cités au lancement de la préversion ne couvre Proxmox aujourd’hui.
Mon retour terrain : n’oubliez pas le QEMU guest agent sur vos session hosts, dont je parle dans le second article sur les pilotes VirtIO. Sans lui, l’ordre d’arrêt envoyé depuis Proxmox n’est pas relayé proprement au Windows, et vous finissez par couper l’alimentation d’une machine qui avait des sessions utilisateurs ouvertes. Sur un hôte AVD, c’est exactement ce qu’on ne veut pas.
12. Les pièges à retenir
Le piège
Le symptôme
La parade
Entra Join après l’enrôlement Arc
Session host qui ne s’enregistre pas correctement
Fixer l’identité avant de poser l’agent Arc, sinon désinstaller et recommencer
Microsoft.HybridConnectivity oublié
Enrôlement réussi mais échecs silencieux ensuite
Enregistrer les quatre resource providers avant de commencer
Identité managée sans rôle Reader
Session host qui ne devient jamais disponible
Assigner une identité managée au host pool et lui donner Reader sur le groupe de ressources Arc
Windows Server en Entra Join pur
Non supporté, dépendance au serveur de licences RDS
Jointure AD ou hybride pour un Windows Server, Entra Join réservé au client
Impatience après le Succeeded
On relance un script qui avait marché
Attendre jusqu’à quinze minutes avant de conclure à un échec
isCloudDevice absent ou à $true
L’extension se pose mais n’enregistre rien
Passer explicitement isCloudDevice = $false
Mauvais abonnement dans le contexte
Erreur de machine introuvable
Vérifier Get-AzContext après le Set-AzContext
Sortie 443 bloquée par le NAT
L’agent Arc n’arrive pas à se connecter
Vérifier la chaîne forward nftables et le routage IPv4 sur le nœud
Windows 11 multi-session
Non éligible hors Azure
Mono-session, ou Windows Server avec le rôle RDS
Pas de guest agent sur le session host
Arrêts brutaux depuis Proxmox
Installer le QEMU guest agent sur chaque session host
Clé d’enregistrement expirée
L’extension échoue à enregistrer la machine
Générer le token juste avant de lancer le script
Conclusion
Voilà, en sept étapes, une machine Windows 11 qui tourne dans Proxmox et qui se comporte comme un session host Azure Virtual Desktop à part entière, avec sa Windows App, son identité Entra et son host pool dans le portail.
Concrètement, ça donne quoi ? Ça confirme ce que je pressentais en écrivant mon article sur AVD hybride : la mécanique ne s’intéresse pas à votre hyperviseur. Azure Arc parle à un Windows, l’extension AVD parle à Azure Arc, et ce qu’il y a en dessous est votre affaire. Microsoft a nommé quatre plateformes dans son annonce, mais la formulation de l’aperçu est délibérément plus large, et le test le vérifie.
Les trois points que je retiens : la procédure est strictement celle des autres hyperviseurs, sans le moindre ajustement ; l’Entra Join pur reste le chemin le plus court, surtout derrière un réseau NAT où un contrôleur de domaine aurait compliqué les choses ; et l’absence de gestion d’alimentation, qui est une limite de la préversion et pas de Proxmox, est ce qui demanderait le plus de travail si on voulait industrialiser.
Foncez tester, et dites-moi en commentaire si vous l’avez fait sur un hyperviseur encore différent. La dernière fois que j’ai posé la question, personne n’avait essayé Proxmox, alors j’ai fini par m’en charger.
🤖
Contenu assisté par IACet article a été rédigé avec l’assistance d’une intelligence artificielle et relu par l’auteur. Conformément à l’AI Act (UE) en vigueur depuis le 2 août 2026.
Dans le premier article, on a monté Proxmox VE 9 dans une machine virtuelle Azure et installé un Windows 11 dedans, en choisissant volontairement du matériel virtuel que Windows reconnaît tout seul : un disque SATA et une carte Intel E1000. Ça marche, c’est reposant, et c’est lent. Cette fois, on refait la même VM en VirtIO de bout en bout, pilotes chargés pendant l’installation, et on termine par le QEMU guest agent.
Si vous n’avez pas encore de nœud Proxmox sous la main, commencez par le premier article, celui-ci reprend exactement là où il s’arrête. Mais vous trouverez également une grande quantité de vidéos sur YouTube qui vous aideront à en savoir un peu plus sur Proxmox et comment le mettre en place :
Pour vous guider plus facilement dans cet article, voici des liens rapides :
1. VirtIO, pourquoi Windows ne le voit pas tout seul
Quand un hyperviseur présente un disque ou une carte réseau à un invité, il a deux façons de faire. La première est l’émulation : QEMU imite au bit près un vrai contrôleur qui a existé, un SATA AHCI ou une carte Intel E1000. L’invité croit voir du matériel qu’il connaît depuis quinze ans, il charge son pilote habituel, tout fonctionne. Le prix à payer, c’est que chaque accès disque et chaque paquet réseau doit être traduit par l’hôte, instruction par instruction.
La seconde façon est la paravirtualisation, et c’est ce qu’est VirtIO : plutôt que d’imiter un matériel existant, l’hyperviseur expose une interface conçue pour la virtualisation, avec des files de requêtes partagées entre l’invité et l’hôte. L’invité sait qu’il est virtualisé et parle directement à l’hyperviseur. Beaucoup moins de traduction, beaucoup moins de CPU consommé, nettement plus d’IOPS et de débit.
Le revers est évident : il faut que l’invité connaisse cette interface. Le noyau Linux embarque les pilotes VirtIO depuis des années, donc une VM Debian ou Ubuntu démarre en VirtIO sans que vous ayez rien à faire. Windows non. Le programme d’installation ne contient que des pilotes pour du matériel émulé classique, et c’est précisément pour ça que l’écran de sélection du disque reste désespérément vide quand on lui présente un disque VirtIO SCSI.
Les pilotes existent, ils sont développés dans le cadre du projet virtio-win, distribués sous forme d’une ISO, et signés. Toute la manipulation consiste à les rendre disponibles au bon moment.
Le rôle
Le dossier sur l’ISO
Quand on le charge
Contrôleur de disque VirtIO SCSI
vioscsi
Pendant l’installation, à l’écran de sélection du disque
Contrôleur de disque bus VirtIO simple
viostor
Même moment, si le disque est déclaré en bus virtio et non scsi
Carte réseau VirtIO
NetKVM
Pendant l’OOBE, ou après le premier démarrage
Ballon de mémoire
Balloon
Après installation, facultatif
Agent invité QEMU
guest-agent
Une fois sur le bureau
Attention : ne confondez pas vioscsi et viostor. Le bon dossier dépend de la façon dont le disque est déclaré dans Proxmox : bus SCSI avec un contrôleur VirtIO SCSI pour le premier, bus VirtIO Block pour le second. Dans cet article, le disque est en SCSI, donc ce sera vioscsi.
2. Étape 1 : récupérer et uploader l’ISO virtio-win
L’ISO se télécharge depuis le dépôt du projet Fedora, qui héberge les binaires signés. Deux versions y cohabitent, la stable et la latest. Prenez la stable.
Attention : votre VM aura le démarrage sécurisé actif, puisque Windows 11 l’exige. Un pilote dont la signature n’est pas reconnue sera refusé sans message d’erreur explicite, vous verrez simplement le pilote ne pas apparaître dans la liste. La build stable évite ce genre de surprise.
Une fois le fichier récupéré, on l’envoie sur le nœud, exactement comme l’ISO Windows dans le premier article.
Dans l’arborescence, sélectionnez le stockage local du nœud, puis ISO Images.
Cliquez sur Upload, choisissez le fichier virtio-win.iso, puis Upload.
Vous pouvez aussi passer par Download from URL si vous préférez que le nœud télécharge lui-même, ou par la ligne de commande dans le répertoire des images.
3. Étape 2 : créer la VM en VirtIO intégral
On relance Create VM. Les onglets sont les mêmes que dans le premier article, seuls trois écrans changent.
Dans General, nommez la machine, puis cliquer sur Suivant :
Dans OS, sélectionnez l’ISO Windows 11, le type Microsoft Windows et la version 11/2022/2025. Cette fois, cochez bien Add additional drive for VirtIO drivers, et surtout choisissez l’ISO virtio-win dans le champ du dessous.
Mon retour terrain : c’est très exactement l’erreur que j’ai commise à mon premier essai. Le champ propose par défaut la seule ISO présente sur le stockage, donc celle de Windows, et rien ne vous signale que le lecteur supplémentaire monte deux fois le même DVD. Vous vous retrouvez à chercher des pilotes qui n’ont jamais été là.
Dans System, rien ne change par rapport au premier article, les pré-requis Windows 11 restent les mêmes.
Machine : q35.
BIOS : OVMF (UEFI), avec Add EFI Disk sur local-1TB et Pre-Enroll keys coché.
Add TPM coché, stockage local-1TB, version v2.0.
SCSI Controller : VirtIO SCSI single.
Cochez Qemu Agent dès maintenant, ça vous évitera d’y revenir plus tard.
Dans Disks, on garde cette fois le disque en SCSI, sur le contrôleur VirtIO SCSI single. Taille 64 Gio, format qcow2, stockage local-1TB. Activez IO thread, qui donne au disque son propre thread d’entrées et sorties, ce qui n’a d’intérêt qu’avec un contrôleur de type single, précisément celui qu’on a choisi.
Les onglets CPU et Memory ne changent pas : un socket, deux cœurs, 8192 Mio.
Dans Network, on garde le modèle VirtIO (paravirtualized) proposé par défaut, sur le bridge vmbr0.
L’écran Confirm permet de tout relire avant de valider. Vérifiez ces lignes.
ide0 pointe sur virtio-win-0.1.302.iso en media=cdrom, donc les pilotes sont bien montés
tpmstate0 est en version=v2.0 et efidisk0 en pre-enrolled-keys=1
cores vaut au moins 2, exigence de Windows 11
Attention : la liste du récapitulatif est triée par ordre alphabétique et tient rarement sur un écran. Faites-la défiler jusqu’en haut pour contrôler bios et cores, ce sont les deux valeurs qu’on oublie le plus souvent de vérifier.
4. Étape 3 : vérifier l’ordre de démarrage
Avec deux lecteurs CD sur la même machine, un détail peut vous coûter un quart d’heure : si ide0, le lecteur des pilotes, passe devant ide2 dans l’ordre de démarrage, la VM tente de démarrer sur une ISO qui n’est pas bootable et vous atterrissez dans un shell UEFI sans comprendre pourquoi.
Sélectionnez la VM, puis Options.
Double-cliquez sur Boot Order.
Placez ide2 en premier, scsi0 en second, et décochez ide0.
Décocher ide0 ne le démonte pas, le lecteur reste accessible depuis Windows. Il n’est simplement plus candidat au démarrage.
5. Étape 4 : charger le pilote vioscsi pendant l’installation
Ouvrez la Console de la VM et démarrez-la. L’installation de Windows 11 commence normalement : langue, clavier, acceptation des conditions.
Puis arrive le moment qu’on attendait. L’écran de sélection de l’emplacement d’installation est vide, et Windows affiche « Install driver to show hardware ». Rien d’anormal : il ne sait pas parler à un contrôleur VirtIO SCSI.
Cliquez sur Browse.
Dans l’arborescence, descendez jusqu’au dossier vioscsi. Il est plus bas que les premiers dossiers affichés, après viorng.
Dépliez vioscsi, puis w11, puis amd64, et validez par OK.
Windows propose alors le pilote « Red Hat VirtIO SCSI controller ». Sélectionnez-le et installez-le :
Mon retour terrain : si le dossier w11 n’existe pas sous vioscsi, prenez w10 en amd64. Les deux branches partagent le même binaire sur les builds récentes, et certaines ne créent pas le dossier w11. Laissez également cochée la case Hide drivers that aren’t compatible, elle vous évite de charger un pilote pour la mauvaise architecture.
L’écran se recharge, et le disque de 64 Go apparaît.
Le reste de l’installation se déroule sans intervention.
6. Étape 5 : charger NetKVM pendant l’OOBE
Après les redémarrages, l’expérience de première ouverture de session démarre, et un second mur vous attend. Windows affiche « Let’s connect you to a network » sans proposer la moindre connexion : même histoire que pour le disque, la carte VirtIO lui est inconnue.
Bonne nouvelle, Windows 11 propose désormais un bouton pour s’en sortir sans bricolage.
Cliquez sur Install driver.
Parcourez le lecteur virtio-win, remontez la liste jusqu’à NetKVM, tout en haut.
Ouvrez NetKVM, puis w11, puis amd64, et validez par Select Folder.
Windows installe « Red Hat VirtIO Ethernet Adapter », la carte apparaît, et elle reçoit son adresse du dnsmasq configuré dans le premier article, dans la plage 10.10.10.100 à 10.10.10.200. L’OOBE enchaîne alors sur la recherche de mises à jour.
Déroulez la fin de l’OOBE normalement :
Jusqu’au moment où le bureau s’affiche :
7. Étape 6 : installer le QEMU guest agent
Dernière brique. L’agent invité n’est pas un pilote de disque ni de carte réseau : c’est un petit service qui tourne dans Windows et dialogue avec l’hôte par un canal série virtuel dédié. Il fait remonter les adresses IP dans l’interface, permet un arrêt propre demandé au système invité, et autorise le gel des écritures pendant un instantané ou une sauvegarde.
Le canal côté hôte existe déjà, puisqu’on a coché Qemu Agent à la création. Reste la moitié invitée. D’ailleurs cela se voit ici car les adresses IP ne remontent pas encore :
On voit d’ailleurs également le pont de communication n’est pas encore correctement reconnu par Windows :
Dans Windows, ouvrez l’explorateur et le lecteur virtio-win.
Entrez dans le dossier guest-agent.
Lancez le paquet en version 64 bits et déroulez l’assistant.
Attendez la fin de l’installation de l’agent :
Vérifiez ensuite dans la console des services que QEMU Guest Agent est démarré et en mode automatique.
Enfin, il faut mettre à jour le pilote au niveau du gestionnaire de périphériques :
Sur l’ISO, choisissez l’arborescence corresponde à votre OS :
Attention : si vous aviez oublié de cocher l’option à la création et que vous l’activez après coup dans Options, un redémarrage demandé depuis Windows ne suffira pas. Il faut un arrêt complet puis un démarrage depuis Proxmox, pour que QEMU recrée la machine avec son canal série. C’est la cause numéro un des agents installés qui ne remontent rien.
Profitez-en pour installer le reste des pilotes, ballon de mémoire compris, avec le programme virtio-win-guest-tools présent à la racine du lecteur. Il pose tout d’un coup.
8. Étape 7 : vérifier que tout est bien en VirtIO
Trois contrôles, deux côté Proxmox, un côté Windows.
D’abord, l’onglet Summary de la VM doit maintenant afficher les adresses IP de l’invité, ce qui prouve que l’agent répond.
Ensuite, depuis le shell du nœud, deux commandes confirment le dialogue. Remplacez 103 par votre VMID.
La première ne renvoie rien quand tout va bien, ce qui est la définition d’un bon silence. La seconde rend la configuration réseau vue de l’intérieur de Windows, au format JSON.
Vous pouvez aussi relire la configuration complète de la machine :
qm config 103
Enfin, côté Windows, le gestionnaire de périphériques doit montrer le contrôleur et la carte Red Hat VirtIO, et surtout aucun point d’exclamation jaune.
9. Les pièges à retenir
Le piège
Le symptôme
La parade
Second lecteur pointant sur l’ISO Windows
Aucun pilote disponible au moment de charger
Sélectionner explicitement virtio-win dans le champ ISO du lecteur supplémentaire
Mauvais dossier de pilote
Le pilote n’apparaît pas dans la liste
vioscsi pour un bus SCSI, viostor pour un bus VirtIO Block
Ordre de démarrage
Shell UEFI au lieu du programme d’installation
Placer ide2 devant, décocher ide0
Build latest des pilotes
Chargement refusé silencieusement avec le démarrage sécurisé
Prendre la build stable, signée
Dossier w11 absent
Rien à sélectionner dans l’arborescence
Utiliser w10 en amd64, c’est le même binaire
Pas de carte pendant l’OOBE
Impossible de terminer la configuration
Bouton Install driver, puis NetKVM, w11, amd64
Guest agent activé à chaud
Aucune adresse IP ne remonte
Arrêt complet puis démarrage depuis Proxmox, pas un redémarrage Windows
Bascule directe SATA vers SCSI
Écran bleu INACCESSIBLE_BOOT_DEVICE
Faire connaître le pilote avec un disque temporaire avant de changer le bus
Pas d’instantané avant conversion
Machine morte, rien pour revenir en arrière
Instantané systématique avant de toucher au bus du disque système
Conclusion
Voilà, en sept étapes, vous avez une machine Windows 11 entièrement paravirtualisée, disque et réseau, avec son agent invité qui dialogue avec l’hôte. La différence de confort à l’usage est immédiate : la console répond mieux, les adresses IP remontent dans l’interface, et l’arrêt depuis Proxmox devient un vrai arrêt propre.
Les trois points que je retiens : le lecteur de pilotes doit pointer sur la bonne ISO, sinon toute la suite est un mirage ; vioscsi pour le disque et NetKVM pour la carte, pas l’inverse ; et une conversion après coup se fait toujours avec un instantané et un disque temporaire, jamais en changeant le bus directement.
🤖
Contenu assisté par IACet article a été rédigé avec l’assistance d’une intelligence artificielle et relu par l’auteur. Conformément à l’AI Act (UE) en vigueur depuis le 2 août 2026.
Proxmox, vous en entendez parler partout depuis quelques mois, vous savez vaguement que c’est un hyperviseur open source qui monte, mais vous n’avez jamais mis les mains dedans ? Cet article est fait pour vous. On part d’un abonnement Azure et d’un portail vide, et on va dérouler, capture après capture, jusqu’à un bureau Windows 11 qui tourne dans Proxmox VE, lui-même hébergé dans une machine virtuelle Azure.
Je suis MVP Microsoft depuis 2024, je passe mes journées dans Azure, AVD/Windows 365 ou Copilot, mais regarder ce que fait le reste du monde m’a jamais fait de mal. Azure est d’ailleurs le lab le plus rapide à monter pour ça : pas de serveur à acheter, pas de clé USB à graver, pas de machine à démonter dans le garage. Une VM, une soirée devant vous, et vous supprimez le groupe de ressources à la fin.
Il existe déjà beaucoup de vidéos YouTube qui vous montrent Proxmox :
Ce que je voulais avoir pour tester de mon côté, c’était un premier-à-pas complet sur Azure, avec les vrais pièges du réseau imbriqué et les écrans que vous allez réellement voir. C’est ce que vous trouverez ci-dessous, avec en prime les concepts Proxmox expliqués avec des mots d’admin Azure.
Windows 11 tourne dans Proxmox VE, qui tourne lui-même dans une machine virtuelle Azure.
Pour vous guider plus facilement dans cet article, voici des liens rapides :
Proxmox VE, c’est une distribution Debian sur laquelle l’éditeur autrichien Proxmox Server Solutions a posé trois choses : KVM pour les machines virtuelles complètes, LXC pour les conteneurs système, et une interface web qui pilote le tout sur le port 8006. Pas d’agent à installer sur un poste d’administration, pas de console lourde : un navigateur suffit.
Le vocabulaire est la première marche à franchir, parce qu’il ressemble à celui que vous connaissez sans vouloir dire exactement la même chose.
Le nœud est un serveur qui exécute Proxmox VE. Dans cet article, il s’appelle proxmox-ve et il n’y en a qu’un.
Le datacenter n’est pas un bâtiment, c’est le niveau logique au-dessus des nœuds. C’est là que l’on déclare les stockages, les utilisateurs, les permissions, les sauvegardes et les règles de pare-feu communes.
Le cluster réunit plusieurs nœuds qui partagent leur configuration à travers un système de fichiers répliqué, pmxcfs, monté sur /etc/pve. Sur un nœud isolé comme ici, le service tourne quand même : c’est pour ça que pve-cluster doit être actif même sans cluster.
Le stockage se déclare au niveau du datacenter, avec un type (Directory, LVM, ZFS, NFS, Ceph, et d’autres) et une liste de contenus autorisés (ISO, disques de VM, sauvegardes, modèles de conteneurs).
Le bridge, nommé vmbr0, vmbr1 et ainsi de suite, est un commutateur Linux auquel on raccorde les cartes réseau des invités.
Enfi, si vous venez du monde Microsoft, la table de correspondance suivante vous évitera de traduire mentalement à chaque écran :
Objet Proxmox
Ce que c’est
L’équivalent que vous connaissez
Datacenter
Le niveau logique qui regroupe nœuds, stockages et utilisateurs
La console de gestion, le périmètre d’administration
Nœud
Un serveur qui exécute Proxmox VE
Un hôte Hyper-V
Cluster
Plusieurs nœuds qui partagent leur configuration
Un cluster de basculement
Stockage
Un emplacement déclaré, avec des types de contenus autorisés
Un volume partagé de cluster, un partage SMB
vmbr0
Un commutateur Linux pour les cartes des invités
Un commutateur virtuel Hyper-V
QEMU / KVM
Une machine virtuelle complète, avec son BIOS ou son UEFI
Une VM Hyper-V de génération 1 ou 2
LXC
Un conteneur système qui partage le noyau de l’hôte
Un conteneur Windows en mode process
Mon retour terrain : ne cherchez pas l’équivalent d’un groupe de ressources ou d’une souscription dans Proxmox : il n’y en a pas. La séparation se fait avec les pools de ressources et les permissions, pas avec une hiérarchie de conteneurs de facturation. Au mieux, il existe différentes vues possibles
2. Pourquoi le tester sur Azure, et ce que ça implique
Pour faire tourner Proxmox, il faut un processeur qui expose ses extensions de virtualisation. Dans une VM Azure, cela s’appelle la virtualisation imbriquée, et toutes les tailles ne la proposent pas. La série que j’ai utilisée ici, la Dsv3, la prend en charge, tout comme le stockage Premium dont on a besoin pour le disque de données.
La même page documente la taille que j’ai prise, Standard_D16s_v3, avec ses 16 processeurs virtuels et ses 64 Gio de mémoire. C’est confortable, et c’est surtout ce qui permet de donner 8 Gio et 2 cœurs à une VM Windows 11 sans que la machine hôte ne s’écroule.
Pour rappel, jusqu’ici, monter un lab Proxmox voulait dire trouver une machine physique. Là, il vous faut un abonnement, une taille de VM correcte, et une heure.
Attention : cette taille n’est pas gratuite. Le portail affichait 700,80 $ par mois sur ma capture, ce qui fait à peu près 1 $ de l’heure. Arrêtez et désallouez la VM dès que vous avez fini de jouer, et supprimez le groupe de ressources quand le lab ne sert plus. La facture d’un lab oublié est le pire souvenir que l’on puisse ramener d’un article de blog.
Trois limites à connaître avant de commencer, pour ne pas les découvrir en cours de route : le réseau des invités ne pourra pas être ponté directement sur la carte Azure, il faudra passer par du NAT, on y revient en détail plus bas ; les performances resteront celles d’un hyperviseur dans un hyperviseur, donc correctes pour un lab et pas pour de la production ; et un cluster Proxmox multi-nœuds sur Azure demanderait un travail supplémentaire, la découverte du cluster reposant sur des mécanismes réseau que le cloud n’aime pas beaucoup.
3. Étape 0 : les pré-requis
Avant de continuer les étapes de cet article, assurez-vous que vous disposez bien d’une souscription Azure active.
4. Étape 1 : créer la machine virtuelle Azure
Rien d’exotique dans cet assistant, mais quatre champs méritent votre attention.
Dans Project details, créez un groupe de ressources dédié. Le mien s’appelle proxmox-rg : tout sera dedans, donc tout partira en une seule suppression.
Dans Instance details, nommez la VM proxmox-ve, choisissez votre région, laissez Security type sur Standard et prenez l’image Debian 13 « Trixie » x64 Gen1.
Dans Size, sélectionnez Standard_D16s_v3. C’est le champ le plus important de tout l’assistant.
La taille Standard_D16s_v3 et son étiquette de prix mensuelle. C’est elle qui conditionne tout le reste.
Dans Administrator account, j’ai gardé l’authentification par mot de passe avec l’utilisateur. La clé SSH reste évidemment le bon choix si vous comptez garder la machine.
Dans Public inbound ports, choisissez Allow selected ports puis SSH (22). Le portail vous prévient que la règle sera ouverte à tout Internet : on la resserrera à l’étape suivante.
L’onglet Disks est celui qui prépare le stockage des futures VM. Le disque système de 30 Gio suffit largement pour Debian et les paquets Proxmox, mais il ne suffira pas pour les disques des invités.
Laissez le disque OS à Image default (30 GiB) en Premium SSD.
Cliquez sur Create and attach a new disk et créez un disque de 1024 Gio en Premium SSD LRS. C’est lui qui deviendra local-1TB dans Proxmox.
Le disque de données de 1 To deviendra le stockage local-1TB de Proxmox.
L’onglet Networking se contente des valeurs par défaut : un réseau virtuel neuf, un sous-réseau en 172.16.0.0/24, une adresse IP publique et un groupe de sécurité réseau en mode Basic. Retenez bien le plan d’adressage du sous-réseau, il ne devra surtout pas chevaucher le réseau interne que l’on créera dans Proxmox.
Lancez la création, prenez un café, et récupérez l’adresse IP publique dans la vue d’ensemble de la VM.
5. Étape 2 : ouvrir le port 8006 dans le NSG
L’interface web de Proxmox écoute en HTTPS sur le port 8006. Comme ce port n’existe dans aucun modèle du portail, il faut ajouter la règle à la main dans le groupe de sécurité réseau de la carte.
Ouvrez la VM, puis Networking et Network settings.
Cliquez sur Create port rule puis Inbound port rule.
Source : IP Addresses, et saisissez votre adresse IP publique. Destination : Any. Port de destination : 8006. Protocole : TCP. Action : Allow. Nommez la règle, la mienne s’appelle ProxmoxControlPlane.
Profitez-en pour resserrer la règle SSH sur la même source.
Les deux seules règles entrantes qui comptent, chacune limitée à mon adresse IP publique.
Attention : n’ouvrez jamais 8006 en source Any. Vous exposeriez à Internet une console d’administration d’hyperviseur avec un formulaire de connexion root, et les robots d’analyse de ports mettent quelques minutes à la trouver. Source restreinte, ou Azure Bastion, ou rien.
Gardez l’adresse IP publique sous la main, elle apparaît dans les propriétés de la machine.
L’adresse IP publique, à saisir dans le navigateur avec le port 8006.
6. Étape 3 : vérifier la virtualisation imbriquée et préparer Debian
Connectez-vous en SSH sur l’adresse publique, avec le compte azureuser. Première chose à faire, avant même de penser à installer quoi que ce soit : vérifier que le processeur expose bien ses extensions de virtualisation et que le périphérique KVM existe.
egrep -c '(vmx|svm)' /proc/cpuinfo
ls -l /dev/kvm
La première commande doit renvoyer un nombre supérieur à zéro, 32 dans mon cas, ce qui correspond aux cœurs logiques qui exposent vmx. La seconde doit afficher le périphérique /dev/kvm. Si l’une des deux échoue, inutile d’aller plus loin : votre taille de VM ne prend pas en charge la virtualisation imbriquée, changez-la.
Le moment de vérité. Les extensions de virtualisation sont exposées et /dev/kvm est bien là.
On regarde ensuite dans quoi on met les pieds :
cat /etc/os-release
hostnamectl
ip addr
hostnamectl confirme Virtualization: microsoft, autrement dit on tourne déjà dans un hyperviseur.
Trois informations à retenir de cet écran : la distribution est bien une Debian 13 « Trixie », hostnamectl annonce Virtualization: microsoft puisque nous sommes déjà invités d’un hyperviseur, et la carte eth0 porte l’adresse privée 172.16.0.4.
Vient ensuite la manipulation la plus discrète et la plus importante de tout l’article. Par défaut, le fichier /etc/hosts d’une image Azure ne contient pas de ligne associant le nom d’hôte à l’adresse IP privée.
cat /etc/hosts
Il faut ajouter cette ligne, avec votre adresse privée et votre nom d’hôte, avant d’installer Proxmox.
echo '172.16.0.4 proxmox-ve' | sudo tee -a /etc/hosts
La ligne qui manque presque toujours et qui fait échouer l’installation.
Attention : cette étape n’est pas cosmétique. Proxmox VE résout le nom du nœud au démarrage de pve-cluster pour construire l’arborescence de /etc/pve. Si le nom d’hôte ne se résout pas vers l’adresse privée, l’installation se passe mal et l’interface web refuse de s’afficher correctement. Adaptez l’adresse et le nom à votre machine.
7. Étape 4 : installer Proxmox VE 9
On commence par mettre la Debian à niveau. Les images Azure sont propres, mais rarement à jour au jour près.
sudo apt update
sudo apt full-upgrade -y
On ajoute ensuite la clé de signature du dépôt Proxmox pour Debian 13.
Puis le dépôt lui-même. J’utilise ici pve-no-subscription, celui qui ne demande pas de clé d’abonnement.
echo "deb [signed-by=/usr/share/keyrings/proxmox-release-trixie.gpg] http://download.proxmox.com/debian/pve trixie pve-no-subscription" | sudo tee /etc/apt/sources.list.d/pve-install-repo.list
Attention : le dépôt pve-no-subscription n’est pas destiné à la production. Il reçoit les paquets avant le dépôt entreprise et sert justement aux labs et aux tests. Pour une plateforme sérieuse, prenez un abonnement Proxmox et le dépôt qui va avec.
sudo apt update
Le dépôt Proxmox répond. On peut installer.
Place à l’installation !
sudo apt install proxmox-ve
APT annonce la couleur : 603 paquets à installer, 829 Mo à télécharger, 3,6 Go d’espace disque. On valide et on laisse travailler.
603 paquets et 3,6 Go sur le disque. Proxmox VE, ce n’est pas un petit paquet.
En cours de route, deux écrans bleus de configuration de paquet vont vous interrompre. Ils méritent chacun une réponse réfléchie.
Le premier concerne /etc/default/grub, qu’Azure a modifié pour la console série. Choisissez keep the local version currently installed :
Gardez la version locale. C’est celle qu’Azure a préparée pour votre VM.
Le second demande sur quel périphérique installer GRUB. Cochez /dev/sda, le disque système, et rien d’autre.
On coche /dev/sda uniquement, surtout pas le disque de données.
Attention : ne cochez surtout pas /dev/sdc dans cet écran. C’est votre disque de données de 1 To, il n’a rien à faire dans la chaîne de démarrage.
La fin de l’installation défile ensuite toute seule, avec la génération de la configuration GRUB et la mise en place des services Proxmox.
Le noyau pve apparaît dans la liste. Bon signe.
8. Étape 5 : vérifier que les services répondent
Avant de toucher au stockage et au réseau, on vérifie que les trois services principaux sont bien démarrés. C’est aussi une bonne occasion de comprendre qui fait quoi.
pveproxy est le serveur d’API et le frontal web, celui qui écoute sur 8006.
systemctl status pveproxy --no-pager
pve-cluster porte le système de fichiers de configuration pmxcfs, monté sur /etc/pve. Même sur un nœud isolé, s’il ne tourne pas, rien ne fonctionne.
systemctl status pve-cluster --no-pager
pvedaemon exécute les tâches demandées par l’API, du démarrage d’une VM à la création d’un disque.
systemctl status pvedaemon --no-pager
Dernière vérification, l’écoute effective du port.
sudo ss -lntp | grep 8006
Le port 8006 écoute. Reste à l’ouvrir côté Azure.
Mon retour terrain : sur ma machine, pveproxy affichait un ExecStartPost en échec, lié à la mise à jour du catalogue d’abonnement. Le service tournait très bien malgré tout : c’est une conséquence normale du dépôt sans abonnement, pas un problème d’installation.
9. Étape 6 : préparer le disque de 1 To
Le disque de données attaché à l’étape 1 est là, mais il est vierge. Première commande, et surtout ne formatez rien avant de l’avoir lue.
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINTS,MODEL
sdb est le disque temporaire d’Azure. Il est déjà monté sur /mnt et il ne faut rien y stocker.
Trois disques apparaissent. sda de 30 Go porte le système, sdb de 128 Go est monté sur /mnt, et sdc de 1 To est notre disque de données, encore sans partition.
Attention :sdb est le disque temporaire d’Azure. Son contenu peut disparaître à chaque désallocation ou opération de maintenance de la plateforme. Il est tentant de l’utiliser parce qu’il est déjà monté et rapide, mais n’y placez jamais un disque de machine virtuelle. Le disque à utiliser est sdc.
On vérifie une dernière fois que sdc ne contient aucune signature de système de fichiers, puis on le partitionne.
Notez l’UUID affiché ici. C’est lui qui ira dans /etc/fstab.
Reste à créer le point de montage et à le rendre permanent. Relevez l’UUID affiché par blkid et reportez-le dans /etc/fstab, l’UUID ci-dessous est le mien.
sudo mkdir -p /mnt/pve-data
sudo blkid /dev/sdc1
echo 'UUID=111c8254-c5e6-43f1-811f-497fe6a1513c /mnt/pve-data ext4 defaults 0 2' | sudo tee -a /etc/fstab
sudo mount -a
df -h /mnt/pve-data
Attention : montez toujours par UUID, jamais par /dev/sdc1. L’ordre d’énumération des disques d’une VM Azure n’est pas garanti d’un démarrage à l’autre, et un /etc/fstab qui pointe sur le mauvais périphérique donne une machine qui ne redémarre pas.
10. Étape 7 : le réseau, la partie qui change tout sur Azure
Voilà la section pour laquelle j’ai écrit cet article. Sur un Proxmox physique, la configuration réseau par défaut crée un bridge vmbr0 qui embarque la carte physique du serveur : les VM invitées se retrouvent directement sur le réseau de l’entreprise, avec une adresse du même plan que l’hôte. Sur Azure, cela ne fonctionne pas.
La raison est simple : une carte réseau Azure est associée à une configuration IP et à une adresse MAC connues de la plateforme. Une trame émise par une VM imbriquée, avec sa propre adresse MAC et sa propre adresse IP, n’est pas routée par le réseau virtuel. La documentation Microsoft sur la virtualisation imbriquée décrit d’ailleurs le même symptôme côté Hyper-V, avec le NAT comme réponse.
La réponse côté Proxmox tient en trois briques comme on pourrait faire tourner un serveur Hyper-V sur Azure : un bridge isolé sans port physique, du NAT pour la sortie, et un service DHCP et DNS interne pour que les invités reçoivent une configuration sans intervention.
On commence par regarder comment la VM est câblée aujourd’hui.
ip -br addr
cat /etc/network/interfaces
networkctl status eth0
which ifupdown2
sudo cat /etc/netplan/50-cloud-init.yaml
eth0 est piloté par netplan et reçoit son adresse en DHCP depuis Azure.
Constat : eth0 est piloté par netplan et systemd-networkd, avec une adresse obtenue en DHCP auprès d’Azure, et /etc/network/interfaces ne contient presque rien. Proxmox, lui, s’appuie sur ifupdown2 pour appliquer les changements réseau depuis l’interface web.
Attention : on ne touche pas à eth0. C’est votre seule voie d’accès à la machine : si vous la basculez sous ifupdown2 et que la configuration est mauvaise, vous perdez le SSH et il ne reste plus que la console série du portail Azure pour réparer. On laisse netplan gérer eth0 et on se contente d’ajouter vmbr0.
On déclare donc un bridge isolé, en 10.10.10.1/24, sans aucun port attaché. Ce sera la passerelle des VM invitées.
sudo tee /etc/network/interfaces > /dev/null <<'EOF'
# network interface settings; autogenerated
auto lo
iface lo inet loopback
source /etc/network/interfaces.d/*
iface eth0 inet manual
auto vmbr0
iface vmbr0 inet static
address 10.10.10.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
EOF
Le paramètre qui compte ici est bridge-ports none : aucune carte physique n’est rattachée au commutateur. On active ensuite le bridge et le routage IPv4.
cat /etc/network/interfaces
sudo ifup vmbr0
ip -br addr show vmbr0
sudo sysctl -w net.ipv4.ip_forward=1
vmbr0 est là, en 10.10.10.1/24, sans aucun port physique attaché.
Pour que le routage survive au redémarrage, on l’écrit dans un fichier sysctl dédié, et on installe nftables.
sudo apt install -y nftables
sudo nft list ruleset
sudo tee /etc/sysctl.d/99-proxmox-nat.conf > /dev/null <<'EOF'
net.ipv4.ip_forward=1
EOF
sudo sysctl --system
Puis le cœur du sujet : la translation d’adresses. La table nat masque le réseau 10.10.10.0/24 derrière l’adresse de eth0, et la table filter n’autorise que ce qui doit l’être, à savoir les flux sortants des invités et les réponses associées.
sudo tee /etc/nftables.conf > /dev/null <<'EOF'
#!/usr/sbin/nft -f
flush ruleset
table ip nat {
chain postrouting {
type nat hook postrouting priority srcnat;
oifname "eth0" ip saddr 10.10.10.0/24 masquerade
}
}
table inet filter {
chain forward {
type filter hook forward priority filter; policy drop;
iifname "vmbr0" oifname "eth0" ip saddr 10.10.10.0/24 accept
iifname "eth0" oifname "vmbr0" ct state established,related accept
}
}
EOF
Le NAT est en place et la règle survivra au redémarrage.
Dernière brique, le service DHCP et DNS des invités. Sans lui, il faudrait configurer une adresse IP fixe dans chaque VM créée, ce qui est vite pénible.
dnsmasq distribue les adresses et relaie les requêtes DNS vers le résolveur Azure.
Deux détails de cette configuration valent une explication. bind-interfaces limite l’écoute à vmbr0, donc votre DHCP ne partira jamais polluer le sous-réseau Azure. Et l’adresse 168.63.129.16 déclarée comme serveur amont n’est pas une adresse au hasard : c’est l’adresse IP virtuelle de la plateforme Azure, celle qui rend entre autres le service de résolution de noms aux machines virtuelles.
L’adresse IP Azure 168.63.129.16 est une adresse IP publique virtuelle qui facilite les canaux de communication vers les ressources de la plateforme Azure.
Attention : choisissez pour vmbr0 un plan d’adressage qui ne chevauche pas celui de votre réseau virtuel Azure. Mon sous-réseau Azure est en 172.16.0.0/24 et mon réseau interne en 10.10.10.0/24 : aucune ambiguïté de routage possible.
11. Étape 8 : première connexion à l’interface web
Le moment de vérité. Ouvrez votre navigateur sur l’adresse publique de la VM, en HTTPS, port 8006.
https://VOTRE-IP-PUBLIQUE:8006
Le certificat est auto-signé, votre navigateur va râler, c’est normal. Connectez-vous avec l’utilisateur root, son mot de passe système, et le realm Linux PAM standard authentication.
Le realm Linux PAM. C’est bien le compte root du système que vous utilisez ici.
Attention : si vous n’avez jamais défini de mot de passe pour root sur cette machine, faites-le en SSH avec sudo passwd root avant d’essayer de vous connecter. Les images Azure livrent un compte root verrouillé.
Vous serez accueilli par la boîte de dialogue la plus célèbre de Proxmox. Elle vous rappelle simplement que vous utilisez le dépôt sans abonnement.
Le message d’accueil du dépôt sans abonnement. On clique sur OK et on continue.
Et voilà l’interface, avec l’arborescence Datacenter puis nœud à gauche, et le résumé du nœud au centre.
16 vCPU, 62,8 Gio de RAM et l’avertissement sur le dépôt de test, en jaune.
Mon retour terrain : regardez la ligne Kernel Version de ce résumé. Sur ma capture, la machine tournait encore sur le noyau cloud de Debian et pas sur le noyau pve, le redémarrage n’ayant pas encore eu lieu. Tout fonctionne quand même pour un lab, mais prévoyez un sudo reboot après l’installation pour démarrer sur le bon noyau.
12. Étape 9 : déclarer le stockage local-1TB
Le disque de 1 To est monté sur /mnt/pve-data, mais Proxmox ne le connaît pas encore. Un stockage se déclare au niveau du datacenter, pas du nœud, même quand il n’est physiquement présent que sur une seule machine.
Allez dans Datacenter, Storage, puis Add et choisissez Directory.
Renseignez l’ID local-1TB, le répertoire /mnt/pve-data, et le contenu Disk image.
Laissez Nodes sur All et cochez Enable, puis validez avec Add.
Vous vous retrouvez avec deux stockages. local, sur le disque système, garde les ISO, les sauvegardes et les modèles de conteneurs. local-1TB accueillera les disques des machines virtuelles.
Deux stockages : local pour les ISO, local-1TB pour les disques des machines virtuelles.
13. Étape 10 : voir vmbr0 dans l’interface et appliquer la configuration
Le bridge créé en ligne de commande apparaît maintenant dans l’interface, avec un avertissement en bas de page signalant des modifications en attente. Proxmox n’applique pas la configuration réseau à chaud sans votre accord, il vous montre d’abord le différentiel entre /etc/network/interfaces et le fichier .new qu’il a préparé.
Sélectionnez le nœud, puis System et Network.
Relisez le bloc Pending changes en bas de la vue, ligne par ligne.
Cliquez sur Apply Configuration.
Proxmox affiche le différentiel avant de l’appliquer. Relisez-le.
Après application, eth0 et le Linux Bridge vmbr0 en 10.10.10.1/24 cohabitent proprement.
Attention : c’est le seul moment de tout l’article où vous risquez de perdre l’accès à la machine. Relisez vraiment le différentiel avant de cliquer, et assurez-vous qu’aucune ligne ne touche à eth0.
14. Étape 11 : uploader l’ISO Windows 11
Pour installer un invité, il faut son image. Proxmox sait télécharger une ISO depuis une URL, mais pour Windows 11 vous passerez par l’upload depuis votre poste.
Dans l’arborescence, sélectionnez le stockage local du nœud, puis ISO Images.
Cliquez sur Upload, choisissez votre fichier, puis Upload à nouveau.
8,13 Gio qui transitent par votre navigateur puis par /var/tmp. Prévoyez le temps.
Attention : l’upload transite par /var/tmp sur le nœud, comme la boîte de dialogue le signale. Avec une ISO de 8,13 Gio et un disque système de 30 Gio, ça passe, mais de justesse si vous en montez plusieurs. Surveillez l’espace libre, ou déclarez un second stockage de type Directory autorisant le contenu ISO image sur votre disque de 1 To.
15. Étape 12 : créer la machine virtuelle Windows 11
Cliquez sur Create VM en haut à droite. L’assistant compte huit onglets, et trois d’entre eux conditionnent la réussite de l’installation.
Dans General, donnez un nom à la VM, le mien est vm-w11-test, et notez le VMID proposé, 101 dans mon cas. Ce numéro est l’identifiant que vous retrouverez partout : dans l’arborescence, dans les noms de fichiers de disques, dans les journaux.
Dans OS, sélectionnez l’ISO sur le stockage local, puis le type d’invité Microsoft Windows et la version 11/2022/2025. Proxmox propose de monter un second lecteur contenant les pilotes VirtIO, ce que je n’utiliserai pas pour ce premier article :
Celle que l’on garde pour ce lab : pas de second lecteur, pas de pilote à charger.
Dans System, on entre dans le dur. Windows 11 exige un démarrage UEFI, le démarrage sécurisé et un module de plateforme sécurisée.
Machine : q35, le jeu de puces moderne avec PCI Express.
BIOS : OVMF (UEFI), et cochez Add EFI Disk en le plaçant sur local-1TB.
Cochez Pre-Enroll keys pour que les clés Microsoft soient présentes dès le départ.
Cochez Add TPM, stockage local-1TB, version v2.0.
SCSI Controller : VirtIO SCSI single, la valeur par défaut, que l’on gardera même si notre disque sera en SATA.
UEFI et TPM 2.0. Les deux cases sans lesquelles l’installation de Windows 11 s’arrête.
Attention : sans OVMF (UEFI) et sans TPM 2.0, le programme d’installation de Windows 11 s’arrête sur le message « This PC can’t run Windows 11 ». Ces deux cases ne sont pas facultatives, et il est bien plus simple de les cocher maintenant que de les ajouter après coup.
Dans Disks, l’assistant propose par défaut un disque scsi0 sur le contrôleur VirtIO SCSI. Le piège classique : sans les pilotes VirtIO, le programme d’installation de Windows ne verra tout simplement aucun disque, et vous resterez bloqué sur un écran de sélection vide.
Je bascule donc le Bus/Device sur SATA, taille 64 Gio, format qcow2, stockage local-1TB :
Le même disque, mais en SATA. Windows le verra tout seul.
Les onglets CPU et Memory sont sans surprise. Un socket, deux cœurs, ce qui est le minimum demandé par Windows 11.
Et 8192 Mio de mémoire, largement supportables sur une VM hôte qui en a 64 Gio.
Dans Network, même logique que pour le disque. Le modèle VirtIO (paravirtualized) proposé par défaut est le plus performant, mais Windows n’en a pas le pilote.
Je choisis donc Intel E1000, sur le bridge vmbr0, en laissant le pare-feu coché. Windows embarque ce pilote depuis toujours, la carte sera donc opérationnelle dès le premier démarrage, et elle recevra son adresse de notre dnsmasq :
Intel E1000. Windows embarque le pilote, le réseau fonctionne dès le premier démarrage.
L’onglet Confirm récapitule le tout. Vérifiez la présence de bios: ovmf, machine: q35, ostype: win11, du disque sata0 et de net0 en e1000, puis validez.
Mon retour terrain : le choix SATA plus E1000 est un compromis de confort. Vous perdez en performances par rapport à VirtIO, ce qui est sans importance pour un lab, et vous gagnez une installation qui se déroule sans jamais chercher un pilote. Sur ma capture de l’onglet OS, le second lecteur censé porter les pilotes pointait d’ailleurs sur ma propre ISO Windows et pas sur une ISO virtio-win : aucun pilote n’était donc réellement disponible. Basculer un invité Windows en VirtIO après coup mérite son propre article, j’y reviendrai.
16. Étape 13 : installer Windows 11 jusqu’au bureau
Sélectionnez la VM 101 dans l’arborescence, ouvrez l’onglet Console et cliquez sur Start Now.
La console noVNC s’affiche dans votre navigateur, et le programme d’installation de Windows 11 démarre.
Et là, magie : le programme d’installation de Windows 11 démarre dans un onglet de navigateur.
Déroulez l’installation normalement. L’écran de sélection du disque est celui qui valide tous les choix de l’étape précédente. Le disque de 64 Go apparaît sans avoir eu à charger le moindre pilote. Le pari est gagné :
Le disque de 64 Go apparaît sans avoir eu à charger le moindre pilote.
Lancez l’installation de Windows 11 :
Attendez plusieurs minutes :
La VM redémarre plusieurs fois, puis enchaîne sur l’expérience de première ouverture de session.
La recherche de mises à jour est un excellent test réseau : si cet écran passe, c’est que votre chaîne bridge, NAT et DHCP fonctionne de bout en bout.
La VM sort sur Internet à travers le NAT nftables. La chaîne réseau fonctionne de bout en bout.
Nommez votre machine Windows 11 :
Définissez le type de compte Windows à créer :
Attendez la fin de configuration de Windows 11 :
Attendez encore la fin du téléchargement puis de l’installation des mises à jours OS :
Et au bout du compte, un bureau Windows 11 complet, qui tourne dans Proxmox VE, qui tourne dans une machine virtuelle Azure. La console fonctionne dans un simple onglet de navigateur, sans client RDP.
Trois niveaux de virtualisation empilés, et tout répond.
17. Étape 14 : activer le QEMU guest agent
Votre Windows tourne, mais Proxmox ne sait presque rien de lui. Dans l’onglet Summary de la VM, la ligne des adresses IP reste désespérément vide, et un clic sur Shutdown se contente d’envoyer un signal ACPI en espérant que l’invité l’écoute. Le QEMU guest agent règle ces deux points.
Concrètement, c’est un petit service qui tourne dans l’invité et qui dialogue avec l’hôte par un canal série virtuel dédié. Il ne remplace aucun pilote de disque ni de carte réseau : votre VM continue de démarrer sur son disque SATA et de communiquer par sa carte E1000. C’est justement ce qui le rend sans risque, et c’est pour ça que je le traite ici plutôt que dans un article dédié à VirtIO.
Ce qu’il apporte, une fois en place :
les adresses IP de l’invité remontent dans l’interface, ce qui évite d’ouvrir la console pour savoir quelle adresse dnsmasq a distribuée
l’arrêt et le redémarrage depuis Proxmox deviennent un arrêt propre demandé au système invité
les instantanés et les sauvegardes peuvent geler les écritures le temps de la copie, donc obtenir un état cohérent du système de fichiers
vous pouvez interroger l’invité depuis le shell du nœud, sans passer par le réseau
L’activation se fait en deux moitiés, et il faut les deux.
Côté Proxmox : ajouter le périphérique
Sur la capture de l’onglet System de l’étape 12, la case Qemu Agent était décochée, comme par défaut. On rattrape ça dans les options de la VM.
Sélectionnez la VM, puis Options.
Double-cliquez sur QEMU Guest Agent et cochez Use QEMU Guest Agent.
Validez.
Attention : cocher cette option ajoute un périphérique à la machine virtuelle. Un redémarrage demandé depuis Windows ne suffit pas, il faut un arrêt complet puis un démarrage depuis Proxmox pour que QEMU recrée la VM avec son canal série. C’est la raison numéro un des « j’ai installé l’agent et il ne remonte toujours rien ».
Côté Windows : installer le service
Le programme d’installation de l’agent est livré sur l’ISO virtio-win, la même que celle des pilotes. Uploadez-la dans le stockage local comme vous l’avez fait pour Windows :
Puis montez-la dans la VM avec Hardware, Add, CD/DVD Drive :
Dans Windows, ouvrez le gestionnaire des périphériques afin de mettre à jour le driver suivant :
Choisissez le dossier correspondant à l’OS de votre VM :
Attendez le succès de l’installation :
ouvrez le lecteur et lancez le paquet du dossier guest-agent, en version 64 bits. Il installe uniquement le service QEMU Guest Agent, visible ensuite dans la console des services, et ne touche ni au contrôleur de disque ni à la carte réseau :
Mon retour terrain : c’est le seul morceau de l’ISO virtio-win que j’installe dès le premier jour sur un invité Windows. Le reste, pilotes de disque et de carte réseau, demande une procédure plus prudente et fera l’objet d’un article à part, parce qu’un disque système basculé trop vite en VirtIO SCSI vous accueille au redémarrage avec un écran bleu INACCESSIBLE_BOOT_DEVICE.
Vérifier que ça marche
Retournez sur l’onglet Summary de la VM : les adresses IP de l’invité doivent maintenant s’afficher, avec l’adresse distribuée par votre dnsmasq dans la plage 10.10.10.100 à 10.10.10.200 :
Depuis le shell du nœud, deux commandes confirment le dialogue.
La première ne renvoie rien quand tout va bien, ce qui est la définition d’un bon silence :
La seconde vous rend la configuration réseau vue de l’intérieur de Windows, au format JSON :
Remplacez 101 par le VMID de votre machine.
18. Les pièges à retenir
Le piège
Le symptôme
La parade
Mauvaise taille de VM Azure
/dev/kvm absent, Proxmox ne démarre aucune VM
Prendre une taille qui prend en charge la virtualisation imbriquée, Dsv3 par exemple
Port 8006 fermé
L’interface web ne répond pas alors que le service écoute
Ajouter une règle entrante dans le NSG, limitée à votre adresse IP
Nom d’hôte non résolu
Installation bancale, interface web incomplète
Ajouter la ligne adresse privée et nom d’hôte dans /etc/hosts avant d’installer
Mauvais disque dans GRUB
Chaîne de démarrage incohérente
Cocher /dev/sda uniquement dans l’écran bleu grub-pc
Utilisation de sdb
Disques de VM perdus après une désallocation
Ne stocker que sur le disque de données, monté par UUID
Bridge sur la carte Azure
Les invités n’ont aucune connectivité
Bridge isolé avec bridge-ports none, plus NAT et dnsmasq
Plans d’adressage qui se chevauchent
Routage imprévisible entre invités et réseau Azure
Sous-réseau Azure et réseau interne dans deux plages distinctes
Disque en VirtIO SCSI
Aucun disque proposé par le programme d’installation Windows
Basculer le disque en SATA, ou charger les pilotes VirtIO
Pas de TPM ni d’UEFI
« This PC can’t run Windows 11 »
OVMF, disque EFI, Pre-Enroll keys et TPM 2.0 dès la création
Guest agent activé sans arrêt complet
L’agent est installé mais aucune adresse IP ne remonte
Arrêter puis démarrer la VM depuis Proxmox, pas un simple redémarrage Windows
Dépôt sans abonnement
Avertissement jaune et boîte de dialogue à chaque connexion
Parfait pour un lab, à remplacer par le dépôt entreprise en production
VM Azure laissée allumée
Une facture désagréable en fin de mois
Arrêter et désallouer, puis supprimer le groupe de ressources
Conclusion
Voilà, en quatorze étapes, vous avez un hyperviseur Proxmox VE 9 complet, avec son stockage dédié, son réseau interne routé, son interface web accessible, et une machine virtuelle Windows 11 qui tourne dedans, agent invité compris. Le tout sans acheter un seul serveur.
Concrètement, ça donne quoi ? Vous avez de quoi vous former sur Proxmox, tester des scénarios de migration, comparer honnêtement ce que fait la concurrence avec ce que vous connaissez déjà, et tout détruire d’un clic quand vous avez fini. Pour quelqu’un qui vit dans Azure toute la journée, c’est la façon la moins coûteuse de sortir de sa zone de confort.
Les trois points que je retiens de ce lab : la taille de la VM Azure décide de tout dès le premier écran, le réseau imbriqué se traite par du NAT et pas par du bridge, et le couple SATA plus E1000 fait gagner un temps fou sur l’installation d’un invité Windows.
Foncez tester, et n’oubliez pas de désallouer la VM en partant. Le prochain article sera consacré au passage en VirtIO d’un invité Windows déjà installé, disque et carte réseau : c’est le gain de performances évident de ce lab, mais c’est aussi la manipulation qui casse le plus de machines quand on la fait dans le mauvais ordre. On ira voir ensuite les instantanés et les sauvegardes.
🤖
Contenu assisté par IACet article a été rédigé avec l’assistance d’une intelligence artificielle et relu par l’auteur. Conformément à l’AI Act (UE) en vigueur depuis le 2 août 2026.
Vous avez peut-être déjà entendu parler de Display Protection, vous vous doutez que ça doit bloquer les captures d’écran sur AVD ou Windows 365, mais vous n’avez jamais mis les mains dedans ? Rassurez-vous, la préversion publique vient juste de sortir et cet article est fait pour vous. On part d’un host pool Azure Virtual Desktop tout ce qu’il y a de plus classique, où le Snipping Tool capture allègrement la session, et on va dérouler, capture après capture, jusqu’à un flux d’affichage chiffré que le poste local n’arrive tout simplement plus à copier.
Un mot tout de suite sur le statut : la fonctionnalité est passée maintenant en preview publique. Et pour vous guider plus facilement dans cet article, voici des liens rapides :
Display Protection est le volet Output Protection de la famille Input and Output Protection 😂. Le principe tient en une phrase : le flux d’affichage est chiffré avant même de quitter le Cloud PC ou la session host, et il n’est déchiffré que dans un chemin de rendu de confiance sur le poste local.
Quand le GPU de l’endpoint sait faire, et Microsoft précise que les GPU intégrés comme discrets sont supportés, le déchiffrement se fait directement dedans. Sinon, on retombe sur un rendu logiciel protégé. Dans les deux cas, un outil de capture qui tourne sur le poste local ne voit plus le contenu de la session : il n’a pas de quoi décoder ce qu’il intercepte.
« …protect display output […] against unauthorized screen capture and recording »
Trois caractéristiques structurantes à retenir de la documentation. D’abord, seuls les clients Windows App qui atteignent le niveau de protection exigé peuvent ouvrir une session protégée : c’est une exigence de confiance sur l’endpoint, pas un simple réglage cosmétique. Ensuite, le niveau de protection est configurable, avec une option d’exigence HDCP pour les écrans connectés. Enfin, la protection s’applique uniquement à la session distante affichée et ne change rien au comportement du Cloud PC lui-même.
Pour rappel, jusqu’ici, la seule réponse à la question « comment j’empêche un utilisateur de screenshoter sa session ? » était Screen Capture Protection, qui demande poliment à l’OS local de ne pas capturer. Display Protection change la nature du problème : le poste local n’a pas la clé.
2. Ne pas confondre : quatre features qui se ressemblent
C’est le point où tout le monde se mélange les pinceaux, y compris en avant-vente. Quatre fonctionnalités Microsoft parlent de protection de l’écran ou de la frappe, et elles ne font pas du tout la même chose.
Driver noyau et MSI Windows Cloud IO Protect installé sur l’endpoint
Windows 11 physique avec TPM 2.0
La nuance qui compte : Microsoft écrit noir sur blanc, à propos de Screen Capture Protection, que la fonctionnalité « doesn’t provide Digital Rights Management (DRM)-level protection ». Display Protection joue dans une autre catégorie, celle du chemin d’affichage protégé de bout en bout. Les deux ne s’excluent pas, elles se complètent dans une logique de défense en profondeur.
Attention : Input Protection et Display Protection sont deux composants distincts de Input and Output Protection, et ils se configurent indépendamment. Activer l’un n’active pas l’autre, et ils n’ont ni la même propriété RDP, ni les mêmes pré-requis côté endpoint.
3. Les trois niveaux de protection
Azure Virtual Desktop et Windows 365 exposent exactement les mêmes niveaux. C’est le cœur de la décision d’architecture, donc autant les avoir en tête avant de toucher au portail.
Niveau
Valeur RDP
Comportement
Not configured
0
Pas de protection d’affichage sur le Cloud PC ou la session host.
Hardware or software enforcement
1
La machine tente d’établir un canal d’affichage protégé matériel. Si la protection matérielle n’est pas disponible, elle bascule sur la protection logicielle.
Hardware enforcement required
2
Le canal protégé matériel est obligatoire. Si l’endpoint ne peut pas le fournir, la connexion est bloquée et l’utilisateur voit une erreur.
Dans ce pas-à-pas je reste sur le niveau 1, celui qui ne casse personne : si le GPU du poste ne suit pas, on dégrade vers le logiciel au lieu de refuser la connexion. Le niveau 2 mérite son propre article, avec un parc d’endpoints qualifié en amont, parce qu’il transforme chaque poste non conforme en ticket au support.
4. Les pré-requis
Élément
Exigence
Client
Windows App version 2.0.1236.0 ou plus récente, à mettre à jour depuis le Microsoft Store.
Poste local
Un appareil Windows 11 physique. Les machines virtuelles ne sont pas supportées comme endpoint.
Machine distante
Cloud PC Windows 365 ou session host Azure Virtual Desktop sur une version d’OS client Windows supportée, ou Windows Server.
Affichage
Un écran piloté par le GPU du poste, en sortie HDMI, DisplayPort ou USB-C DisplayPort Alt Mode. Résolution jusqu’à 4K (3840 x 2160).
Non supporté
Endpoints virtualisés, macOS, iOS, Android, navigateurs web, et appareils Windows 365 Link.
Ce tableau, lisez-le deux fois. La moitié des échecs de test viennent de là, en particulier la ligne « poste local » : si vous testez depuis une VM de démo, ça ne marchera jamais, quel que soit le nombre de fois où vous cliquerez sur Reconnect.
5. Étape 0 : la baseline de mon lab AVD
Avant de toucher quoi que ce soit, on documente l’état initial. C’est ce qui rendra la démonstration crédible auprès d’un RSSI, et ça évite de se demander plus tard si le comportement observé vient de la nouvelle configuration ou d’autre chose.
Depuis le poste Windows 11 physique, ouvrez Windows App et connectez-vous au host pool de test :
Dans la session distante, affichez quelque chose de reconnaissable : un document, une page, peu importe, tant que c’est identifiable sur une capture :
Sur le poste local, pas dans la session, déclenchez l’outil Capture d’écran de Windows et capturez la fenêtre de la session. Collez le résultat et constatez : tout est lisible. C’est la situation de départ :
Notez au passage la version exacte de Windows App et la configuration graphique du poste. Ces deux informations vous serviront si un comportement bizarre apparaît plus loin :
6. Étape 1 : la propriété RDP sur le host pool
Côté Azure Virtual Desktop, la configuration passe par une propriété RDP ajoutée sur le host pool. Pas de GPO, pas de clé de registre, pas d’extension à déployer sur les session hosts.
Dans le portail Azure, ouvrez le host pool cible.
Allez dans RDP properties, puis l’onglet Advanced.
Ajoutez la propriété suivante, puis enregistrez.
enableWindowsCloudIODisplayProtection:i:1
La valeur finale correspond au niveau choisi : 0 pour not configured, 1 pour hardware or software enforcement, 2 pour hardware enforcement required. Cette propriété active la vérification côté serveur que Display Protection est bien appliqué sur l’endpoint.
Attendez la sauvegarde du changement de la propriété avant de continuer :
Attention : activez la fonctionnalité uniquement sur les session hosts ou les Cloud PC que vous voulez inclure dans la validation de la preview. Microsoft le recommande explicitement, et sur un host pool de production partagé c’est la différence entre un test maîtrisé et une vague d’appels au helpdesk.
7. Étape 2 : préparer le poste client
La configuration est poussée vers l’endpoint à travers les propriétés de connexion RDP, puis mise en cache sur l’appareil. C’est ce cache qui explique la quasi-totalité des faux négatifs lors des tests.
Vérifiez la version de Windows App sur le poste et mettez-la à jour depuis le Microsoft Store si elle est inférieure à 2.0.1236.0 :
Dans Windows App, sélectionnez Refresh pour récupérer immédiatement la configuration à jour :
Fermez la session existante, ne vous contentez pas d’une reconnexion sur une session déjà ouverte.
Attention : sans le Refresh, un changement de configuration peut mettre jusqu’à 8 heures à atteindre un endpoint. Si vous testez juste après avoir enregistré la propriété RDP et que rien ne se passe, ce n’est probablement pas un bug, c’est le cache.
8. Étape 3 : le moment de vérité
Le moment de vérité. On ouvre une nouvelle session et on refait exactement le même geste qu’à l’étape 0.
Depuis le poste Windows 11 physique, ouvrez une nouvelle session sur le session host où Display Protection est activé :
Vérifiez que la connexion aboutit sans message d’erreur. C’est déjà une information : cela veut dire que l’endpoint satisfait le niveau demandé.
Pendant que la session est active, relancez l’outil de capture sur le poste local et capturez la fenêtre de session.
Et là, magie : le contenu capturé est bloqué ou apparaît vide. Le rectangle est là, l’image ne l’est pas :
Attention, l’accès à Azure Virtual Desktop via le portail Web ne supporte pas cette fonctionalité :
Mon retour terrain : Display Protection ne referme pas toutes les portes. Une copie d’écran réalisée dans la machine virtuelle protégée, combinée à l’autorisation du presse-papier entre les deux postes, vous permettra d’extraire l’information vers la machine hôte. Microsoft le dit d’ailleurs pour Screen Capture Protection : « you should also disable clipboard, drive, and printer redirection », précisément parce que désactiver la redirection empêche les utilisateurs de copier du contenu depuis la session distante. La même logique s’applique ici.
9. L’impact réel sur l’environnement
Une fonctionnalité de sécurité qui ne coûte rien, ça n’existe pas. Voilà ce qui change et ce qui ne change pas.
Ce qui ne change pas : le comportement de la machine distante. La protection porte sur la session affichée, pas sur le Cloud PC ou la session host. Les applications, les stratégies et les outils qui tournent à l’intérieur ne voient pas la différence.
Ce qui change, en revanche, mérite une checklist avant tout déploiement large :
Performance : quand la protection matérielle n’est pas disponible, la session bascule en protection logicielle, ce qui peut allonger le temps d’établissement de la session. Pour la meilleure expérience, il faut des endpoints avec un GPU compatible.
Résolution : le plafond est 4K (3840 x 2160). Au-delà, la session protégée n’est pas supportée. Les postes à triple écran haute définition sont à qualifier sérieusement.
Docks et adaptateurs : les écrans branchés via DisplayLink ou un adaptateur graphique USB ne sont pas supportés, parce qu’ils ne fournissent pas le chemin d’affichage protégé et n’ont généralement pas de support HDCP. La session protégée peut être bloquée (erreur 0x110) ou le contenu protégé peut ne pas s’afficher.
Câblage : le VGA n’a pas de HDCP, les vieilles stations d’accueil et les moniteurs non HDCP non plus. Il faut viser une sortie HDMI, DisplayPort ou USB-C DisplayPort Alt Mode pilotée par le GPU du poste.
Parc client : macOS, iOS, Android, les navigateurs web et les appareils Windows 365 Link sont hors périmètre. Si une population utilise ces clients, elle ne pourra pas ouvrir de session protégée.
Redirections : le presse-papier reste un chemin d’exfiltration, comme démontré à l’étape 3. Si le sujet est vraiment la confidentialité, la désactivation des redirections fait partie du même chantier.
Le piège classique dans un parc d’entreprise : la flotte de portables est branchée sur des docks universels USB en open space. C’est exactement la population qui va tomber sur l’erreur HDCP, et ce n’est pas une question de licence ou de stratégie, c’est du câble.
10. Bonus Windows 365 : le même réglage dans Intune
Sur Windows 365, on ne passe pas par une propriété RDP saisie à la main mais par le centre d’administration Intune.
Commencez par créer un groupe de machines Windows 365 :
Connectez-vous au centre d’administration Microsoft Intune, allez dans Devices, puis Manage Windows 365 Cloud PCs, Cloud PC Settings, puis Remote Connection Experience :
Sous IO Protection, sélectionnez le niveau voulu pour Display Protection :
Les niveaux sont strictement les mêmes que sur AVD, et le mécanisme de propagation aussi : la configuration part vers l’endpoint dans les propriétés de connexion, elle est mise en cache, et le Refresh de Windows App reste le raccourci pour ne pas attendre :
Ouvrez une session Windows 365 sur votre utilisateur de test :
Tout comme AVD, le mécanisme fonctionne très bien depuis un client compatible :
Et comme sur AVD toujours, rien ne passe depuis le navigateur internet :
11. Les codes d’erreur et comment les lire
Quand la protection ne peut pas être établie, la connexion peut être bloquée et un message apparaît sur le poste. Voici la grille de lecture.
Code
Code étendu
Signification
Causes fréquentes
0x204
0x11f5
Client incompatible
Connexion depuis iOS, macOS ou Android. Windows App antérieur à 2.0.1236. Configuration récemment activée ou modifiée et pas encore reçue par l’endpoint.
0x204
0x11f6
Stratégie non respectée
L’endpoint retombe sur la protection logicielle, absence de support GPU ou mauvaise configuration GPU, alors que la machine distante exige l’enforcement matériel.
0x110
aucun
Exigences HDCP non satisfaites
Vieilles stations d’accueil, adaptateurs USB et docks DisplayLink sans HDCP, câbles VGA, moniteurs non HDCP.
Le réflexe sur un 0x204 avec le code étendu 0x11f5 juste après avoir activé la fonctionnalité : sélectionner Refresh dans Windows App pour tirer la dernière configuration, ou attendre la propagation (jusqu’à 8 heures), puis retenter :
Voici l’erreur rencontrée lors d’une tentative de connexion depuis un poste compatible, mais dont l’ouverture de session est faite depuis Edge, non compatible à ce jour :
À noter que j’ai également rencontré cette erreur lors de la connexion à une session AVD depuis un poste Windows 365 qui ne le supportait pas. On aurait aimé un message d’erreur plus clair :
Si le code ne correspond à aucun de ceux listés par Microsoft, la marche à suivre est de contacter le support avec l’activity ID, l’horodatage de l’échec et les étapes de reproduction.
Tester sur un poste, c’est bien. Savoir ce qui se passe sur l’ensemble du tenant, c’est mieux, surtout si vous préparez un déploiement progressif.
Et autant vous le dire tout de suite, parce que c’est la première question qu’on se pose : il n’y a rien à vérifier dans l’OS. Ni sur le session host, ni sur le poste local. Pas de clé de registre d’état, pas de journal d’événements, pas de cmdlet. La négociation se fait à l’établissement de la connexion entre Windows App et la machine distante, et c’est le service qui en garde la trace. Le seul point de contrôle documenté est côté tenant.
Dans le centre d’administration Microsoft Intune, allez dans Reports, puis Cloud PC monitoring (preview).
Ouvrez l’onglet Connection health.
Utilisez le sélecteur de plage de temps et les filtres pour cibler les connexions à investiguer.
Sélectionnez View data pour déplier le volet, puis ouvrez la table Events.
Ajoutez la colonne du nom d’événement si elle n’est pas affichée, ou cherchez l’événement par son nom.
Deux événements existent, un par composant : KeyboardInputProtectionState pour l’input protection et DisplayProtectionState pour le display protection. Ils servent à confirmer si la protection a été négociée pour une connexion donnée, et à investiguer celles où elle ne s’est pas appliquée.
Conclusion
Voilà, en quatre étapes, de l’étape 0 à l’étape 3, vous êtes passé d’une session AVD que n’importe quel outil de capture pouvait aspirer à une session dont le flux d’affichage est chiffré jusqu’au GPU du poste.
Concrètement, ça donne quoi ? Une ligne de propriété RDP, une mise à jour de Windows App, et un argument de sécurité qui se démontre en deux captures d’écran devant un RSSI. Pas de nouvelle infrastructure, pas d’agent à déployer sur les session hosts.
Les cinq pièges à retenir :
Le poste doit être un Windows 11 physique avec Windows App 2.0.1236.0 ou plus récent.
La configuration est mise en cache sur l’endpoint et peut mettre jusqu’à 8 heures à se propager. Le bouton Refresh est votre ami.
Les docks DisplayLink, les adaptateurs graphiques USB, le VGA et les moniteurs non HDCP sont des générateurs d’erreur 0x110.
Sans GPU compatible, on bascule en protection logicielle, avec un temps d’établissement de session potentiellement plus long, et un plafond à 4K dans tous les cas.
Le presse-papier reste ouvert. Sans désactivation des redirections, l’information sort de la session protégée par un simple copier-coller.
Foncez tester en lab, et prenez le temps de qualifier votre parc d’écrans et de docks avant de rêver au niveau 2. C’est cette qualification, plus que la configuration elle-même, qui décidera du succès du déploiement.
Contenu assisté par IACet article a été rédigé avec l’assistance d’une intelligence artificielle et relu par l’auteur. Conformément à l’AI Act (UE) en vigueur depuis le 2 août 2026.