<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>tazmen3 &#8211; tazmenworld</title>
	<atom:link href="https://tazmenworld.com/author/tazmen3/feed/" rel="self" type="application/rss+xml" />
	<link>https://tazmenworld.com</link>
	<description>Mon site WordPress</description>
	<lastBuildDate>Wed, 21 Oct 2026 07:01:43 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>Faille GlobalProtect : corriger le VPN et rechercher une intrusion</title>
		<link>https://tazmenworld.com/2026/10/21/faille-globalprotect-corriger-vpn-rechercher-intrusion/</link>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 07:01:43 +0000</pubDate>
				<category><![CDATA[Cybersécurité]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=493</guid>

					<description><![CDATA[Face à CVE-2026-0257, Palo Alto Networks publie des correctifs et deux mesures d’atténuation. Mais sécuriser l’accès VPN ne règle pas la question d’une intrusion antérieure : Rapid7 rapporte des exploitations dès mai 2026, et Arctic Wolf documente des intrusions de juin ayant abouti au rançongiciel Qilin.]]></description>
										<content:encoded><![CDATA[<p><!-- news-it-import NIT-D572660792D7 7f0ea486e17bec7af7fcf89a7f2dd4437981913ef8c3542d4d2b359e735a1dbf --></p>
<figure class="wp-block-image size-large" style="margin:1.6em 0"><img width="1672" height="941"  alt="Louis et son lapin dans une illustration sur : Faille GlobalProtect : corriger le VPN et rechercher une intrusion" class="wp-image-494" style="display:block;width:100%;height:auto;border-radius:10px"/ loading="eager" fetchpriority="high" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/10/nit-d572660792d7-hero.webp" srcset="https://tazmenworld.com/wp-content/uploads/2026/10/nit-d572660792d7-hero.webp 1672w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-d572660792d7-hero-300x169.webp 300w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-d572660792d7-hero-1024x576.webp 1024w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-d572660792d7-hero-768x432.webp 768w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-d572660792d7-hero-1536x864.webp 1536w" sizes="(max-width: 1672px) 100vw, 1672px" /></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Face à CVE-2026-0257, Palo Alto Networks publie des correctifs et deux mesures d’atténuation. Mais sécuriser l’accès VPN ne règle pas la question d’une intrusion antérieure : Rapid7 rapporte des exploitations dès mai 2026, et Arctic Wolf documente des intrusions de juin ayant abouti au rançongiciel Qilin.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">L’exposition dépend d’abord de la configuration. CVE-2026-0257 ne touche pas automatiquement tous les pare-feu Palo Alto Networks : elle concerne certaines configurations utilisant les cookies d’Authentication Override et leurs certificats. Ces cookies interviennent dans l’authentification ; dans une configuration vulnérable, un attaquant peut fabriquer un cookie accepté et établir une connexion VPN sans passer par l’authentification normale.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Pour déterminer la réponse adaptée, il faut donc examiner à la fois les réglages des accès GlobalProtect, leur version logicielle et l’historique des connexions. Ces vérifications permettent de distinguer une configuration exposée d’un accès effectivement utilisé par un attaquant.</p>
<h2>Vérifier les portails, les passerelles et leurs certificats</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">L’avis de Palo Alto Networks répertorie des versions concernées dans les branches PAN-OS 10.2, 11.1, 11.2 et 12.1, ainsi que Prisma Access 10.2 et 11.2. Il indique que Panorama et Cloud NGFW ne sont pas concernés. Ce périmètre doit être précisé par l’examen de la version exacte et des réglages de chaque équipement.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Pour chaque portail et chaque passerelle GlobalProtect, la vérification porte sur la génération ou l’acceptation des cookies d’Authentication Override, puis sur le certificat utilisé. Rapid7 explique que réutiliser le certificat des cookies pour un service HTTPS peut rendre sa clé publique accessible et permettre la fabrication d’un cookie accepté par une configuration vulnérable. Le mécanisme décrit donne accès au VPN par contournement de l’authentification ; il ne démontre pas une exécution de code sur le pare-feu.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La version installée doit ensuite être confrontée au <a href="https://security.paloaltonetworks.com/CVE-2026-0257">tableau officiel des versions concernées et corrigées</a>. Les seuils varient selon les branches et les sous-versions : connaître seulement le numéro de branche ne permet pas de conclure que l’équipement est corrigé.</p>
<h2>Coordonner la correction ou appliquer une atténuation officielle</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Palo Alto Networks recommande d’installer une version corrigée. Dans les environnements utilisant les cookies d’Authentication Override, le constructeur précise que tous les portails et passerelles qui les génèrent ou les acceptent doivent être mis à niveau de façon coordonnée. Après cette opération, les utilisateurs doivent s’authentifier de nouveau une fois.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le constructeur documente également deux mesures d’atténuation :</p>
<ul>
<li>désactiver les cookies d’Authentication Override ;</li>
<li>utiliser pour ces cookies un certificat neuf et exclusivement réservé à cet usage.</li>
</ul>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La seconde option exige donc davantage que la sélection d’un autre certificat déjà partagé avec un service HTTPS : le caractère neuf et dédié du certificat fait partie de la mesure publiée.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">L’avis décrit aussi un réglage temporaire de compatibilité pour une mise à niveau progressive. Ce réglage rétablit un ancien comportement des cookies. Il accompagne une migration et ne doit pas être repris isolément comme une protection permanente.</p>
<h2>Rechercher les connexions réussies suspectes</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">L’examen des journaux vise à déterminer si la vulnérabilité a déjà été exploitée. Unit 42, l’équipe de recherche de Palo Alto Networks, recommande de rechercher dans les journaux GlobalProtect les connexions réussies correspondant aux adresses, identifiants d’hôte et noms d’appareil publiés dans ses indicateurs, ainsi que les événements « gateway-connected » suspects.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Lorsqu’une connexion réussie correspond à ces indicateurs, Unit 42 recommande d’engager une réponse à incident. L’investigation doit alors porter sur les conséquences possibles de l’accès obtenu, au-delà de la configuration du portail VPN.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Ces indicateurs servent au triage, c’est-à-dire à repérer les événements qui demandent une investigation. Leur liste n’étant pas exhaustive, l’absence de correspondance ne permet pas de déclarer le réseau sain. De même, l’installation du correctif ne démontre pas l’éradication d’une intrusion antérieure.</p>
<h2>De l’accès VPN au rançongiciel dans les cas étudiés</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Les observations publiées illustrent les conséquences possibles de cet accès. Rapid7 rapporte des exploitations réussies chez plusieurs clients, avec une première activité observée le 17 mai 2026. Dans ses observations de mai, l’entreprise ne décrivait toutefois pas de déplacement latéral réussi, c’est-à-dire de progression vers d’autres systèmes du réseau. Ce constat reste limité au périmètre et à la période observés par Rapid7.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Arctic Wolf a, de son côté, documenté plusieurs intrusions distinctes de juin ayant abouti au déploiement de Qilin. Ses enquêtes décrivent une collecte d’identifiants, des déplacements latéraux, un effacement de journaux et un chiffrement, ainsi qu’une exfiltration de données dans certains cas. Ces résultats concernent les incidents étudiés par Arctic Wolf ; ils ne décrivent pas l’issue de toute exploitation de la faille.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">À partir de ces enquêtes, Arctic Wolf propose de surveiller les activités observées après l’accès VPN. Ces recommandations complémentaires lui sont propres. Parmi les recommandations directement publiées par Palo Alto Networks figurent la correction ou l’atténuation de la configuration vulnérable, la recherche des connexions suspectes et la réponse à incident lorsqu’une connexion réussie correspond aux indicateurs de Unit 42. Cette sélection ne constitue pas un inventaire exhaustif des consignes officielles.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Les sources publiques consultées ne permettent pas d’établir le nombre total d’organisations compromises. Pour une organisation qui examine ses propres accès, la décision dépend de ses constats : si une connexion suspecte est identifiée, la mise à jour de GlobalProtect laisse ouverte l’investigation des actions réalisées dans le réseau.</p>
<p><!-- news-it-illustrations NIT-D572660792D7 cdfa245f9de84188bf765f840b17b9a9 --></p>
<h2>Sources</h2>
<ul>
<li><a href="https://security.paloaltonetworks.com/CVE-2026-0257">Palo Alto Networks, avis de sécurité CVE-2026-0257</a></li>
<li><a href="https://unit42.paloaltonetworks.com/?search=paloalto+github+socks">Unit 42, texte indexé du Threat Brief sur CVE-2026-0257</a></li>
<li><a href="https://www.rapid7.com/blog/post/etr-rapid7-observed-exploitation-of-pan-os-globalprotect-authentication-bypass-vulnerability-cve-2026-0257/">Rapid7, exploitation observée et analyse technique</a></li>
<li><a href="https://arcticwolf.com/resources/blog/exploitation-of-cve-2026-0257-leads-to-qilin-ransomware/">Arctic Wolf Labs, Cookie Crumbles</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ivanti Connect Secure : corriger et rechercher une compromission</title>
		<link>https://tazmenworld.com/2026/10/14/ivanti-connect-secure-correctifs-compromission/</link>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Wed, 14 Oct 2026 06:29:39 +0000</pubDate>
				<category><![CDATA[Cybersécurité]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=486</guid>

					<description><![CDATA[Une faille d’Ivanti Connect Secure permet à un attaquant distant d’exécuter des commandes sans authentification. Volexity documente son exploitation. Pour les administrateurs, la priorité est d’identifier les versions concernées, d’appliquer le correctif adapté et de rechercher une éventuelle intrusion : la mise à jour ne suffit pas à écarter une compromission antérieure.]]></description>
										<content:encoded><![CDATA[<p><!-- news-it-import NIT-FEBD34FB7D6F 78eaa91f5befc8260788bdf9b521380637c231a87072fb7f162ff64136c9baec --></p>
<figure class="wp-block-image size-large" style="margin:1.6em 0"><img width="1672" height="941"  alt="Louis et son lapin dans une illustration sur : Ivanti Connect Secure : corriger et rechercher une compromission" class="wp-image-487" style="display:block;width:100%;height:auto;border-radius:10px"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/10/nit-febd34fb7d6f-hero.webp" srcset="https://tazmenworld.com/wp-content/uploads/2026/10/nit-febd34fb7d6f-hero.webp 1672w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-febd34fb7d6f-hero-300x169.webp 300w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-febd34fb7d6f-hero-1024x576.webp 1024w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-febd34fb7d6f-hero-768x432.webp 768w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-febd34fb7d6f-hero-1536x864.webp 1536w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Une faille d’Ivanti Connect Secure permet à un attaquant distant d’exécuter des commandes sans authentification. Volexity documente son exploitation. Pour les administrateurs, la priorité est d’identifier les versions concernées, d’appliquer le correctif adapté et de rechercher une éventuelle intrusion : la mise à jour ne suffit pas à écarter une compromission antérieure.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Sur une passerelle d’accès distant comme Connect Secure, la correction et l’examen d’une intrusion répondent à deux questions distinctes. La première porte sur la vulnérabilité du système ; le second cherche à établir ce qu’un attaquant a pu y faire avant l’installation du correctif. Rapid7 recommande donc de rechercher une compromission même après la mise à jour.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La fiche CVE publiée sous l’autorité d’attribution d’Ivanti décrit CVE-2026-104935 comme un contournement d’authentification par usurpation permettant l’exécution de commandes arbitraires. Elle indique une attaque réseau de faible complexité, sans privilège initial ni interaction de l’utilisateur, avec un score CVSS 3.1 de 8,6.</p>
<h2>Identifier précisément les branches déployées</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La première vérification consiste à relever le numéro complet de version de chaque appliance. Les seuils dépendent de la branche et de sa révision : un numéro abrégé ne permet pas de déterminer correctement l’exposition.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Rapid7 et le Center for Internet Security indiquent les seuils affectés et les versions corrigées suivants :</p>
<figure class="wp-block-table news-it-table" style="margin:1.5em 0;overflow-x:auto;border:1px solid #dbe5e9;border-radius:10px;background:#ffffff">
<table style="width:100%;min-width:780px;table-layout:fixed;border-collapse:separate;border-spacing:0;font-size:14px;line-height:1.5">
<thead>
<tr>
<th style="padding:15px 10px;background:#233b49;color:#ffffff;font-weight:600;vertical-align:middle;border:0;box-sizing:border-box;font-weight:600;text-align:left">Branche</th>
<th style="padding:15px 10px;background:#233b49;color:#ffffff;font-weight:600;vertical-align:middle;border:0;box-sizing:border-box">Versions concernées</th>
<th style="padding:15px 10px;background:#233b49;color:#ffffff;font-weight:600;vertical-align:middle;border:0;box-sizing:border-box">Versions corrigées indiquées</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:nowrap;text-align:right;font-weight:600;text-align:left">25.1.1</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:nowrap;text-align:right">25.1.1.1 et antérieures dans cette branche</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:nowrap;text-align:right">25.1.1.2</td>
</tr>
<tr>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:nowrap;text-align:right;font-weight:600;text-align:left">25.1.2</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:nowrap;text-align:right">25.1.2.2 et antérieures dans cette branche</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:nowrap;text-align:right">25.1.3.0 ou 25.1.3.1</td>
</tr>
<tr>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:nowrap;text-align:right;font-weight:600;text-align:left">22.8R2</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:nowrap;text-align:right">22.8R2.4 et antérieures dans cette branche</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:nowrap;text-align:right">22.8R2.5</td>
</tr>
</tbody>
</table>
</figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Les trois versions limites figurant dans ce tableau sont donc concernées selon ces sources. L’alerte du NHS England emploie une formulation « prior to » qui semble les exclure. Cette divergence justifie de confirmer la matrice de mise à niveau auprès d’Ivanti avant l’intervention, sans considérer ces versions limites comme épargnées.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La fiche CVE précise que 22.7R2.14 et les versions antérieures ne sont pas touchées par cette CVE particulière. Cette exclusion ne renseigne pas leur exposition à d’autres vulnérabilités et ne constitue pas une appréciation générale de leur sécurité.</p>
<h2>Distinguer le correctif de la chaîne complète d’attaque</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le tableau permet d’identifier la mise à jour à examiner. La procédure applicable, les éventuelles mesures d’atténuation et les consignes de récupération restent à confirmer auprès d’Ivanti.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Il faut aussi distinguer CVE-2026-104935 de la chaîne complète décrite par Volexity. Dans son enquête, l’entreprise rapporte un routage abusif de requêtes vers un composant CGI protégé, suivi d’une exécution de code et d’une élévation de privilèges distincte. Cette dernière étape a permis d’exécuter des commandes avec les privilèges root sur une appliance 22.8R2.4 alors à jour. Ces privilèges correspondent au niveau de contrôle obtenu sur le système dans ce cas précis.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Dans leurs publications du 13 octobre 2026, Volexity et Rapid7 indiquaient que le correctif de cette élévation de privilèges distincte restait à venir. Les mises à jour visant CVE-2026-104935 ne doivent donc pas être présentées comme corrigeant toute la chaîne. La disponibilité ultérieure d’un correctif pour cette autre faille reste à vérifier auprès du fournisseur.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">L’inscription au catalogue des vulnérabilités exploitées connues de CISA, le KEV, renforce la priorité donnée à cette alerte. Selon Rapid7 et la reprise des données du catalogue par CIRCL, CVE-2026-104935 y a été ajoutée le 13 octobre 2026, avec une échéance au 16 octobre pour les entités soumises aux exigences fédérales américaines applicables. Cette échéance n’est pas une date limite réglementaire universelle.</p>
<h2>Rechercher les signes d’entrée et les actions qui ont suivi</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Volexity situe au plus tard au 3 octobre 2026 le début de l’exploitation répétée reconstituée dans son enquête. Sur l’appliance étudiée, l’entreprise décrit notamment des recherches de secrets Active Directory, une exfiltration de données et une altération des journaux. Ces observations orientent l’examen d’un système suspect, sans établir que toutes les appliances vulnérables ont subi les mêmes actions.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Pour rechercher des traces, Volexity recommande notamment de surveiller les requêtes anormalement nombreuses vers la page de connexion concernée, les incohérences entre le chemin demandé et l’en-tête de routage, ainsi que l’activité après exploitation. L’entreprise prévient que d’autres chemins pourraient être employés : limiter l’examen au seul parcours observé risquerait de laisser de côté une autre forme d’exploitation.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">L’examen doit ainsi porter sur les signes d’entrée comme sur les actions qui ont pu suivre. Lorsque l’exploitation est suspectée, Rapid7 renvoie aux procédures de récupération du fournisseur. Leurs étapes restent à obtenir auprès d’Ivanti ; le récit de l’attaque ne permet pas de les reconstituer.</p>
<h2>Pourquoi le contrôle d’intégrité peut manquer une compromission</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Selon Volexity, l’Integrity Checker Tool recherche des modifications de fichiers sur disque. Or la chaîne observée modifiait notamment du code en mémoire puis restaurait certaines données. Un contrôle centré sur l’état des fichiers peut ainsi manquer des traces de cette activité. Une absence d’alerte de l’outil ne suffit donc pas à écarter une compromission.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La capture publiée par Volexity provient de son enquête et de son outil commercial d’analyse mémoire Volcano. Elle montre des alertes dans le cas étudié, notamment liées à une activité de capture réseau. Elle illustre le type de traces que l’analyse mémoire peut apporter en complément de l’examen des fichiers, sans mesurer l’efficacité générale de cette détection ni représenter toutes les exploitations.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Dans le suivi de l’incident, il faut donc conserver séparément la version identifiée, la correction appliquée et le résultat de la recherche de compromission. Un résultat normal du contrôle d’intégrité ne doit pas clore à lui seul ce dernier volet. Si des indices subsistent, les consignes de récupération du fournisseur restent la référence à consulter.</p>
<p><!-- news-it-illustrations NIT-FEBD34FB7D6F af829b3f3fdd468ca72c270cae54abbc --></p>
<h2>Sources</h2>
<ul>
<li><a href="https://www.cve.org/CVERecord?id=CVE-2026-104935">CVE Program, fiche CVE-2026-104935, autorité d’attribution Ivanti</a></li>
<li><a href="https://www.volexity.com/blog/2026/10/13/a-series-of-unauthenticated-events-chained-exploitation-of-ivanti-connect-secure-zero-days/">Volexity, A Series of Unauthenticated Events: Chained Exploitation of Ivanti Connect Secure Zero-Days</a></li>
<li><a href="https://www.rapid7.com/blog/post/etr-ivanti-connect-secure-zero-day-exploited-in-the-wild-cve-2026-104935/">Rapid7, Ivanti Connect Secure zero-day exploited in the wild</a></li>
<li><a href="https://www.cisecurity.org/advisory/a-vulnerability-in-ivanti-connect-secure-could-allow-for-arbitrary-code-execution_2026-115">Center for Internet Security, A Vulnerability in Ivanti Connect Secure Could Allow for Arbitrary Code Execution</a></li>
<li><a href="https://cve.circl.lu/known-exploited-vulnerabilities-catalog/1de65794-4de9-442e-9a39-299bf381cadf">CIRCL Vulnerability-Lookup, reprise de l’entrée CISA KEV pour CVE-2026-104935</a></li>
<li><a href="https://digital.nhs.uk/cyber-alerts/2026/cc-4866">NHS England Digital, Ivanti Releases Security Updates for Connect Secure</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Des compétences cachées aux instructions malveillantes : le prochain risque des CV analysés par l’IA ?</title>
		<link>https://tazmenworld.com/2026/10/12/cv-ia-contenus-caches-injection-prompt/</link>
					<comments>https://tazmenworld.com/2026/10/12/cv-ia-contenus-caches-injection-prompt/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Mon, 12 Oct 2026 14:08:10 +0000</pubDate>
				<category><![CDATA[Cybersécurité]]></category>
		<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=482</guid>

					<description><![CDATA[Des compétences cachées peuvent déjà modifier les informations qu’un logiciel lit dans un CV. Avec les agents IA de recrutement, la question s’étend aux instructions que ces documents pourraient contenir et aux actions qu’elles pourraient provoquer. Les recherches et les essais en lab permettent de distinguer la manipulation d’une évaluation d’un éventuel détournement des accès internes.]]></description>
										<content:encoded><![CDATA[<p><!-- news-it-import NIT-BAAD3F9C587E d03665606a52d5ca187861cdc7126f23fc4f1e6710bd3a43316ec95b564b7801 --></p>
<figure class="wp-block-image size-full" style="margin:1.6em 0"><img alt="Louis et son lapin à cape rouge examinent un CV et une couche révélant du contenu caché lu par une IA." class="wp-image-478" height="941"  style="display:block;width:100%;height:auto;border-radius:10px" width="1672"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/10/cv-prompt-injection-couverture.webp" srcset="https://tazmenworld.com/wp-content/uploads/2026/10/cv-prompt-injection-couverture.webp 1672w, https://tazmenworld.com/wp-content/uploads/2026/10/cv-prompt-injection-couverture-300x169.webp 300w, https://tazmenworld.com/wp-content/uploads/2026/10/cv-prompt-injection-couverture-1024x576.webp 1024w, https://tazmenworld.com/wp-content/uploads/2026/10/cv-prompt-injection-couverture-768x432.webp 768w, https://tazmenworld.com/wp-content/uploads/2026/10/cv-prompt-injection-couverture-1536x864.webp 1536w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Si un CV reste en apparence un document classique, avec ses expériences, ses compétences et ses diplômes, ce que le recruteur voit à l’écran ne correspond pas toujours à ce que son logiciel lit. Certains documents contiennent des informations presque imperceptibles pour un humain, mais accessibles à l’extraction automatique. Des compétences supplémentaires peuvent ainsi être prises en compte par le logiciel sans apparaître dans la présentation lue par le recruteur.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto"><strong>Fait vérifié.</strong> Présentée à USENIX Security 2026, une étude de Mohan Zhang et ses coauteurs porte sur <strong>196 682 CV</strong> et rapporte <strong>2 030 détections</strong> de contenus cachés classés comme injections, soit environ <strong>1 %</strong>. Plus de <strong>90 %</strong> des contenus repérés sont des ajouts de données sans instruction explicite, notamment des compétences et des expériences. Ces chiffres ne mesurent ni des recrutements obtenus frauduleusement ni des intrusions informatiques. <a href="https://www.usenix.org/conference/usenixsecurity26/presentation/zhang-mohan">étude USENIX sur les CV</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le point de départ est donc une manipulation de l’information soumise au traitement automatique. Une compétence supplémentaire peut rendre un profil plus pertinent pour un moteur de recherche ou un dispositif de classement, sans jamais commander au logiciel de changer de comportement.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Mais une autre question apparaît : <strong>un CV pourrait-il aussi donner des instructions à l’IA chargée de l’évaluer, puis tenter de détourner les outils auxquels elle a accès ?</strong> Cette hypothèse mérite un examen précis. Elle dépend du chemin suivi par les données, du comportement du modèle et des permissions effectives de l’application.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Pour les directions informatiques, les responsables de sécurité et les équipes RH, l’enjeu consiste à comprendre où se situe cette frontière. Un document reçu de l’extérieur doit pouvoir être analysé sans devenir une autorité sur le fonctionnement du système. Les études disponibles permettent déjà d’examiner la manipulation des évaluations. Une éventuelle chaîne reliant candidature, agent et accès internes exige, elle, des preuves supplémentaires.</p>
<h2>Le CV, un support de confiance déjà exploité</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Les recruteurs ont une particularité opérationnelle : leur travail les oblige à ouvrir des documents et à consulter des liens transmis par des personnes qu’ils ne connaissent pas. Une candidature constitue une raison légitime d’engager cette interaction. Ce contexte donne aux attaquants un prétexte crédible, sans rendre chaque document suspect par nature.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto"><strong>Faits historiques.</strong> En 2017, Check Point a décrit des failles permettant de transférer des fichiers malveillants par la messagerie LinkedIn sous une apparence acceptable. LinkedIn avait déployé un correctif le <strong>24 juin 2017</strong>, avant la publication du rapport. Il s’agissait de sécurité des fichiers et d’exécution de code, pas d’injection de prompt. <a href="https://research.checkpoint.com/2017/is-malware-hiding-in-your-resume-vulnerability-in-linkedin-messenger-would-have-allowed-malicious-file-transfer/">rapport Check Point de 2017</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">En décembre 2023, Proofpoint a documenté des campagnes de <strong>TA4557</strong> visant les recruteurs. Des échanges avec de faux candidats les conduisaient vers des sites imitant des CV, puis vers une chaîne d’infection liée à More_eggs. Certains documents servaient à orienter la victime vers le site ; cela ne signifie pas que chaque PDF constituait lui-même un malware. <a href="https://www.proofpoint.com/uk/blog/threat-insight/security-brief-ta4557-targets-recruiters-directly-email">recherche Proofpoint sur TA4557</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Aryaka décrit également, dans son rapport <strong>BlackSanta</strong>, une campagne utilisant des liens vers des fichiers présentés comme des CV pour cibler les processus de recrutement. Cette source de recherche d’éditeur concerne encore une infection classique, distincte du détournement d’un modèle de langage. <a href="https://www.aryaka.com/reports-and-guides/blacksanta-edr-killer-threat-report/">rapport BlackSanta d’Aryaka</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le rapprochement avec les agents IA porte sur le point d’entrée : du contenu extérieur arrive au cœur d’une activité légitime. Le mécanisme change ensuite. Un logiciel malveillant cherche une exécution informatique ; une injection de prompt cherche à faire interpréter un texte comme une consigne. Une entreprise peut donc avoir correctement sécurisé l’ouverture des pièces jointes tout en conservant un risque dans leur traitement sémantique.</p>
<h2>Extraction, classement et agent : trois niveaux à distinguer</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Parler de « recrutement par l’IA » sans préciser l’architecture entretient la confusion. Un premier traitement peut simplement convertir un document en texte et remplir des champs : poste occupé, durée d’expérience, diplôme, compétences déclarées. Un autre peut rapprocher ces champs d’une fiche de poste. Un troisième peut produire une synthèse ou une note. Enfin, un agent peut sélectionner des actions et solliciter des outils.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Ces opérations ont des surfaces de risque différentes. Une liste cachée de compétences peut contaminer une extraction, y compris sans modèle génératif. Une instruction destinée à modifier une justification suppose qu’un composant interprète ce texte et lui accorde une influence indue. Un appel à un dossier interne suppose encore une capacité d’action et des permissions correspondantes.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto"><strong>Connectivité documentée.</strong> La documentation <strong>Apply Connect</strong> de LinkedIn décrit une intégration permettant aux partenaires de recevoir des candidatures directement dans leur ATS, c’est-à-dire leur système de suivi des candidatures. Elle établit un flux métier ; elle ne décrit pas une attaque. <a href="https://learn.microsoft.com/en-us/linkedin/talent/apply-connect/apply-connect-overview">documentation Apply Connect</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Bullhorn documentait dès 2020 une intégration <strong>Recruiter System Connect</strong> entre LinkedIn et ses solutions fondées sur Salesforce. Les fonctions de synchronisation et de consultation doivent être comprises dans leur périmètre propre. Elles ne démontrent pas le transfert systématique d’un PDF brut à un agent. <a href="https://www.bullhorn.com/customer-blog/bullhorn-salesforce-integration-linkedin/">intégration LinkedIn et Bullhorn</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La fiche <strong>Bullhorn Amplify for Salesforce</strong> annonce des fonctions de matching et de screening. Une présentation officielle de Bullhorn décrit aussi des agents configurables fondés sur <strong>Agentforce</strong> dans Recruitment Cloud. Ces documents commerciaux attestent des capacités proposées, sans révéler les permissions de chaque installation ni prouver une vulnérabilité. <a href="https://appexchange.salesforce.com/appxListingDetail?listingId=229136db-206f-4201-8c53-bc3d37c9fdfa">fiche Bullhorn Amplify</a>, <a href="https://www.bullhorn.com/customer-blog/meet-bullhorn-amplify-for-recruitment-cloud/">présentation officielle de Bullhorn</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">L’audit utile commence donc par une cartographie concrète. Quel composant extrait le texte ? Quelles transformations suivent ? Le modèle reçoit-il le document entier ou quelques champs ? Peut-il seulement proposer une réponse, ou aussi consulter des informations et modifier un statut ? Qui autorise ces opérations ? Les réponses comptent davantage qu’une étiquette « IA » dans une brochure.</p>
<h2>Ce que les recherches établissent réellement</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto"><strong>Observation sur des documents réels.</strong> Le PDF final de l’étude USENIX identifie <strong>hireEZ</strong> comme origine des données. Les auteurs réunissent deux jeux de CV désidentifiés et utilisent un détecteur spécialisé pour repérer des éléments cachés. Leur définition large comprend les ajouts de données et les instructions explicites. <a href="https://www.usenix.org/system/files/usenixsecurity26-zhang-mohan.pdf">texte intégral de l’étude USENIX</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le détail temporel impose une nuance : les taux connaissent un pic en 2024, puis baissent dans les observations récentes. Dans le jeu Applicant Match, les auteurs estiment néanmoins une augmentation du nombre absolu de documents concernés, liée au volume de candidatures. Dire simplement que « les attaques augmentent » effacerait la différence entre fréquence et quantité. Le rappel exact du détecteur sur l’ensemble du corpus demeure inconnu ; aucune efficacité sur les décisions finales n’est mesurée. <a href="https://www.usenix.org/system/files/usenixsecurity26-zhang-mohan.pdf">texte intégral de l’étude USENIX</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto"><strong>Expérience sur le filtrage.</strong> Honglin Mu et ses coauteurs évaluent différentes manipulations dans un benchmark de sélection de CV. La version révisée du <strong>26 avril 2026</strong> rapporte des taux dépassant <strong>80 % pour certaines catégories</strong>, dans ses conditions expérimentales. Le tableau consacré aux méthodes attribue notamment <strong>80,89 %</strong> à la catégorie « Job Manipulation » sans défense ; ce taux ne résume pas toutes les attaques et ne mesure aucun accès à un système interne. <a href="https://arxiv.org/abs/2512.20164">étude de Mu et ses coauteurs</a>, <a href="https://arxiv.org/html/2512.20164v2">benchmark et résultats détaillés</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Cette étude signale aussi un compromis : les protections évaluées peuvent réduire la manipulation tout en augmentant les rejets de candidatures légitimes. Une défense RH doit donc être évaluée pour sa sécurité et pour ses effets sur les personnes, au lieu de retenir uniquement un taux de blocage. <a href="https://arxiv.org/html/2512.20164v2">benchmark et résultats détaillés</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto"><strong>Expérience sur le classement.</strong> Preet Baxi et ses coauteurs observent que les manipulations sont plus efficaces lorsque les profils ont une qualité similaire et que peu de candidats les utilisent. L’avantage diminue lorsque la manipulation se généralise. Leur étude porte sur les positions dans un classement, pas sur une fuite de données. <a href="https://aclanthology.org/2026.findings-acl.142/">étude de Baxi et ses coauteurs</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto"><strong>Expérience sur la détection.</strong> RAPIDS, présenté par Yohann Augey et ses coauteurs, combine un petit modèle spécialisé et une vérification supplémentaire. Les auteurs annoncent un rappel de bout en bout d’au moins <strong>98 % sur les deux jeux évalués</strong>, avec une latence réduite d’un facteur <strong>21 à 24</strong> par rapport à leur référence. Le texte précise toutefois une couverture limitée aux CV anglophones et un jeu réel annoté de <strong>1 945 documents</strong>. <a href="https://aclanthology.org/2026.acl-industry.127/">publication RAPIDS</a>, <a href="https://aclanthology.org/2026.acl-industry.127.pdf">méthode et limites de RAPIDS</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Ces travaux mesurent des contenus, des classements ou une capacité de détection. Établir une compromission d’entreprise demanderait encore des preuves d’actions effectives et de franchissement des contrôles d’accès.</p>
<h2>Trois mécanismes, trois réponses</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Une <strong>injection de données</strong> ajoute de l’information destinée au traitement automatique. Dans un exemple entièrement fictif, le CV visible mentionne une expérience de support informatique ; le texte extrait contient aussi des compétences absentes de la présentation. Le problème porte sur la fidélité de la représentation et sur la confiance accordée à des qualifications déclarées.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Une <strong>injection d’instructions</strong> cherche à orienter l’évaluateur. Elle peut tenter de modifier le commentaire ou de faire abandonner une règle de classement. La question devient celle de l’autorité : le contenu d’une candidature ne doit pas définir la procédure utilisée pour l’examiner. Une telle instruction peut être visible ; son invisibilité facilite certaines manipulations, mais ne constitue pas une condition nécessaire.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Un <strong>malware</strong> vise une exécution ou une compromission technique selon une autre chaîne. Le document, le téléchargement ou le lien peut servir d’amorce. Confondre ces mécanismes conduirait à choisir une défense adaptée à un problème différent de celui rencontré.</p>
<figure class="wp-block-table news-it-table" style="margin:1.5em 0;overflow-x:auto;border:1px solid #dbe5e9;border-radius:10px;background:#ffffff">
<table style="width:100%;min-width:600px;table-layout:fixed;border-collapse:separate;border-spacing:0;font-size:14px;line-height:1.5">
<thead>
<tr>
<th style="padding:15px 10px;background:#233b49;color:#ffffff;font-weight:600;vertical-align:middle;border:0;box-sizing:border-box;font-weight:600;text-align:left;overflow-wrap:break-word;text-align:left;width:26%">Mécanisme</th>
<th style="padding:15px 10px;background:#233b49;color:#ffffff;font-weight:600;vertical-align:middle;border:0;box-sizing:border-box;overflow-wrap:break-word;text-align:left;width:32%">Frontière concernée</th>
<th style="padding:15px 10px;background:#233b49;color:#ffffff;font-weight:600;vertical-align:middle;border:0;box-sizing:border-box;overflow-wrap:break-word;text-align:left;width:42%">Contrôle à examiner</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:normal;text-align:left;font-weight:600;text-align:left;overflow-wrap:break-word">Données cachées</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:normal;text-align:left;overflow-wrap:break-word">Affichage humain et représentation extraite</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:normal;text-align:left;overflow-wrap:break-word">Comparaison des vues, provenance des champs</td>
</tr>
<tr>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:normal;text-align:left;font-weight:600;text-align:left;overflow-wrap:break-word">Instructions dans le CV</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:normal;text-align:left;overflow-wrap:break-word">Donnée extérieure et consigne de traitement</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:normal;text-align:left;overflow-wrap:break-word">Détection, séparation des rôles, validation des sorties</td>
</tr>
<tr>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:normal;text-align:left;font-weight:600;text-align:left;overflow-wrap:break-word">Malware associé à une candidature</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:normal;text-align:left;overflow-wrap:break-word">Document reçu et exécution informatique</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:normal;text-align:left;overflow-wrap:break-word">Sécurité des fichiers et des postes</td>
</tr>
<tr>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:normal;text-align:left;font-weight:600;text-align:left;overflow-wrap:break-word">Détournement d’un agent</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:normal;text-align:left;overflow-wrap:break-word">Suggestion du modèle et permission effective</td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:normal;text-align:left;overflow-wrap:break-word">Autorisation indépendante des appels d’outils</td>
</tr>
</tbody>
</table>
</figure>
<h2>Du CV à l’outil interne : une hypothèse conditionnelle</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto"><strong>Hypothèse, non chaîne démontrée.</strong> Imaginons qu’un CV conserve une instruction après extraction, que cette instruction arrive dans le contexte d’un agent et que celui-ci la traite comme légitime. Il pourrait alors proposer une action étrangère à l’évaluation. Pour que cette proposition produise un effet, un outil doit exister, être accessible et accepter l’appel.</p>
<figure class="wp-block-image size-full" style="margin:1.6em 0;max-width:580px;margin-left:auto;margin-right:auto"><a href="https://tazmenworld.com/wp-content/uploads/2026/10/cv-agent-autorisations.webp"><img alt="Un CV extérieur passe par l’extraction, l’ATS et un éventuel agent IA. Une autorisation indépendante permet une action justifiée ou bloque et journalise une action injustifiée." class="wp-image-480" height="2024"  style="display:block;width:100%;height:auto;border-radius:10px" width="1164"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/10/cv-agent-autorisations.webp" srcset="https://tazmenworld.com/wp-content/uploads/2026/10/cv-agent-autorisations.webp 1164w, https://tazmenworld.com/wp-content/uploads/2026/10/cv-agent-autorisations-173x300.webp 173w, https://tazmenworld.com/wp-content/uploads/2026/10/cv-agent-autorisations-589x1024.webp 589w, https://tazmenworld.com/wp-content/uploads/2026/10/cv-agent-autorisations-768x1335.webp 768w, https://tazmenworld.com/wp-content/uploads/2026/10/cv-agent-autorisations-883x1536.webp 883w" sizes="auto, (max-width: 1164px) 100vw, 1164px" /></a><figcaption style="font-size:0.9em;line-height:1.5;margin-top:0.75em">Schéma conceptuel d’une architecture possible. Il ne représente pas une vulnérabilité établie de LinkedIn, Bullhorn ou Salesforce.</figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Chaque flèche correspond à une condition à vérifier. Une extraction peut retirer le passage suspect. Une représentation structurée peut réduire sa portée, tout en conservant des données trompeuses. Le modèle peut ignorer la sollicitation. Une règle applicative peut refuser l’action. L’absence d’une seule capacité peut interrompre le scénario envisagé.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto"><strong>Précédents indépendants.</strong> ForcedLeak, publié par Noma Security en septembre 2025, concernait une injection indirecte via des données <strong>Web-to-Lead</strong> dans Salesforce Agentforce. Les chercheurs décrivaient un risque de fuite de données CRM et des mesures correctives de Salesforce, notamment sur les destinations de sortie autorisées. L’entrée étudiée était un formulaire commercial, pas un CV. <a href="https://noma.security/blog/forcedleak-agent-risks-exposed-in-salesforce-agentforce">recherche ForcedLeak de Noma</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">EchoLeak, associé à <strong>CVE-2025-32711</strong>, concernait Microsoft 365 Copilot et un e-mail préparé pour provoquer une fuite dans les conditions de la démonstration. L’analyse publiée rapporte une correction côté service. Ce précédent ne démontre aucune attaque par candidature, ni une exploitation observée chez des recruteurs. <a href="https://arxiv.org/abs/2509.10540">étude de cas EchoLeak</a>, <a href="https://arxiv.org/html/2509.10540v1">analyse et chronologie d’EchoLeak</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Ces cas montrent pourquoi les contrôles doivent porter sur l’ensemble de l’application. Le modèle n’a pas besoin d’obtenir de nouveaux privilèges si l’application lui en accorde déjà trop pour la tâche. À l’inverse, une réponse dévoyée peut rester sans effet opérationnel lorsque les capacités sont étroitement limitées.</p>
<h3>Ce que je sais / Ce que je suppose / Ce que j’ai observé en lab</h3>
<figure class="wp-block-table news-it-table" style="margin:1.5em 0;overflow-x:auto;border:1px solid #dbe5e9;border-radius:10px;background:#ffffff">
<table style="width:100%;min-width:520px;table-layout:fixed;border-collapse:separate;border-spacing:0;font-size:14px;line-height:1.5">
<thead>
<tr>
<th style="padding:15px 10px;background:#233b49;color:#ffffff;font-weight:600;vertical-align:middle;border:0;box-sizing:border-box;font-weight:600;text-align:left;overflow-wrap:break-word;text-align:left;width:25%">Statut</th>
<th style="padding:15px 10px;background:#233b49;color:#ffffff;font-weight:600;vertical-align:middle;border:0;box-sizing:border-box;overflow-wrap:break-word;text-align:left;width:75%">Proposition</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:normal;text-align:left;font-weight:600;text-align:left;overflow-wrap:break-word"><strong>Je sais</strong></td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:normal;text-align:left;overflow-wrap:break-word">Des CV réels contiennent des ajouts cachés ; des expériences montrent des manipulations d’évaluation ; des injections indirectes ont affecté d’autres assistants d’entreprise.</td>
</tr>
<tr>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:normal;text-align:left;font-weight:600;text-align:left;overflow-wrap:break-word"><strong>Je suppose</strong></td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:normal;text-align:left;overflow-wrap:break-word">Une candidature pourrait détourner un agent RH dans une architecture réunissant conservation du texte, confusion d’autorité et permissions suffisantes.</td>
</tr>
<tr>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:normal;text-align:left;font-weight:600;text-align:left;overflow-wrap:break-word"><strong>J’ai observé en lab</strong></td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#ffffff;white-space:normal;text-align:left;overflow-wrap:break-word">Des notes plus élevées avec les compétences cachées, des commentaires influencés et des propositions de consultation fictive. Les consignes renforcées ont réduit certains effets.</td>
</tr>
<tr>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:normal;text-align:left;font-weight:600;text-align:left;overflow-wrap:break-word"><strong>Limite du test</strong></td>
<td style="padding:15px 10px;vertical-align:top;border:0;border-bottom:1px solid #dbe5e9;background:#f1f6f8;white-space:normal;text-align:left;overflow-wrap:break-word">Les outils sont simulés par des propositions structurées ; aucun accès interne ni aucune exfiltration n’a été testé.</td>
</tr>
</tbody>
</table>
</figure>
<h2>En lab, le CV visible ne change pas, mais sa note augmente</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Pour observer ces mécanismes, j’ai évalué en lab quatre profils entièrement fictifs. Le profil B possède un an d’expérience en support bureautique. Ses variantes ajoutent soit des compétences cachées, soit une instruction neutre concernant le commentaire, soit une sollicitation de consultation fictive. Les quatre versions produisent exactement la même image avec le moteur de rendu utilisé ; leurs extractions textuelles diffèrent.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La campagne du <strong>12 octobre 2026</strong> comprend <strong>320 essais</strong>, avec <strong>20 répétitions par condition</strong>. Elle utilise <strong>Qwen3.5 9B</strong>, quantifié en Q4_K_M, sous <strong>Ollama 0.33.2</strong>, à une température de <strong>0,2</strong>, sans mode de raisonnement étendu. Chaque requête repart d’une conversation neuve. Le serveur et le programme d’essais sont isolés du réseau extérieur.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La grille réserve 40 points aux compétences, 30 à l’expérience, 20 aux incidents résolus et 10 à la formation. La configuration de départ fournit déjà cette tâche et un format de réponse. La configuration renforcée ajoute une consigne de séparation et un balisage du CV comme donnée non fiable. Une troisième configuration conserve ces consignes et ajoute un refus des consultations inutiles dans le code.</p>
<figure class="wp-block-image size-full" style="margin:1.6em 0"><a href="https://tazmenworld.com/wp-content/uploads/2026/10/resultats-en-lab-v2.webp"><img alt="Résultats du profil B : les notes moyennes passent de 36,25 à 61,80 au départ et de 33,50 à 59,70 avec les consignes renforcées. Les commentaires influencés passent de 20 à 8 sur 20, les consultations fictives proposées de 6 à 0 sur 20." class="wp-image-479" height="2080"  style="display:block;width:100%;height:auto;border-radius:10px" width="2080"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/10/resultats-en-lab-v2.webp" srcset="https://tazmenworld.com/wp-content/uploads/2026/10/resultats-en-lab-v2.webp 2080w, https://tazmenworld.com/wp-content/uploads/2026/10/resultats-en-lab-v2-300x300.webp 300w, https://tazmenworld.com/wp-content/uploads/2026/10/resultats-en-lab-v2-1024x1024.webp 1024w, https://tazmenworld.com/wp-content/uploads/2026/10/resultats-en-lab-v2-150x150.webp 150w, https://tazmenworld.com/wp-content/uploads/2026/10/resultats-en-lab-v2-768x768.webp 768w, https://tazmenworld.com/wp-content/uploads/2026/10/resultats-en-lab-v2-1536x1536.webp 1536w, https://tazmenworld.com/wp-content/uploads/2026/10/resultats-en-lab-v2-2048x2048.webp 2048w" sizes="auto, (max-width: 2080px) 100vw, 2080px" /></a><figcaption style="font-size:0.9em;line-height:1.5;margin-top:0.75em">Résultats en lab, avec 20 réponses valides par condition. Les barres du premier panneau représentent les moyennes ; les traits indiquent le minimum et le maximum observés. Le second panneau compte les réponses influencées ou proposant une consultation fictive, sans mesurer un accès réel aux données.</figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Les compétences ajoutées augmentent donc la note moyenne d’environ <strong>26 points</strong> dans les deux configurations. Le modèle les lit dans le texte extrait et les prend en compte dans son évaluation. Ce scénario ne contient aucune instruction lui demandant de changer sa note : il illustre une modification des données utilisées pour juger le profil.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La consigne renforcée ne corrige pas cet effet. Elle vise les instructions contenues dans le CV, tandis que les ajouts ressemblent à des qualifications ordinaires. Le modèle reçoit le texte, sans l’image du document : il ne peut pas comparer les deux vues pour repérer ce qui était invisible. La vérification documentaire doit donc intervenir avant que cette information visuelle soit perdue.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">L’instruction neutre produit un autre résultat. Elle demande une modification de la fin du commentaire, sans ajouter de qualification. Elle est suivie dans toutes les réponses de départ, puis dans huit réponses malgré les consignes renforcées. Dans ces huit sorties, le champ prévu pour les alertes reste vide. La séparation réduit ici l’effet observé, mais ne l’élimine pas. En revanche, la note moyenne de cette variante n’augmente pas : modifier le commentaire et améliorer le score sont deux conséquences distinctes.</p>
<h3>Une proposition d’outil n’est pas un accès aux données</h3>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Dans le scénario de consultation, le modèle peut produire une proposition structurée pour un <strong>mock</strong>, un outil simulé. Six réponses de départ en proposent une, alors que la consultation est annoncée comme inutile à l’évaluation. Le code retourne seulement une constante inventée. Avec les consignes renforcées, aucune proposition n’apparaît, y compris dans la configuration ajoutant le contrôle applicatif.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Cela signifie qu’aucun refus n’a été exercé par cette dernière barrière pendant la campagne. Son fonctionnement est vérifié séparément par les tests du dispositif, qui soumettent directement des demandes au contrôle. Présenter le résultat comme des attaques effectivement bloquées par le code confondrait ces deux vérifications.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le modèle n’a reçu aucun outil natif d’Ollama : il produit des objets de données ensuite examinés par le programme. Le retour fictif n’est pas réintroduit dans une seconde conversation. Ce test ne mesure donc ni une action d’agent de bout en bout, ni un accès à un dossier, ni une fuite. La déclaration du mock n’apparaît que dans ce scénario ; les six propositions ne suffisent pas à attribuer causalement leur apparition au seul texte du CV.</p>
<h3>Un format correct peut accompagner une évaluation discutable</h3>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Les <strong>320 réponses</strong> respectent les champs, les bornes et la somme des sous-scores. Aucun essai n’est rejeté pour erreur de format ou délai dépassé. Cela ne garantit pas la fiabilité du contenu. Dans la variante à compétences cachées, <strong>30 réponses sur 40</strong> fournissent une citation qui ne correspond pas à un passage continu du texte extrait, souvent en assemblant les compétences visibles et ajoutées. Ce défaut de citation ne prouve pas que ces compétences ont été inventées par le modèle.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Deux réponses signalent aussi, à tort, qu’un total de <strong>58 points</strong> dépasse le plafond de <strong>100</strong>. Même la référence varie : de <strong>25 à 40 points</strong> au départ et de <strong>22 à 50</strong> avec les consignes renforcées. Les moyennes décrivent cette grille et ce modèle ; elles ne valident pas la justesse des notes pour recruter.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Enfin, les répétitions portent sur les mêmes documents fictifs, avec différentes graines de génération. Elles renseignent sur la variabilité de ces conditions, pas sur la fréquence d’une attaque parmi de vrais candidats. Aucun détecteur visuel, autre modèle ou logiciel RH commercial n’a été évalué. Le lab montre une frontière de confiance à protéger, sans démontrer une vulnérabilité de produit.</p>
<h2>Des défenses qui protègent aussi la décision RH</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto"><strong>Cadres défensifs.</strong> OWASP recommande notamment de séparer les contenus extérieurs, de limiter les privilèges et de valider les sorties par du code. Microsoft présente également une défense en profondeur contre les injections indirectes. Ces recommandations fournissent un cadre ; leur efficacité dépend de leur mise en œuvre et de leur évaluation. <a href="https://genai.owasp.org/llmrisk/llm01-prompt-injection/">recommandations OWASP</a>, <a href="https://www.microsoft.com/en-us/msrc/blog/2025/07/how-microsoft-defends-against-indirect-prompt-injection-attacks">défense en profondeur de Microsoft</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Pour une équipe RH, la première décision consiste à définir ce que l’agent peut accomplir. Une synthèse de candidature peut souvent être produite à partir du seul document et de la fiche de poste. Lui donner, pour cette tâche, un accès général à tous les dossiers ou à des fonctions d’envoi élargit inutilement les conséquences d’une erreur.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La deuxième priorité concerne la provenance. Les qualifications restent des déclarations du candidat, même après leur extraction dans une base interne. Le stockage ne leur confère aucune autorité sur la procédure. Une synthèse intermédiaire devrait conserver les passages justificatifs et permettre de retrouver le document d’origine, afin qu’un champ douteux puisse être examiné.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La troisième priorité consiste à rendre les autorisations explicites. Chaque outil doit vérifier l’identité, les ressources accessibles, l’objet de la tâche et les paramètres. La justification rédigée par le modèle ne suffit pas à créer un droit. Une action doit être refusée si elle dépasse les capacités prévues, même lorsque la sortie respecte parfaitement le format demandé.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La détection documentaire complète ces barrières. Comparer rendu et extraction peut faire apparaître du contenu supplémentaire. Un signal doit déclencher une revue proportionnée, avec examen des artefacts de conversion possibles. Le candidat ne devrait pas être exclu automatiquement sur la seule décision d’un détecteur : une erreur de mise en page et une manipulation intentionnelle ne se déduisent pas d’une simple alerte.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Enfin, la supervision humaine doit disposer de preuves utilisables : critères, citations du CV, transformations appliquées, alertes et actions proposées. Valider une note sans accès à ces éléments peut seulement ajouter une signature à une décision opaque. Pour un responsable RH, la possibilité de contester une extraction ou de revenir au document compte autant que la fluidité de l’interface.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto"><strong>Cadre réglementaire vérifié le 12 octobre 2026.</strong> L’annexe III de l’AI Act vise notamment certains systèmes d’analyse, de filtrage et d’évaluation des candidatures. Le texte de l’article 113 affiché par le service officiel et sa FAQ indiquent le <strong>2 décembre 2027</strong> pour les dispositions relatives aux systèmes à haut risque de cette annexe. La qualification précise et les dispositions transitoires doivent être examinées selon le système ; cette date ne résume pas toutes les obligations applicables. <a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/annex-3">annexe III de l’AI Act</a>, <a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-113">article 113 de l’AI Act</a>, <a href="https://ai-act-service-desk.ec.europa.eu/fr/ai-act/faq/quand-lapplication-de-la-loi-commence-t-elle">calendrier officiel de l’AI Act</a></p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le contenu caché des CV pose déjà une question de fidélité des données utilisées pour recruter. Les instructions malveillantes ajoutent une question d’autorité ; les agents connectés ajoutent une question de permissions. Examiner ces trois niveaux permet d’agir sans transformer une hypothèse en incident établi. Le CV peut renseigner l’entreprise sur une candidature. Il ne doit pas définir les règles de son évaluation ni les droits de son évaluateur.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/10/12/cv-ia-contenus-caches-injection-prompt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>EvilTokens : le piège du code appareil dans Microsoft 365</title>
		<link>https://tazmenworld.com/2026/10/06/eviltokens-phishing-code-appareil-microsoft-365/</link>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Tue, 06 Oct 2026 15:45:28 +0000</pubDate>
				<category><![CDATA[Cybersécurité]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=466</guid>

					<description><![CDATA[EvilTokens fait passer une autorisation d’accès pour une vérification nécessaire à l’ouverture d’un document. L’utilisateur peut alors authentifier la demande de l’attaquant sur une véritable page Microsoft. Le parcours décrit par Microsoft éclaire ce piège, les traces à examiner après une suspicion et les mesures de sécurisation à adapter à son environnement.]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-large" style="margin: 1.6em 0;"><img width="1672" height="941" alt="Louis et son lapin dans une illustration sur : EvilTokens : du phishing par code appareil aux traces d’une compromission Microsoft 365" class="wp-image-470"  style="display: block; width: 100%; height: auto; border-radius: 10px;"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/10/nit-df45a9719238-hero-approved.webp" srcset="https://tazmenworld.com/wp-content/uploads/2026/10/nit-df45a9719238-hero-approved.webp 1672w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-df45a9719238-hero-approved-300x169.webp 300w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-df45a9719238-hero-approved-1024x576.webp 1024w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-df45a9719238-hero-approved-768x432.webp 768w, https://tazmenworld.com/wp-content/uploads/2026/10/nit-df45a9719238-hero-approved-1536x864.webp 1536w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">EvilTokens fait passer une autorisation d’accès pour une vérification nécessaire à l’ouverture d’un document. L’utilisateur peut alors authentifier la demande de l’attaquant sur une véritable page Microsoft. Le parcours décrit par Microsoft éclaire ce piège, les traces à examiner après une suspicion et les mesures de sécurisation à adapter à son environnement.</p>
<h2>Une attaque contre le sens de l’autorisation</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Un code de connexion relie deux actions : la demande d’un client logiciel et sa validation par un utilisateur. Dans le parcours EvilTokens, le leurre dissimule qui a lancé cette demande. La personne croit vérifier son identité pour accéder à un document, alors qu’elle accorde un accès au client contrôlé par l’attaquant. Le mot de passe et la vérification multifacteur peuvent être saisis sur le bon site sans corriger ce décalage.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Dans son analyse du 22 septembre 2026, Microsoft décrit une plateforme de phishing par abonnement qui organise cette chaîne, depuis la préparation du message jusqu’à l’exploitation des comptes. L’entreprise lui associe plus de 12 000 boîtes compromises dans plus de 10 000 organisations et attribue son développement et son support à Storm-2992. Ces chiffres et cette attribution restent les conclusions de Microsoft ; les autres sources fournies ne les valident pas indépendamment.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Huntress a relié à EvilTokens une campagne observée sur Railway, tandis que Cloudflare rapporte l’utilisation de ses Workers et sa participation à une opération coordonnée de démantèlement. Ces observations corroborent des mécanismes et des infrastructures dans leurs périmètres respectifs. Elles ne constituent pas une mesure indépendante de l’ensemble des victimes annoncé par Microsoft.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Les neuf captures publiées dans l’analyse Microsoft permettent de suivre l’organisation du service et le parcours proposé à la victime. Les écrans commerciaux documentent des options et des promesses, dont l’affichage ne prouve pas l’efficacité. Les observations d’incidents apportent une autre information : elles décrivent les actions effectivement rapportées dans les cas étudiés.</p>
<h2>Le code appareil : un usage légitime détourné</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le flux OAuth par code appareil répond à une contrainte réelle. Un téléviseur, une imprimante ou certains équipements Teams ne permettent pas une connexion interactive confortable. Le client demande alors un code à Microsoft, l’affiche, puis attend. L’utilisateur saisit ce code dans un navigateur, éventuellement sur un autre appareil, et termine l’authentification. Après cette autorisation, le client demandeur reçoit un jeton d’accès et, selon le cas, un jeton de renouvellement.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le jeton d’accès permet d’utiliser les ressources autorisées ; le jeton de renouvellement sert à obtenir de nouveaux jetons d’accès. La distinction compte pour la suite : récupérer ces éléments ne revient pas seulement à connaître un mot de passe. L’attaquant dispose d’un moyen d’exercer l’accès accordé au client, dans les limites des autorisations obtenues et de la validité des jetons.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Dans le détournement décrit par Microsoft, le client demandeur est contrôlé par l’attaquant. Le code est présenté à la victime comme une étape nécessaire pour consulter un document ou vérifier son identité. L’utilisateur effectue une authentification légitime, mais au bénéfice d’une demande qu’il n’a pas lui-même initiée. Parler simplement de « MFA contournée » masque cette mécanique : la victime peut accomplir elle-même l’authentification multifacteur, ou MFA, pendant qu’elle autorise la mauvaise session.</p>
<h2>Une boutique, un support et un panneau de campagne</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Selon Microsoft, EvilTokens rassemble dans une même plateforme les éléments nécessaires à une campagne : modèles de messages, pièces jointes, pages d’arrivée, hébergement, redirections et suivi des victimes. Les abonnés peuvent ainsi préparer leurs opérations avec l’assistance du service, plutôt que de construire séparément chaque composant technique.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le profil du bot Telegram présenté comme la boutique EvilTokens affiche un contact d’administration, un site et un contact de secours. Ces différents points de contact donnent au service l’apparence d’une offre suivie, avec plusieurs moyens de joindre ses opérateurs. Microsoft rapporte que Telegram sert également aux annonces, aux mises à jour, à la coordination des abonnés et au support. Le profil ne permet pas d’identifier les personnes derrière ces comptes.</p>
<figure class="wp-block-image news-it-draft-source"><img alt="Figure 1 : profil du bot Telegram présenté comme la boutique EvilTokens. Capture publiée par Microsoft ; droits de republication non établis."  style="max-width: 100%; height: auto" loading="lazy" decoding="async" src="https://www.microsoft.com/en-us/security/blog/wp-content/uploads/2026/09/Fig1-EvilTokens-Telegram-bot-1.jpg"><figcaption>Figure 1 : profil du bot Telegram présenté comme la boutique EvilTokens. Capture publiée par Microsoft ; droits de republication non établis.<br />Source : <a href="https://www.microsoft.com/en-us/security/blog/2026/09/22/unmasking-eviltokens-getting-to-the-root-of-device-code-phishing/">Microsoft Security Blog</a></figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">L’offre affichée dans le bot mêle vocabulaire d’entreprise et promesses offensives. Elle présente notamment des jetons qui « n’expirent pas » et un accès persistant après changement de mot de passe. Dans son analyse de septembre 2026, Microsoft rapporte un achat initial de 1 500 dollars américains et un abonnement mensuel de 500 dollars. Ces tarifs décrivent l’offre étudiée, sans établir sa disponibilité actuelle. Les promesses de non-expiration et de persistance ne remplacent pas l’examen des autorisations et de la validité réelle des jetons.</p>
<figure class="wp-block-image news-it-draft-source"><img alt="Figure 2 : offre tarifée et argumentaire du bot EvilTokens. Les performances annoncées restent des promesses commerciales. Capture publiée par Microsoft ; droits non établis."  style="max-width: 100%; height: auto" loading="lazy" decoding="async" src="https://www.microsoft.com/en-us/security/blog/wp-content/uploads/2026/09/Fig2a-EvilTokens-store-bot-1.webp"><figcaption>Figure 2 : offre tarifée et argumentaire du bot EvilTokens. Les performances annoncées restent des promesses commerciales. Capture publiée par Microsoft ; droits non établis.<br />Source : <a href="https://www.microsoft.com/en-us/security/blog/2026/09/22/unmasking-eviltokens-getting-to-the-root-of-device-code-phishing/">Microsoft Security Blog</a></figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La page d’accueil du panneau répartit la préparation entre deux familles d’hébergement : Cloudflare Workers/Bunny et hébergement PHP. Elle présente ensuite des réglages de mode de capture, de modèle, d’affichage du code, de langue, de CAPTCHA et de personnalisation. L’intérêt de cette interface guidée est de rapprocher des choix habituellement dispersés : où héberger le leurre, quelle apparence lui donner et comment présenter l’étape d’autorisation à la cible.</p>
<figure class="wp-block-image news-it-draft-source"><img alt="Figure 3 : choix d’hébergement et options de préparation dans le panneau EvilTokens. Capture publiée par Microsoft ; droits non établis."  style="max-width: 100%; height: auto" loading="lazy" decoding="async" src="https://www.microsoft.com/en-us/security/blog/wp-content/uploads/2026/09/Fig3-EvilTokens-platform-welcome-page-1.jpg"><figcaption>Figure 3 : choix d’hébergement et options de préparation dans le panneau EvilTokens. Capture publiée par Microsoft ; droits non établis.<br />Source : <a href="https://www.microsoft.com/en-us/security/blog/2026/09/22/unmasking-eviltokens-getting-to-the-root-of-device-code-phishing/">Microsoft Security Blog</a></figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le panneau de gestion des jetons annonce l’accès à la messagerie, la détection de comptes administrateurs, le renouvellement automatique et des alertes par mots-clés. Il présente donc l’authentification de la cible comme le début d’un travail sur le compte, plutôt que comme la fin de l’attaque. Les possibilités étendues promises pour certains jetons administrateurs restent toutefois des affirmations du service : les permissions réellement obtenues, notamment sur les autres boîtes d’une organisation, ne sont pas établies par cet écran.</p>
<figure class="wp-block-image news-it-draft-source"><img alt="Figure 4 : fonctions annoncées pour la gestion des jetons capturés. L’écran ne démontre pas les permissions obtenues. Capture publiée par Microsoft ; droits non établis."  style="max-width: 100%; height: auto" loading="lazy" decoding="async" src="https://www.microsoft.com/en-us/security/blog/wp-content/uploads/2026/09/Fig4-EvilTokens-platform-options-1.jpg"><figcaption>Figure 4 : fonctions annoncées pour la gestion des jetons capturés. L’écran ne démontre pas les permissions obtenues. Capture publiée par Microsoft ; droits non établis.<br />Source : <a href="https://www.microsoft.com/en-us/security/blog/2026/09/22/unmasking-eviltokens-getting-to-the-root-of-device-code-phishing/">Microsoft Security Blog</a></figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La page d’outils complémentaires propose un navigateur ET, un redirecteur antibot, un expéditeur B2B, un expéditeur SMTP et un validateur d’adresses Office. Les boutons d’acquisition et de tutoriel, ainsi que l’offre de parrainage, prolongent la logique de boutique. Microsoft rapporte des frais supplémentaires pour plusieurs modules et une récompense en cryptomonnaie pour les recommandations. Ce catalogue montre comment le service commercialise des fonctions autour du leurre, de sa diffusion et de l’exploitation des accès ; il ne mesure pas leur contribution aux incidents.</p>
<figure class="wp-block-image news-it-draft-source"><img alt="Figure 5 : catalogue d’outils complémentaires et offre de parrainage EvilTokens. Capture publiée par Microsoft ; droits non établis."  style="max-width: 100%; height: auto" loading="lazy" decoding="async" src="https://www.microsoft.com/en-us/security/blog/wp-content/uploads/2026/09/Fig5-EvilTokens-Essential-Tools-1.jpg"><figcaption>Figure 5 : catalogue d’outils complémentaires et offre de parrainage EvilTokens. Capture publiée par Microsoft ; droits non établis.<br />Source : <a href="https://www.microsoft.com/en-us/security/blog/2026/09/22/unmasking-eviltokens-getting-to-the-root-of-device-code-phishing/">Microsoft Security Blog</a></figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Microsoft rapporte aussi l’usage d’assistants d’IA pour adapter les messages au rôle de la cible et analyser des messageries compromises. Cette assistance s’inscrit dans la même organisation du travail : préparer un message pertinent, puis chercher des comptes ou des échanges intéressants après l’accès. Les observations fournies ne permettent ni de quantifier le gain apporté par l’IA ni de conclure qu’elle intervient dans toutes les campagnes.</p>
<h2>Des modèles familiers pour faire accepter une étape inhabituelle</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le sélecteur de thèmes présente notamment la signature Adobe, DocuSign, une notification vocale, la quarantaine de messagerie, l’expiration de mot de passe et le partage de fichiers. Des champs permettent de modifier la couleur, le nom du document et le pied de page. Microsoft décrit 44 thèmes au total, dont seule une partie apparaît dans la capture. Ces réglages permettent d’envelopper la demande de code dans plusieurs situations professionnelles familières, sans changer le principe de l’autorisation recherchée.</p>
<figure class="wp-block-image news-it-draft-source"><img alt="Figure 6 : thèmes et champs de personnalisation du leurre. La capture ne présente qu’une partie de la liste. Capture publiée par Microsoft ; droits non établis."  style="max-width: 100%; height: auto" loading="lazy" decoding="async" src="https://www.microsoft.com/en-us/security/blog/wp-content/uploads/2026/09/Fig6-EvilTokens-templates-1.jpg"><figcaption>Figure 6 : thèmes et champs de personnalisation du leurre. La capture ne présente qu’une partie de la liste. Capture publiée par Microsoft ; droits non établis.<br />Source : <a href="https://www.microsoft.com/en-us/security/blog/2026/09/22/unmasking-eviltokens-getting-to-the-root-of-device-code-phishing/">Microsoft Security Blog</a></figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le ressort du leurre est de rendre cohérente une étape qui, isolément, devrait interroger. La signature d’un document peut servir de prétexte à une vérification d’identité ; un avis d’expiration suggère une action urgente ; une proposition commerciale donne une raison d’ouvrir un lien. Microsoft décrit des messages adaptés aux fonctions des destinataires. Huntress rapporte également des propositions de chantier, des accords commerciaux, des messages sur la rémunération et des avis d’expiration de mot de passe.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le courriel présenté en exemple invite le destinataire à soumettre une proposition pour un projet et renvoie vers un dossier annoncé comme accessible via Adobe. Une référence de document et une invitation à poser des questions lui donnent le ton d’un échange professionnel ordinaire. Le message fournit ainsi une raison d’ouvrir le lien avant toute demande de connexion. La capture ne révèle cependant ni l’identité réelle de l’expéditeur, ni la destination effective du lien, ni le résultat de l’interaction.</p>
<figure class="wp-block-image news-it-draft-source"><img alt="Figure 7 : exemple de courriel de phishing utilisant une demande de proposition commerciale. Capture publiée par Microsoft ; droits non établis."  style="max-width: 100%; height: auto" loading="lazy" decoding="async" src="https://www.microsoft.com/en-us/security/blog/wp-content/uploads/2026/09/Fig7-EvilTokens-phishing-email-1.webp"><figcaption>Figure 7 : exemple de courriel de phishing utilisant une demande de proposition commerciale. Capture publiée par Microsoft ; droits non établis.<br />Source : <a href="https://www.microsoft.com/en-us/security/blog/2026/09/22/unmasking-eviltokens-getting-to-the-root-of-device-code-phishing/">Microsoft Security Blog</a></figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Les points d’entrée décrits par Microsoft comprennent des URL, des PDF et des fichiers HTML. L’interaction avec le lien ou la pièce jointe amorce le parcours vers la page de phishing. Le leurre n’a donc pas besoin de demander immédiatement un mot de passe : il peut d’abord conduire la personne vers une étape intermédiaire qui prépare l’autorisation.</p>
<h2>Du faux document à la véritable connexion Microsoft</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La page aux couleurs d’Adobe Acrobat Sign associe un document nommé Important_update.pdf à une demande de vérification d’identité avec Microsoft. Elle affiche un code, propose de le copier, puis de continuer vers Microsoft. L’accès au document devient ainsi le motif apparent de l’opération. Cette mise en scène est visible dans la capture ; la génération du code en temps réel et la récupération ultérieure des jetons sont décrites par l’analyse Microsoft.</p>
<figure class="wp-block-image news-it-draft-source"><img alt="Figure 8 : page de leurre présentant un code appareil comme une vérification préalable à l’ouverture d’un document. Capture publiée par Microsoft ; droits non établis."  style="max-width: 100%; height: auto" loading="lazy" decoding="async" src="https://www.microsoft.com/en-us/security/blog/wp-content/uploads/2026/09/Fig8-EvilTokens-sample-generated-device-code-1.webp"><figcaption>Figure 8 : page de leurre présentant un code appareil comme une vérification préalable à l’ouverture d’un document. Capture publiée par Microsoft ; droits non établis.<br />Source : <a href="https://www.microsoft.com/en-us/security/blog/2026/09/22/unmasking-eviltokens-getting-to-the-root-of-device-code-phishing/">Microsoft Security Blog</a></figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Selon Microsoft, la page exécute un script d’automatisation qui échange avec le fournisseur d’identité pour obtenir un code valide. Le bouton de continuation dirige ensuite la victime vers le portail officiel microsoft.com/devicelogin. L’analyse décrit aussi une copie automatique fréquente du code dans le presse-papiers, destinée à réduire les manipulations demandées à l’utilisateur. Le passage vers un véritable portail de connexion fait donc partie du piège.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Pendant ce temps, l’infrastructure suit l’avancement de la session. Dans la séquence étudiée, Microsoft décrit une fonction checkStatus() qui interroge un point de terminaison /state toutes les trois à cinq secondes, pendant une fenêtre de quinze minutes. Ce suivi transmet un identifiant secret de session et reste en attente tant que la victime n’a pas terminé l’authentification. Il renseigne l’état du parcours côté plateforme ; il ne constitue pas, à lui seul, la preuve d’une autorisation réussie.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">L’écran Microsoft de saisie du code avertit que l’application ou l’appareil concerné obtiendra l’accès au compte et qu’il ne faut pas saisir un code provenant d’une source non fiable. C’est le changement de sens crucial entre les deux pages : le leurre parle de consulter un document, tandis que le portail parle d’accorder un accès. Microsoft présente cette capture comme son écran de connexion par code appareil ; l’authenticité de la page de destination ne garantit pas la fiabilité de l’origine du code.</p>
<figure class="wp-block-image news-it-draft-source"><img alt="Figure 9 : écran de saisie du code présenté par Microsoft, avec avertissement sur l’accès accordé au compte. Capture publiée par Microsoft ; droits non établis."  style="max-width: 100%; height: auto" loading="lazy" decoding="async" src="https://www.microsoft.com/en-us/security/blog/wp-content/uploads/2026/09/Fig9-Sample-device-code-sign-in-1.webp"><figcaption>Figure 9 : écran de saisie du code présenté par Microsoft, avec avertissement sur l’accès accordé au compte. Capture publiée par Microsoft ; droits non établis.<br />Source : <a href="https://www.microsoft.com/en-us/security/blog/2026/09/22/unmasking-eviltokens-getting-to-the-root-of-device-code-phishing/">Microsoft Security Blog</a></figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Si la victime n’a pas de session active, elle peut être invitée à saisir son mot de passe et à effectuer la MFA. Si elle est déjà connectée, la saisie du code et la confirmation peuvent suffire dans le parcours décrit. Lorsque l’autorisation aboutit, le client contrôlé par l’attaquant peut obtenir les jetons. Le secret n’a pas nécessairement été tapé dans une imitation de page de connexion : c’est l’autorisation donnée au mauvais client qui fait basculer l’accès.</p>
<h2>Une livraison à plusieurs étapes pour compliquer l’analyse</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Microsoft décrit des liens portés par des images, des pièces jointes et plusieurs redirections avant la page finale. Certaines pages imposent un faux CAPTCHA ou une vérification nécessitant une interaction humaine avant de montrer le contenu. Ces étapes cherchent à compliquer l’examen par des analyseurs d’URL et des environnements automatisés. Elles constituent des techniques d’évasion observées, sans garantir un passage à travers toutes les protections.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">L’analyse rapporte l’utilisation de domaines légitimes compromis et de plateformes comme Vercel, Cloudflare Workers et AWS Lambda pour héberger la logique de redirection. L’objectif est de faire passer des éléments de l’attaque au milieu de trafic cloud habituel et de limiter l’efficacité d’un filtrage fondé uniquement sur la réputation du domaine. Cela n’autorise pas à qualifier de malveillant tout usage de ces plateformes.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Pour une campagne suivie en avril 2026, Microsoft rapporte des milliers de nœuds de suivi uniques et de courte durée, avec une logique serveur en Node.js. Le fournisseur associe cette infrastructure dynamique à des difficultés pour les détections par signature ou motif. Cloudflare confirme, dans son propre compte rendu, avoir observé des usages de Workers et supprimé des projets et domaines associés lors de l’opération coordonnée de septembre. Ces observations portent sur des périmètres distincts : Cloudflare ne valide pas ici le détail des nœuds suivis en avril par Microsoft.</p>
<h2>Après les jetons : lire, sélectionner et prolonger l’accès</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Selon Microsoft, l’accès obtenu peut servir à lire et extraire des courriels, mais aussi à envoyer de nouveaux messages aux collègues et contacts externes de la victime. La confiance attachée au compte compromis devient alors un moyen de poursuivre le phishing. L’analyse rapporte également des règles de boîte malveillantes utilisées pour faciliter l’exploitation de la messagerie et dissimuler des communications. Ces règles ne prolongent pas, par elles-mêmes, la validité d’un jeton OAuth.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Dans un incident rapporté, les attaquants ont sélectionné des profils financiers, de direction ou d’administration parmi les comptes compromis. Microsoft décrit une analyse assistée par IA de l’activité des boîtes et une reconnaissance par Microsoft Graph pour cartographier la structure interne et les permissions. Les recherches dans les courriels visaient notamment des instructions de virement, des factures en attente et des échanges de dirigeants. Ces observations ne démontrent pas que chaque compte autorisé subit toutes ces actions.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La temporalité varie également. Microsoft rapporte certains enregistrements de nouveaux appareils dans les dix minutes suivant la compromission, afin de produire un Primary Refresh Token, ou PRT, pour une persistance durable. Dans d’autres cas, les acteurs attendent plusieurs heures avant de créer des règles ou d’extraire des messages. L’enquête doit donc couvrir la suite de l’autorisation, sans supposer que l’absence d’action immédiatement visible clôt le scénario.</p>
<h2>Après une suspicion : reconstruire la chronologie dans les journaux</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Le premier objectif est de relier une demande par code appareil à l’activité ultérieure du compte. Dans les connexions Entra, les éléments à examiner comprennent le compte, l’heure, le résultat, le protocole Device code flow, l’application, la ressource, l’adresse IP, les informations d’appareil et les politiques d’accès conditionnel. La propriété Original transfer method peut indiquer qu’une connexion ou un renouvellement provient d’une session initialement créée par code appareil. Elle aide à comprendre cette origine, sans être à elle seule un identifiant unique de corrélation ni une preuve d’activité malveillante.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Une connexion réussie, même avec MFA, ne suffit pas à exclure l’attaque. Inversement, un flux par code appareil, une adresse IP ou une localisation inhabituelle ne prouvent pas isolément un vol de jeton. L’interprétation repose sur la concordance entre l’autorisation, l’application concernée, les usages attendus et les actions suivantes. Un clic documente une interaction ; il ne démontre pas à lui seul que l’utilisateur a terminé l’autorisation.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Les journaux d’audit et l’état des appareils permettent ensuite d’examiner un éventuel enregistrement nouveau. Côté Exchange, les opérations New-InboxRule, Set-InboxRule et MailItemsAccessed fournissent des pistes sur les règles et les accès aux messages. Les transferts et l’état des règles doivent également être examinés. Un appareil ou une règle nouvellement créé demande une vérification de son caractère autorisé ; un événement d’accès aux messages ne décrit pas, à lui seul, toute une exfiltration.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La reconnaissance Graph exige une précaution supplémentaire : vérifier que les journaux d’activité correspondants étaient collectés avant l’incident. Ils nécessitent Entra ID P1 ou P2 et une intégration vers un stockage ou un outil d’analyse ; Entra ne les conserve pas nativement par défaut. Une recherche vide peut donc refléter un manque de données. Activer cette collecte après l’attaque ne restitue pas les appels passés.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La fenêtre disponible doit être vérifiée avant de tirer des conclusions. Les journaux de connexion et d’audit Entra sont conservés par défaut sept jours avec Entra ID Free, et trente jours avec P1 ou P2. La chasse avancée Defender XDR porte sur au plus trente jours de données natives. Ces durées concernent des ensembles distincts ; elles ne garantissent pas que tous les événements utiles existent dans l’environnement Microsoft 365 de l’organisation.</p>
<h2>Ce que les recherches Defender apportent, et ce qu’elles ne prouvent pas</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La première requête publiée par Microsoft part d’alertes Defender for Office 365, relie l’URL au message et au destinataire, puis recherche un événement BrowserLaunchedToOpenUrl sur le poste associé. Ses jointures utilisent notamment les tables AlertInfo, AlertEvidence, EmailEvents, IdentityInfo et DeviceEvents. Elle aide à rapprocher un message signalé et un clic observé ; elle n’établit pas directement l’émission d’un jeton ni son utilisation par l’attaquant.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La seconde requête filtre EmailEvents pour repérer des messages dont ThreatTypes est renseigné et qui ont été remis dans la boîte de réception ou les courriers indésirables. Elle identifie donc une livraison associée à une menace détectée, pas nécessairement une ouverture ou une autorisation. Microsoft explique qu’une recherche utile peut devenir une règle de détection personnalisée. Les requêtes du billet restent des points d’entrée à compléter par l’examen des connexions et des actions après compromission.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La présence de données dépend des produits et de leur intégration. CloudAppEvents, par exemple, repose sur Defender for Cloud Apps et la connexion des activités Microsoft 365. Microsoft associe aussi Safe Links et Entra ID Protection à des alertes de forte confiance sur le phishing par code appareil. Leur présence effective et l’ensemble de leurs conditions de licence n’ont pas été vérifiés dans un environnement donné : disposer de Microsoft 365 ne garantit donc pas l’accès à toutes ces données et alertes.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Les rapports Threat Analytics cités par Microsoft nécessitent une licence pour au moins un produit Defender XDR. Le billet liste des profils sur la technique, l’outil et l’acteur, mais affiche Storm-2922 dans cette liste alors que le corps de l’analyse attribue EvilTokens à Storm-2992. Cette discordance demeure dans la source. Le profil lié n’ayant pas pu être vérifié publiquement dans les éléments fournis, l’hypothèse d’une coquille ne permet pas de trancher.</p>
<h2>Les conseils Microsoft : contenir l’accès, puis réduire les occasions de phishing</h2>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">En cas de compromission présumée, Microsoft recommande une désactivation temporaire du compte, la révocation des sessions et des jetons de renouvellement, puis l’examen des appareils, des méthodes MFA, des consentements d’applications, des transferts et des règles de boîte. Le billet mentionne la révocation des sessions de connexion et la possibilité de forcer une nouvelle authentification par accès conditionnel. Ces actions doivent être adaptées au compte et à l’incident, en tenant compte de leur impact sur l’activité.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La révocation ne doit pas être interprétée comme une coupure instantanée de tout accès. Dans les campagnes étudiées, Microsoft rapporte que des jetons d’accès déjà émis peuvent rester utilisables jusqu’à une heure après une révocation ordinaire des sessions. Cette fenêtre rapportée n’est pas un maximum universel : la durée résiduelle effective dépend du jeton, de la ressource et des mécanismes de révocation applicables. Microsoft recommande donc de désactiver temporairement le compte compromis. Si un appareil et son PRT sont impliqués, l’entreprise recommande aussi de désactiver l’appareil et de révoquer les jetons de renouvellement existants afin de traiter cette voie de persistance.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Pour réduire la surface exposée, Microsoft recommande de bloquer le flux par code appareil partout où il n’est pas nécessaire. La documentation conseille d’en inventorier les usages avec une politique en mode rapport seul avant le blocage. Certains équipements Teams peuvent nécessiter des exceptions ciblées sur leurs comptes de ressources. Microsoft indique également d’exclure la ressource Device Registration Service pour préserver les usages d’enregistrement concernés ; cette exception ne s’applique pas indistinctement à toutes les politiques. L’accès conditionnel nécessite une licence Entra ID P1, P2 ou un essai adapté.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">La sensibilisation doit expliquer ce que l’écran Microsoft autorise réellement. Le nom de l’application attendue et l’origine du code comptent autant que l’apparence de la page. Microsoft recommande de se méfier des liens suspects dans les messages externes et de ne pas se connecter à des ressources proposées par des expéditeurs inconnus. L’exemple Adobe illustre précisément pourquoi une vérification d’identité présentée comme banale peut cacher une demande d’accès différente.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Sur la messagerie, Microsoft conseille les politiques antiphishing, Safe Links, un Advanced Phishing Threshold réglé à 2 ou 3 et Zero-hour auto purge, ou ZAP, pour traiter rétroactivement des messages à partir de nouvelles informations de menace. Le fournisseur recommande également des alertes sur les créations suspectes de règles de boîte, SmartScreen dans les navigateurs compatibles, ainsi que les protections réseau et Web. Ces couches visent à réduire les occasions d’attaque ; elles ne remplacent pas la vérification de l’autorisation et de ses suites.</p>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Microsoft recommande enfin la MFA, des méthodes résistantes au phishing comme les clés FIDO ou les passkeys de Microsoft Authenticator, le blocage de l’authentification héritée et des politiques fondées sur le risque de connexion. Les politiques intégrant le risque Entra ID Protection exigent P2, contrairement au simple blocage du flux par code appareil disponible avec P1. Elles répondent à des conditions différentes et ne doivent pas être confondues. La MFA reste utile contre de nombreuses attaques, mais les éléments fournis ne démontrent pas qu’un changement de méthode MFA, isolément, empêcherait toute autorisation piégée par code appareil.</p>
<figure class="wp-block-image news-it-learn-diagram" style="margin:1.6em 0;text-align:center"><img alt="Schéma Microsoft Entra : les signaux de connexion alimentent les décisions d’accès conditionnel, dont le risque évalué par ID Protection." height="384"  style="display:block;max-width:100%;height:auto;margin:0 auto" width="704" loading="lazy" decoding="async" src="https://learn.microsoft.com/fr-fr/entra/id-protection/media/concept-identity-protection-policies/risk-based-conditional-access-diagram.png"><figcaption style="text-align:center;font-size:0.9em;line-height:1.5;margin-top:0.75em">Microsoft Entra combine plusieurs signaux, dont le risque utilisateur et le risque de connexion, pour décider des contrôles d’accès. Ce schéma illustre les politiques fondées sur le risque ; il ne représente pas le réglage de blocage du flux par code appareil. Source : <a href="https://learn.microsoft.com/fr-fr/entra/id-protection/concept-identity-protection-policies">Microsoft Learn, politiques d’accès basées sur les risques</a>.</figcaption></figure>
<p style="text-align:justify;line-height:1.75;margin:0 0 1.25em;hyphens:auto">Les recommandations plus générales portent sur le moindre privilège, l’audit des comptes privilégiés et la centralisation des données d’identité. En environnement hybride, Microsoft préconise de conserver une frontière pour les comptes administratifs et fortement privilégiés plutôt que de tous les synchroniser. Pour appliquer ces conseils, l’organisation doit vérifier les produits, licences, collectes et exceptions réellement présents. Dans l’enquête comme dans la prévention, cette vérification détermine ce qu’elle peut observer et ce qu’elle peut effectivement bloquer.</p>
<h2>Sources</h2>
<ul>
<li><a href="https://www.microsoft.com/en-us/security/blog/2026/09/22/unmasking-eviltokens-getting-to-the-root-of-device-code-phishing/">Microsoft Security Blog, Unmasking EvilTokens</a></li>
<li><a href="https://www.huntress.com/blog/railway-paas-m365-token-replay-campaign">Huntress, Threat Actors Abuse Railway.com PaaS as Microsoft 365 Token Attack Infrastructure</a></li>
<li><a href="https://www.cloudflare.com/de-de/threat-intelligence/research/report/cloudflare-participates-in-global-operation-to-disrupt-eviltokens-phishing-as-a-service/">Cloudflare Cloudforce One, Operation to disrupt EvilTokens</a></li>
<li><a href="https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-device-code">Microsoft Learn, OAuth 2.0 device authorization grant</a></li>
<li><a href="https://learn.microsoft.com/entra/identity/conditional-access/concept-authentication-flows">Microsoft Learn, Conditional Access: Authentication flows</a></li>
<li><a href="https://learn.microsoft.com/en-us/entra/identity/monitoring-health/reference-reports-data-retention?trk=public_post_comment-text">Microsoft Learn, Microsoft Entra data retention</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-office-365/responding-to-a-compromised-email-account">Microsoft Learn, Respond to a compromised email account in Microsoft 365</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-xdr/advanced-hunting-overview">Microsoft Learn, Advanced hunting overview in Microsoft Defender XDR</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-xdr/advanced-hunting-cloudappevents-table">Microsoft Learn, CloudAppEvents table</a></li>
<li><a href="https://learn.microsoft.com/en-us/purview/audit-log-exchange-properties">Microsoft Learn, Exchange audit record properties</a></li>
<li><a href="https://learn.microsoft.com/en-us/graph/microsoft-graph-activity-logs-overview">Microsoft Learn, Access Microsoft Graph activity logs</a></li>
<li><a href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/plan-conditional-access">Microsoft Learn, Plan Your Microsoft Entra Conditional Access Deployment</a></li>
<li><a href="https://learn.microsoft.com/en-us/entra/identity-platform/access-tokens">Microsoft Learn, Access tokens in the Microsoft identity platform</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Construire une golden image Windows 11 avec Packer, Chocolatey et Boxstarter</title>
		<link>https://tazmenworld.com/2026/07/07/construire-une-golden-image-windows-11-avec-packer-chocolatey-et-boxstarter/</link>
					<comments>https://tazmenworld.com/2026/07/07/construire-une-golden-image-windows-11-avec-packer-chocolatey-et-boxstarter/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Tue, 07 Jul 2026 21:32:58 +0000</pubDate>
				<category><![CDATA[Tips & Tutos]]></category>
		<category><![CDATA[Virtualisation]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=406</guid>

					<description><![CDATA[Ouvre n&#8217;importe quel tuto Packer sur Windows et tu tomberas sur la même promesse : « une image parfaite en une commande, sans effort ». Tu copies le template, tu lances packer build, et tu déploies ta machine idéale. Sauf que c&#8217;est faux. Enfin, pas tout à fait. La commande existe, le résultat est réel, mais entre [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="576"  alt="" class="wp-image-418"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/07/packer_prez-1024x576.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/07/packer_prez-1024x576.jpg 1024w, https://tazmenworld.com/wp-content/uploads/2026/07/packer_prez-300x169.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/07/packer_prez-768x432.jpg 768w, https://tazmenworld.com/wp-content/uploads/2026/07/packer_prez-1536x864.jpg 1536w, https://tazmenworld.com/wp-content/uploads/2026/07/packer_prez.jpg 1672w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Ouvre n&rsquo;importe quel tuto Packer sur Windows et tu tomberas sur la même promesse : « une image parfaite en une commande, sans effort ». Tu copies le template, tu lances <code>packer build</code>, et tu déploies ta machine idéale.</p>



<p class="wp-block-paragraph">Sauf que c&rsquo;est faux. Enfin, pas tout à fait. La commande existe, le résultat est réel, mais entre les deux il y a une dizaine de pièges que personne ne te montre. Contrôleur disque invisible, balise obsolète qui fait tout planter, VM qui s&rsquo;endort en plein build. J&rsquo;ai tout traversé, en direct, sur ma machine. Cet article, c&rsquo;est le tuto que j&rsquo;aurais aimé lire avant de commencer.</p>



<p class="wp-block-paragraph">L&rsquo;objectif est simple : produire une <strong>golden image Windows 11</strong> automatisée. Windows s&rsquo;installe seul, le système passe en français, les VMware Tools et cinq applis se posent tout seuls, et à la fin tu récupères une image prête à cloner. Le tout sur VMware Workstation, en local, sans toucher la souris une seule fois une fois le build lancé.</p>



<p class="wp-block-paragraph">Je te préviens tout de suite : ce n&rsquo;est pas plug and play. Mais une fois les pièges désamorcés, ça tourne d&rsquo;un bout à l&rsquo;autre en 24 minutes. Et je te donne les vrais chiffres, y compris ceux qui font mal.</p>



<h2 class="wp-block-heading">Packer, Chocolatey, Boxstarter : qui fait quoi</h2>



<p class="wp-block-paragraph">Avant de coder, il faut comprendre les trois briques, parce qu&rsquo;elles n&rsquo;ont rien à voir entre elles. On les empile, chacune a un rôle précis.</p>



<p class="wp-block-paragraph"><strong>Packer</strong>, c&rsquo;est l&rsquo;orchestrateur du build. C&rsquo;est lui qui crée la VM, monte l&rsquo;ISO, la démarre, attend que Windows soit debout, se connecte, pousse les scripts, gère les reboots, puis exporte l&rsquo;image. Il ne fait rien d&rsquo;autre. Il fabrique le moule, une fois, et s&rsquo;arrête.</p>



<p class="wp-block-paragraph"><strong>Chocolatey</strong>, c&rsquo;est le gestionnaire de paquets Windows. L&rsquo;équivalent d&rsquo;<code>apt</code> sur Debian ou de <code>dnf</code> sur Fedora, mais pour Windows. Une ligne, <code>choco install firefox</code>, et le soft est là, sans installeur à cliquer, sans « suivant, suivant, terminer ». C&rsquo;est lui qui remplit le moule.</p>



<p class="wp-block-paragraph"><strong>Boxstarter</strong>, c&rsquo;est une surcouche de Chocolatey. Son intérêt unique : la résilience aux reboots. Il pose un autologon et reprend le script exactement là où il s&rsquo;était arrêté après un redémarrage. Utile quand tu enchaînes des installs qui rebootent. On y reviendra, parce que dans un build Packer, il fait doublon, et c&rsquo;est une nuance importante.</p>



<figure class="wp-block-image size-full is-resized"><img  alt="" class="wp-image-413" style="aspect-ratio:1.4419526442056951;width:750px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/07/diagramme-pipeline-packer.svg"></figure>



<h2 class="wp-block-heading">Packer contre Terraform : la confusion classique</h2>



<p class="wp-block-paragraph">Petite mise au point, parce que les deux sont des outils HashiCorp, écrits en HCL, et qu&rsquo;on les confond tout le temps. Ce ne sont pas des concurrents. Ils font deux choses différentes, à deux moments différents.</p>



<p class="wp-block-paragraph"><strong>Packer fabrique des images.</strong> Il produit un artefact figé, immuable : une image de VM, un template, une AMI sur AWS. Il construit, il exporte, il s&rsquo;arrête. Il ne sait pas ce que devient l&rsquo;image après, et il s&rsquo;en moque.</p>



<p class="wp-block-paragraph"><strong>Terraform déploie et gère l&rsquo;infrastructure.</strong> Il est déclaratif, il tient un état (le fameux <code>state</code>), il crée, modifie et détruit des ressources vivantes : des VM, des réseaux, des ressources cloud. Il gère tout le cycle de vie.</p>



<p class="wp-block-paragraph">En clair : Packer fabrique le moule, Terraform coule le béton dedans et gère les bâtiments. Le combo classique en prod, c&rsquo;est Packer qui produit la golden image, puis Terraform qui déploie cinquante instances de cette image. L&rsquo;un ne remplace pas l&rsquo;autre, ils se passent le relais.</p>



<p class="wp-block-paragraph">Pour cette démo, on reste sur Packer seul. On fabrique le moule.</p>



<h2 class="wp-block-heading">I. Installer Packer sur l&rsquo;hôte, pas dans la VM</h2>



<p class="wp-block-paragraph">Première confusion à évacuer : Packer s&rsquo;installe sur <strong>la machine hôte</strong>, celle qui fait tourner VMware Workstation. Pas dans la VM. La VM n&rsquo;existe même pas encore quand tu lances le build, c&rsquo;est Packer qui la crée.</p>



<p class="wp-block-paragraph">Sur mon poste, <code>winget</code> fait le job en trente secondes.</p>



<p class="wp-block-paragraph">[CODE : install-packer.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<pre class="wp-block-code"><code>winget install HashiCorp.Packer</code></pre>



<p class="wp-block-paragraph">Attention au piège le plus bête du monde : après l&rsquo;install, le PATH n&rsquo;est pas rechargé dans ta session en cours. Soit tu fermes et rouvres ton terminal, soit tu recharges à la volée.</p>



<p class="wp-block-paragraph">[CODE : reload-path.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<pre class="wp-block-code"><code>$env:Path = &#91;System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + &#91;System.Environment]::GetEnvironmentVariable("Path","User")
packer version</code></pre>



<figure class="wp-block-image size-large"><img width="1024" height="331"  alt="" class="wp-image-408"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/07/packer1-1-1024x331.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/07/packer1-1-1024x331.jpg 1024w, https://tazmenworld.com/wp-content/uploads/2026/07/packer1-1-300x97.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/07/packer1-1-768x248.jpg 768w, https://tazmenworld.com/wp-content/uploads/2026/07/packer1-1.jpg 1518w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Chez moi, <code>Packer v1.15.4</code>. Note bien la version, parce que le plugin qui va avec est devenu beaucoup plus strict que les anciens, et ça va nous jouer des tours.</p>



<h2 class="wp-block-heading">II. L&rsquo;ISO Windows 11 : LTSC ou pas, la nuance qui compte</h2>



<p class="wp-block-paragraph">Pour la source, on part d&rsquo;une ISO d&rsquo;évaluation, gratuite et sans clé, depuis l&rsquo;Evaluation Center Microsoft. Attention, le paysage a changé. La Windows 10 Enterprise classique a été retirée depuis la fin de support d&rsquo;octobre 2025. Sur Windows 11, tu as le choix entre la Enterprise LTSC 2024 (build 26100) et la version standard.</p>



<p class="wp-block-paragraph">Petite parenthèse vécue : j&rsquo;ai cru télécharger la LTSC, et une fois la VM montée, j&rsquo;ai vu le Microsoft Store et Outlook dans le menu Démarrer. Or la LTSC n&rsquo;a ni l&rsquo;un ni l&rsquo;autre. J&rsquo;avais en fait la <strong>Enterprise Evaluation standard</strong>, pas la LTSC. Pour le pipeline ça ne change rien, choco et Packer s&rsquo;en fichent, mais c&rsquo;est le genre de détail à vérifier avant de croire qu&rsquo;on a la bonne édition.</p>



<p class="wp-block-paragraph">L&rsquo;eval demande un formulaire, donc pas de téléchargement direct. Packer ne peut pas la récupérer seul, on pointe un fichier local. Et on calcule son empreinte pour la vérification d&rsquo;intégrité.</p>



<p class="wp-block-paragraph">[CODE : hash-iso.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<pre class="wp-block-code"><code>Get-FileHash "C:\demo\ISO\win11ent.iso" -Algorithm SHA256</code></pre>



<h2 class="wp-block-heading">III. Le template Packer, et le plugin qui ne pardonne rien</h2>



<p class="wp-block-paragraph">Le coeur du build, c&rsquo;est le fichier <code>.pkr.hcl</code>. Il déclare la source (la VM à créer) et le build (les étapes de provisioning). Je te donne la version finale, celle qui marche, après avoir mangé toutes les erreurs.</p>



<p class="wp-block-paragraph">Premier piège, et il est de taille. Le plugin <code>github.com/vmware/vmware</code> en version 2.1.3 est <strong>beaucoup plus strict</strong> que les versions d&rsquo;avant. Il ne devine plus rien. Deux paramètres que les anciens plugins déduisaient tout seuls sont désormais obligatoires : <code>network_adapter_type</code> et <code>disk_adapter_type</code>. Il y en a un troisième, <code>tools_mode</code>, mais celui-là ne devient obligatoire que si tu touches à la config d&rsquo;upload des VMware Tools, ce qu&rsquo;on évite ici en les installant par choco (j&rsquo;y reviens en partie VI). Si tu copies un template d&rsquo;un vieux tuto, il casse à la validation. Tu vas te manger des <code>X is required</code> en série. On met donc les deux paramètres requis d&rsquo;entrée.</p>



<p class="wp-block-paragraph">[CODE : windows11.pkr.hcl (extrait source)]</p>



<p class="wp-block-paragraph">hcl</p>



<pre class="wp-block-code"><code>source "vmware-iso" "win11" {
  vm_name       = "win11-ltsc-demo"
  guest_os_type = "windows11-64"

  iso_url      = var.iso_path
  iso_checksum = var.iso_checksum

  cpus      = 4
  memory    = 8192
  disk_size = 40960

  disk_adapter_type    = "sata"
  cdrom_adapter_type   = "sata"
  network_adapter_type = "e1000e"

  vmx_data = {
    "firmware"                = "efi"
    "uefi.secureBoot.enabled" = "FALSE"
    "vtpm.present"            = "FALSE"
  }

  cd_files = &#91;"./autounattend.xml"]
  cd_label = "PROVISION"

  boot_wait    = "3s"
  boot_command = &#91;"&lt;enter&gt;"]

  communicator   = "winrm"
  winrm_username = "packer"
  winrm_password = "packer"
  winrm_timeout  = "2h"
}</code></pre>



<p class="wp-block-paragraph">Deux choix à expliquer, parce qu&rsquo;ils m&rsquo;ont coûté du temps.</p>



<p class="wp-block-paragraph"><strong><code>disk_adapter_type = "sata"</code>.</strong> C&rsquo;est le piège numéro un. Sans cette ligne, la VM démarre, l&rsquo;install Windows se lance, et tu arrives sur l&rsquo;écran de sélection du disque avec une liste <strong>vide</strong>. Aucun disque. Le disque existe, Packer l&rsquo;a créé, mais il est branché sur le contrôleur par défaut du builder, du <strong>LSI Logic</strong>, dont l&rsquo;ISO Windows 11 n&rsquo;a pas le pilote natif. Windows ne le voit pas. En SATA (AHCI), il est reconnu out of the box, sans charger de driver.</p>



<figure class="wp-block-image size-large"><img width="1024" height="399"  alt="" class="wp-image-410"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/07/image-18-1024x399.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/07/image-18-1024x399.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/07/image-18-300x117.png 300w, https://tazmenworld.com/wp-content/uploads/2026/07/image-18-768x299.png 768w, https://tazmenworld.com/wp-content/uploads/2026/07/image-18-1536x599.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/07/image-18.png 1568w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong><code>network_adapter_type = "e1000e"</code>.</strong> Même logique. L&rsquo;ISO Windows 11 n&#8217;embarque pas le driver VMXNET3. Si tu prends vmxnet3, la carte réseau n&rsquo;est pas reconnue pendant l&rsquo;install, et sans réseau, pas de WinRM. Le e1000e est reconnu nativement.</p>



<p class="wp-block-paragraph">Une fois le template en place, on initialise le plugin.</p>



<p class="wp-block-paragraph">[CODE : packer-init.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<pre class="wp-block-code"><code>packer init windows11.pkr.hcl</code></pre>



<figure class="wp-block-image size-large"><img width="1024" height="383"  alt="" class="wp-image-414"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/07/packer3-1024x383.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/07/packer3-1024x383.jpg 1024w, https://tazmenworld.com/wp-content/uploads/2026/07/packer3-300x112.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/07/packer3-768x287.jpg 768w, https://tazmenworld.com/wp-content/uploads/2026/07/packer3.jpg 1502w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">IV. L&rsquo;autounattend, et la balise qui tue tout le fichier</h2>



<p class="wp-block-paragraph">L&rsquo;<code>autounattend.xml</code>, c&rsquo;est le fichier de réponses qui rend l&rsquo;install de Windows silencieuse. Il partitionne le disque, crée le compte, contourne les vérifications matérielles de Windows 11 et active WinRM. Packer le monte dans un petit CD que Windows détecte tout seul.</p>



<p class="wp-block-paragraph">Le contournement TPM et Secure Boot se fait en dur, via des clés de registre LabConfig écrites pendant la phase WinPE. C&rsquo;est ce qui évite d&rsquo;avoir à configurer un vTPM chiffré dans VMware, une vraie galère.</p>



<p class="wp-block-paragraph">[CODE : autounattend.xml (extrait bypass)]</p>



<p class="wp-block-paragraph">xml</p>



<pre class="wp-block-code"><code>&lt;RunSynchronous&gt;
  &lt;RunSynchronousCommand wcm:action="add"&gt;
    &lt;Order&gt;1&lt;/Order&gt;
    &lt;Path&gt;reg add "HKLM\System\Setup\LabConfig" /v BypassTPMCheck /t REG_DWORD /d 1 /f&lt;/Path&gt;
  &lt;/RunSynchronousCommand&gt;
  &lt;!-- idem pour BypassSecureBootCheck, BypassRAMCheck, BypassCPUCheck, BypassStorageCheck --&gt;
&lt;/RunSynchronous&gt;</code></pre>



<p class="wp-block-paragraph">Et voilà le piège numéro deux, un des plus vicieux. Sur mon premier build correct, l&rsquo;install s&rsquo;est déroulée, puis au premier reboot, écran bleu d&rsquo;erreur : « The computer restarted unexpectedly ». Plantage en phase specialize.</p>



<p class="wp-block-paragraph">La cause était planquée dans <code>C:\Windows\Panther\setuperr.log</code>, qu&rsquo;on lit avec un Shift+F10 dans la VM. Une ligne : <code>The provided unattend file is not valid</code> sur le composant <code>CEIPEnabled</code>. Cette balise a été <strong>supprimée</strong> de Windows 11 24H2. Elle n&rsquo;existe plus. Et le setup, au lieu de l&rsquo;ignorer, rejette <strong>tout</strong> le fichier autounattend à cause de cette seule ligne obsolète.</p>



<figure class="wp-block-image size-full"><img width="992" height="722"  alt="" class="wp-image-415"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/07/image-21.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/07/image-21.png 992w, https://tazmenworld.com/wp-content/uploads/2026/07/image-21-300x218.png 300w, https://tazmenworld.com/wp-content/uploads/2026/07/image-21-768x559.png 768w" sizes="auto, (max-width: 992px) 100vw, 992px" /></figure>



<p class="wp-block-paragraph">Le truc à retenir : une seule balise obsolète invalide l&rsquo;autounattend entier. Si ton install plante en specialize, lis <code>setuperr.log</code>, il te donne le nom exact du composant fautif. On retire la ligne, et ça repart.</p>



<h3 class="wp-block-heading">V. Valider puis lancer le build</h3>



<p class="wp-block-paragraph">Avant de lancer un build qui va tourner vingt minutes, on valide. <code>packer validate</code> attrape les erreurs de syntaxe et les paramètres manquants en deux secondes, ça évite de découvrir un <code>X is required</code> après dix minutes d&rsquo;install Windows.</p>



<p class="wp-block-paragraph">[CODE : packer-validate.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<pre class="wp-block-code"><code>packer validate .\windows11.pkr.hcl</code></pre>



<p class="wp-block-paragraph">Tu veux lire <code>The configuration is valid.</code>. Si le plugin râle sur un champ obligatoire, tu corriges et tu revalides jusqu&rsquo;à ce que ce soit propre.</p>



<p class="wp-block-paragraph">Ensuite seulement, le build.</p>



<p class="wp-block-paragraph">[CODE : packer-build.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<pre class="wp-block-code"><code>packer build .\windows11.pkr.hcl</code></pre>



<p class="wp-block-paragraph">À partir de là, une fenêtre VMware Workstation s&rsquo;ouvre, la VM boote sur l&rsquo;ISO, et tout s&rsquo;enchaîne sans que tu touches à rien. Surveille juste les premières secondes, le prompt « Press any key to boot from CD » où Packer envoie le <code>&lt;enter&gt;</code>. Si la VM le rate et part dans un shell EFI, augmente <code>boot_wait</code> et relance. C&rsquo;est le réglage le plus capricieux du pipeline.</p>



<h2 class="wp-block-heading">VI. Le DHCP absent, le décrochage WinRM et l&rsquo;APIPA</h2>



<p class="wp-block-paragraph">Une fois Windows installé, Packer attend WinRM pour se connecter. Sur un de mes runs, il est resté bloqué sur <code>Waiting for WinRM to become available</code> sans fin, sans message d&rsquo;erreur. Le genre de blocage silencieux qui te fait perdre une heure.</p>



<p class="wp-block-paragraph">WinRM tournait pourtant dans la VM, le port 5985 répondait en local. Mais depuis l&rsquo;hôte, rien. La cause : la VM avait une adresse en <code>169.254.x.x</code>. Du <strong>APIPA</strong>. Autrement dit, elle n&rsquo;avait pas reçu de bail DHCP, parce que le service DHCP de VMware était désactivé sur mon poste. Sans IP routable, Packer ne peut pas la joindre.</p>



<figure class="wp-block-image size-full"><img width="857" height="572"  alt="" class="wp-image-421"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/07/image-22.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/07/image-22.png 857w, https://tazmenworld.com/wp-content/uploads/2026/07/image-22-300x200.png 300w, https://tazmenworld.com/wp-content/uploads/2026/07/image-22-768x513.png 768w" sizes="auto, (max-width: 857px) 100vw, 857px" /></figure>



<p class="wp-block-paragraph">La réactivation du service DHCP côté hôte règle le problème.</p>



<p class="wp-block-paragraph">[CODE : fix-dhcp.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<pre class="wp-block-code"><code>Start-Service VMnetDHCP
Set-Service VMnetDHCP -StartupType Automatic</code></pre>



<p class="wp-block-paragraph">Note bien ce piège : un <code>Waiting for WinRM</code> qui ne finit jamais, ce n&rsquo;est presque jamais WinRM. C&rsquo;est le réseau. Vérifie l&rsquo;IP de la VM en premier. Et méfie-toi du ping : le pare-feu Windows bloque l&rsquo;ICMP par défaut, donc un ping qui échoue ne prouve rien. Le vrai test, c&rsquo;est le port, avec <code>Test-NetConnection -Port 5985</code>.</p>



<h2 class="wp-block-heading">VII. Les provisioners : Tools, langue, applis, et les reboots</h2>



<p class="wp-block-paragraph">On arrive au coeur du build. Le bloc <code>build</code> enchaîne les scripts PowerShell, avec des reboots entre les étapes sensibles. Et non, ces reboots ne sont pas gérés par Boxstarter, mais par le provisioner natif <code>windows-restart</code> de Packer. J&rsquo;y reviens juste après, c&rsquo;est important.</p>



<p class="wp-block-paragraph">[CODE : windows11.pkr.hcl (extrait build)]</p>



<p class="wp-block-paragraph">hcl</p>



<pre class="wp-block-code"><code>build {
  sources = &#91;"source.vmware-iso.win11"]

  provisioner "powershell" {
    scripts          = &#91;"./scripts/install-vmware-tools.ps1"]
    valid_exit_codes = &#91;0, 3010]
  }
  provisioner "windows-restart" {}

  provisioner "powershell" {
    scripts = &#91;"./scripts/setup-language-french.ps1"]
  }
  provisioner "windows-restart" {}

  provisioner "powershell" {
    scripts = &#91;"./scripts/install-choco-packages.ps1"]
  }
}</code></pre>



<h3 class="wp-block-heading">Les VMware Tools : oublie l&rsquo;upload WinRM, passe par choco</h3>



<p class="wp-block-paragraph">Première approche, j&rsquo;ai voulu faire uploader l&rsquo;ISO des Tools par Packer, via l&rsquo;option <code>tools_upload</code>. Mauvaise idée. L&rsquo;upload de fichiers par WinRM est <strong>lent et fragile</strong>. Sur une ISO de 130 Mo, il a bloqué complètement, rien n&rsquo;atterrissait dans la VM, dix minutes pour zéro octet écrit.</p>



<p class="wp-block-paragraph">La parade est plus simple et plus reproductible : installer les Tools par Chocolatey. Le package existe, il télécharge depuis le dépôt Broadcom, pas de gros transfert WinRM, pas de dépendance au chemin de ton install Workstation.</p>



<p class="wp-block-paragraph">[CODE : install-vmware-tools.ps1 (extrait)]</p>



<p class="wp-block-paragraph">powershell</p>



<pre class="wp-block-code"><code>choco install vmware-tools -y --no-progress</code></pre>



<p class="wp-block-paragraph">Le truc à retenir : pour tout artefact un peu lourd, le gestionnaire de paquets bat l&rsquo;upload WinRM. C&rsquo;est plus robuste, point.</p>



<h3 class="wp-block-heading">Le code 3010 : un succès pris pour une erreur</h3>



<p class="wp-block-paragraph">Piège suivant, et c&rsquo;est un classique Windows. Les VMware Tools s&rsquo;installent nickel, mais choco retourne le code de sortie <strong>3010</strong>. Ce code veut dire « succès, reboot nécessaire ». Or Packer considère par défaut que seul le code <code>0</code> est acceptable. Il prend donc ce 3010 pour un échec et coupe le build.</p>



<p class="wp-block-paragraph">D&rsquo;où le <code>valid_exit_codes = [0, 3010]</code> sur ce provisioner. On dit à Packer que 3010 est un succès valide. Ce code sort tout le temps avec les MSI et les features Windows, à connaître par coeur.</p>



<h3 class="wp-block-heading">La bascule en français, et la leçon la plus chère</h3>



<p class="wp-block-paragraph">Mon idée de départ : installer trois packs de langue, allemand, espagnol et français, puis passer le système en français. Bien pour le spectacle. Sauf que le spectacle m&rsquo;a coûté des heures.</p>



<p class="wp-block-paragraph"><code>Install-Language</code> tire chaque pack depuis Windows Update, plusieurs centaines de Mo, plus les Features on Demand (reconnaissance vocale, écriture manuscrite, OCR). Et ces FODs déclenchent en cascade une maintenance des composants Windows via TrustedInstaller qui <strong>ne finit jamais</strong> dans un délai raisonnable. Sur une image eval fraîche, j&rsquo;ai vu TrustedInstaller à plus de 13000 secondes de CPU, bloqué sur le deuxième pack après 30 minutes.</p>



<figure class="wp-block-image size-full"><img width="975" height="507"  alt="" class="wp-image-411"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/07/image-19.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/07/image-19.png 975w, https://tazmenworld.com/wp-content/uploads/2026/07/image-19-300x156.png 300w, https://tazmenworld.com/wp-content/uploads/2026/07/image-19-768x399.png 768w" sizes="auto, (max-width: 975px) 100vw, 975px" /></figure>



<p class="wp-block-paragraph">La correction, et c&rsquo;est aussi la bonne pratique pour une vraie golden image : une seule langue, le français, et sans les FODs lourds.</p>



<p class="wp-block-paragraph">[CODE : setup-language-french.ps1 (extrait)]</p>



<p class="wp-block-paragraph">powershell</p>



<pre class="wp-block-code"><code># -ExcludeFeatures evite les FODs (Speech, OCR, Handwriting)
# qui saturent TrustedInstaller pendant des heures.
Install-Language fr-FR -CopyToSettings -ExcludeFeatures

Set-WinUserLanguageList -LanguageList fr-FR -Force
Set-WinUILanguageOverride -Language fr-FR
Set-WinSystemLocale fr-FR
Set-SystemPreferredUILanguage fr-FR
Copy-UserInternationalSettingsToSystem -WelcomeScreen $true -NewUser $true</code></pre>



<p class="wp-block-paragraph">Le truc à retenir : ajouter des langues avec tous les FODs, c&rsquo;est le meilleur moyen de rendre ton build ininstallable. Une langue, <code>-ExcludeFeatures</code>, sauf besoin explicite d&rsquo;OCR ou de reconnaissance vocale.</p>



<figure class="wp-block-image size-large"><img width="1024" height="397"  alt="" class="wp-image-417"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/07/packer15-1024x397.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/07/packer15-1024x397.jpg 1024w, https://tazmenworld.com/wp-content/uploads/2026/07/packer15-300x116.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/07/packer15-768x298.jpg 768w, https://tazmenworld.com/wp-content/uploads/2026/07/packer15-1536x595.jpg 1536w, https://tazmenworld.com/wp-content/uploads/2026/07/packer15-2048x793.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Le piège dans le piège : la VM qui s&rsquo;endort</h3>



<p class="wp-block-paragraph">Et le plus vicieux pour la fin, celui que personne ne documente. Même avec <code>-ExcludeFeatures</code>, mon build a décroché à 43 minutes, en plein <code>Install-Language</code>, avec une erreur réseau brute : <code>wsarecv: the connected host has failed to respond</code>. WinRM coupé net.</p>



<p class="wp-block-paragraph">J&rsquo;ai cru à un problème de pile réseau. Faux. La vraie cause : <strong>la VM se mettait en veille.</strong> Pendant qu&rsquo;<code>Install-Language</code> mouline en silence, sans activité clavier ni souris, Windows applique son plan d&rsquo;alimentation et met la machine en veille. Le réseau tombe, Packer perd WinRM, le build meurt.</p>



<figure class="wp-block-image size-full"><img width="595" height="585"  alt="" class="wp-image-412"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/07/image-20.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/07/image-20.png 595w, https://tazmenworld.com/wp-content/uploads/2026/07/image-20-300x295.png 300w" sizes="auto, (max-width: 595px) 100vw, 595px" /></figure>



<p class="wp-block-paragraph">La parade, à mettre en tout premier dans le pipeline : désactiver la veille via <code>powercfg</code>.</p>



<p class="wp-block-paragraph">[CODE : disable-sleep.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<pre class="wp-block-code"><code>powercfg /change standby-timeout-ac 0
powercfg /change standby-timeout-dc 0
powercfg /change monitor-timeout-ac 0
powercfg /change hibernate-timeout-ac 0
powercfg /setactive SCHEME_MIN</code></pre>



<p class="wp-block-paragraph">C&rsquo;est une ligne à mettre dans <strong>n&rsquo;importe quel</strong> pipeline de golden image Windows. Un provisioner long sur une VM qui s&rsquo;endort, ça décroche WinRM sans jamais te dire pourquoi. Note-le bien.</p>



<h3 class="wp-block-heading">Les applis, et le checksum qui casse tout seul</h3>



<p class="wp-block-paragraph">Dernier provisioner, les cinq applis via choco. Au départ, ma liste incluait Google Chrome. Erreur. Le package Chrome sur Chocolatey embarque un checksum figé du MSI, mais Google écrase le même fichier à chaque nouvelle version. Résultat, dès que le package est en retard d&rsquo;une release, le checksum ne correspond plus et l&rsquo;install échoue : <code>hashes do not match</code>.</p>



<p class="wp-block-paragraph">Pour un build reproductible, un paquet qui casse au gré des sorties de Google, c&rsquo;est exactement ce qu&rsquo;on ne veut pas. Je l&rsquo;ai remplacé par <strong>Firefox</strong>, qui n&rsquo;a pas ce souci. Et j&rsquo;ai rendu le script tolérant : un paquet qui échoue est loggé, mais ne fait plus planter tout le build.</p>



<p class="wp-block-paragraph">[CODE : install-choco-packages.ps1 (extrait)]</p>



<p class="wp-block-paragraph">powershell</p>



<pre class="wp-block-code"><code>$packages = @("7zip","notepadplusplus","firefox","git","vscode")
$failed = @()
foreach ($pkg in $packages) {
    choco install $pkg -y --no-progress
    if ($LASTEXITCODE -ne 0 -and $LASTEXITCODE -ne 3010) {
        Write-Warning "Echec de $pkg (code $LASTEXITCODE)"
        $failed += $pkg
    }
}</code></pre>



<h2 class="wp-block-heading">VIII. Et Boxstarter dans tout ça ?</h2>



<p class="wp-block-paragraph">J&rsquo;ai gardé Boxstarter pour la fin, parce que c&rsquo;est la nuance la plus honnête de cet article. Mon idée initiale était d&rsquo;utiliser Boxstarter pour gérer les reboots entre les étapes. Bonne intuition sur le papier, mais mauvaise dans un contexte Packer.</p>



<p class="wp-block-paragraph">Boxstarter gère les reboots via un autologon et une reprise du script en session interactive. Packer, lui, pilote la VM en WinRM, session <strong>non interactive</strong>. Quand Boxstarter reboote, la connexion WinRM de Packer tombe, et Packer ne voit pas la reprise Boxstarter qui se joue dans la session autologon. Les deux ne se coordonnent pas.</p>



<p class="wp-block-paragraph">En clair : dans un build Packer, l&rsquo;outil pour les reboots, c&rsquo;est <code>windows-restart</code>. Pas Boxstarter. Boxstarter brille quand tu provisionnes une machine <strong>en direct</strong>, hors Packer, par exemple un poste physique où tu veux enchaîner des installs qui rebootent et reprendre toutes seules.</p>



<p class="wp-block-paragraph">C&rsquo;est ça, la vraie leçon : deux outils qui semblent faire la même chose, mais chacun a son terrain. Je détaillerai le vrai cas d&rsquo;usage de Boxstarter, packs de langue et reboots en cascade sur une machine directe, dans un article séparé. Il mérite sa propre démo.</p>



<h2 class="wp-block-heading">Ce que je retiens</h2>



<p class="wp-block-paragraph">Le build final tourne d&rsquo;un bout à l&rsquo;autre sans intervention. Windows installé, VMware Tools, système en français, cinq applis, arrêt propre, image compactée. Voilà les chiffres, sans enjoliver.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Étape</th><th>Durée constatée</th></tr></thead><tbody><tr><td>Build de base (Windows + Tools + 5 applis)</td><td><strong>~24 min</strong></td></tr><tr><td>Même build avec 3 langues + FODs</td><td>décrochage à 43 min, jamais fini</td></tr><tr><td>Avec 1 langue et <code>-ExcludeFeatures</code></td><td>build qui repasse au vert</td></tr><tr><td>Gain du cache ISO sur les runs suivants</td><td>ISO déjà vérifiée, non retéléchargée</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Et la liste des pièges, parce que c&rsquo;est ça le vrai contenu de ce tuto, pas le template :</p>



<ul class="wp-block-list">
<li>Le contrôleur disque en <strong>SATA</strong>, sinon Windows ne voit aucun disque.</li>



<li>La balise <strong>CEIPEnabled</strong> obsolète en 24H2, qui invalide tout l&rsquo;autounattend.</li>



<li>Le <strong>DHCP VMware</strong> désactivé, qui envoie la VM en APIPA et bloque WinRM sans erreur claire.</li>



<li>Le code <strong>3010</strong> à whitelister, un succès pris pour un échec.</li>



<li>L&rsquo;<strong>upload WinRM</strong> d&rsquo;ISO qui bloque, à remplacer par choco.</li>



<li>Les <strong>FODs de langue</strong> qui saturent TrustedInstaller pendant des heures.</li>



<li>La <strong>veille</strong> de la VM qui décroche WinRM en plein provisioner long.</li>



<li>Le <strong>checksum Chrome</strong> volatil, à remplacer par Firefox.</li>



<li><strong>oscdimg</strong> de l&rsquo;ADK à mettre dans le PATH de façon permanente, sinon chaque console casse le build sur la création du CD.</li>
</ul>



<figure class="wp-block-image size-large"><img width="1024" height="401"  alt="" class="wp-image-416"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/07/packer14-1024x401.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/07/packer14-1024x401.jpg 1024w, https://tazmenworld.com/wp-content/uploads/2026/07/packer14-300x117.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/07/packer14-768x301.jpg 768w, https://tazmenworld.com/wp-content/uploads/2026/07/packer14-1536x601.jpg 1536w, https://tazmenworld.com/wp-content/uploads/2026/07/packer14-2048x801.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Alors, est-ce que Packer vaut le coup pour une golden image Windows ? Oui, sans hésiter. Une fois le template stabilisé, tu reconstruis ton image parfaite en une commande, à l&rsquo;identique, autant de fois que tu veux. C&rsquo;est reproductible, c&rsquo;est versionnable, c&rsquo;est du vrai infrastructure as code.</p>



<p class="wp-block-paragraph">Mais le template propre que tu copies en trois minutes, il cache une journée de pièges que personne ne documente. La reproductibilité se paie une fois, à la mise au point. Après, elle est gratuite. Comme souvent, la vraie valeur n&rsquo;est pas dans la commande magique, elle est dans tout ce qu&rsquo;on ne te montre pas.</p>



<p class="wp-block-paragraph">A bientôt Louis 🐇 🤜 🤛 🐰</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/07/07/construire-une-golden-image-windows-11-avec-packer-chocolatey-et-boxstarter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Packager une application en MSIX pour Azure Virtual Desktop : le guide qui assume les galères</title>
		<link>https://tazmenworld.com/2026/06/29/packager-une-application-en-msix-pour-azure-virtual-desktop-le-guide-qui-assume-les-galeres/</link>
					<comments>https://tazmenworld.com/2026/06/29/packager-une-application-en-msix-pour-azure-virtual-desktop-le-guide-qui-assume-les-galeres/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Mon, 29 Jun 2026 17:47:35 +0000</pubDate>
				<category><![CDATA[VDI]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=359</guid>

					<description><![CDATA[Tu vas tomber, en cherchant « MSIX App Attach », sur des dizaines de tutos qui te font croire que c&#8217;est trois clics dans un assistant. Tu lances MSIX Packaging Tool, tu cliques Next cinq fois, et hop, ton .msix est prêt. Sauf que c&#8217;est faux. Enfin, à moitié. L&#8217;assistant existe vraiment, et il fait bien le [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="572"  alt="" class="wp-image-383"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/msix-1024x572.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/msix-1024x572.jpg 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/msix-300x168.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/msix-768x429.jpg 768w, https://tazmenworld.com/wp-content/uploads/2026/06/msix-1536x858.jpg 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/msix.jpg 1757w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Tu vas tomber, en cherchant « MSIX App Attach », sur des dizaines de tutos qui te font croire que c&rsquo;est trois clics dans un assistant. Tu lances MSIX Packaging Tool, tu cliques Next cinq fois, et hop, ton <code>.msix</code> est prêt.</p>



<p class="wp-block-paragraph">Sauf que c&rsquo;est faux. Enfin, à moitié.</p>



<p class="wp-block-paragraph">L&rsquo;assistant existe vraiment, et il fait bien le boulot. Le souci, c&rsquo;est tout ce qu&rsquo;il y a autour : le certificat de signature qui doit correspondre au pixel près au nom de l&rsquo;éditeur, le <code>0x8bad0001</code> que crache <code>msixmgr</code> quand la chaîne de confiance n&rsquo;est pas en place, le runtime Windows App SDK qui manque au moment de tester le package, et la source Microsoft Store de winget qui te claque un <code>0x8a15005e</code> à la figure sur une VM Azure. Aucun de ces pièges n&rsquo;est documenté côté à côté en français.</p>



<p class="wp-block-paragraph">Je viens de me les manger tous, dans l&rsquo;ordre, sur une VM de packaging Azure. Alors je te déroule le process complet : créer un package MSIX de A à Z avec <strong>Notepad++</strong> comme cobaye, jusqu&rsquo;au CIM prêt à attacher. Avec les pièges annoncés avant qu&rsquo;ils ne tombent.</p>



<p class="wp-block-paragraph">Une précision tout de suite : cet article s&rsquo;arrête au <strong>package</strong>. L&rsquo;attachement réel sur un host pool AVD (le storage Azure Files, les permissions SMB, la registration App Attach) mérite son propre guide, je le traiterai séparément. Ici, on fabrique l&rsquo;artefact. C&rsquo;est déjà bien assez pour un article.</p>



<h2 class="wp-block-heading">Pourquoi Notepad++ et pas 7-Zip ou un truc plus lourd</h2>



<p class="wp-block-paragraph">Petit aparté de méthode, parce que le choix de l&rsquo;app cobaye n&rsquo;est pas anodin.</p>



<p class="wp-block-paragraph">App Attach a une raison d&rsquo;être précise : livrer une application <strong>sans la coller dans le golden image</strong>. Typiquement une app volumineuse, licenciée par département, ou mise à jour souvent. Sur le papier, n&rsquo;importe quelle app fait l&rsquo;affaire pour un lab. En pratique, certaines sont de mauvais cobayes.</p>



<p class="wp-block-paragraph">7-Zip, par exemple, c&rsquo;est tentant parce que c&rsquo;est léger. Mais c&rsquo;est un mauvais exemple pédagogique : gratuit, 5 Mo, utile à tout le monde. Personne ne mettrait jamais ça en App Attach dans la vraie vie, tu l&rsquo;installes direct dans l&rsquo;image en trente secondes.</p>



<p class="wp-block-paragraph"><strong>Notepad++</strong> est un bien meilleur choix, pour trois raisons :</p>



<ul class="wp-block-list">
<li>Il se capture proprement. Installeur MSI simple, pas de services Windows, pas de drivers exotiques.</li>



<li>Il représente le cas réel « outil bureautique livré par groupe d&rsquo;utilisateurs ».</li>



<li>Depuis la <strong>v8.8.8, Notepad++ fournit un MSI x64</strong> officiel pour le déploiement entreprise. Et un MSI se capture toujours plus proprement qu&rsquo;un <code>.exe</code> à assistant graphique.</li>
</ul>



<p class="wp-block-paragraph">Au moment où j&rsquo;écris, la version stable est la <strong>8.9.6.4</strong>. C&rsquo;est celle qu&rsquo;on va packager.</p>



<h2 class="wp-block-heading">Le matériel : ce qu&rsquo;il te faut avant de commencer</h2>



<p class="wp-block-paragraph">On part d&rsquo;une <strong>VM de packaging propre</strong>. Le mot « propre » est important : pas de Notepad++ déjà installé dessus, idéalement un snapshot pris avant de commencer pour pouvoir revenir en arrière. MSIX Packaging Tool capture les changements du système pendant l&rsquo;installation. Si l&rsquo;app est déjà là, la capture est faussée.</p>



<p class="wp-block-paragraph">Voici les prérequis, et où je me suis fait avoir sur chacun :</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Élément</th><th>Détail</th><th>Le piège</th></tr></thead><tbody><tr><td>VM de packaging</td><td>Windows 10/11, hors domaine acceptée</td><td>Doit être propre, snapshot avant</td></tr><tr><td>MSIX Packaging Tool</td><td>via winget</td><td>La source <code>msstore</code> plante sur VM Azure</td></tr><tr><td>msixmgr.exe</td><td><code>https://aka.ms/msixmgr</code></td><td>Refuse de dépaqueter si le cert n&rsquo;est pas trusté</td></tr><tr><td>Certificat de signature</td><td>auto-signé OK en lab</td><td>Le subject doit matcher le Publisher au caractère près</td></tr><tr><td>Windows App Runtime</td><td>dépendance du package</td><td>Manque au test local, à installer à part</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">On y va dans l&rsquo;ordre.</p>



<h2 class="wp-block-heading">I. Installer MSIX Packaging Tool (et le piège msstore)</h2>



<p class="wp-block-paragraph">L&rsquo;outil s&rsquo;installe via winget. Première commande, premier mur :</p>



<p class="wp-block-paragraph">[CODE : install_msixtool.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>winget install Microsoft.MSIXPackagingTool</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">winget install Microsoft.MSIXPackagingTool</span></span></code></pre></div>



<p class="wp-block-paragraph">Et là, sur ma VM Azure, je me prends ça :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Failed when searching source: msstore
0x8a15005e : The server certificate did not match any of the expected values.</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">Failed when searching source: msstore</span></span>
<span class="line"><span style="color: #B48EAD">0x8a15005e</span><span style="color: #D8DEE9FF"> : The server certificate did not match any of the expected values.</span></span></code></pre></div>



<p class="wp-block-paragraph">Le souci, c&rsquo;est que winget interroge deux sources : <code>winget</code> et <code>msstore</code>. Sur une VM Azure, l&rsquo;accès au Microsoft Store est souvent restreint ou cassé côté certificat, et c&rsquo;est <code>msstore</code> qui fait planter la commande. Or le package est dispo sur la source <code>winget</code>, qui elle fonctionne.</p>



<p class="wp-block-paragraph">La parade, c&rsquo;est de forcer la source :</p>



<p class="wp-block-paragraph">[CODE : install_msixtool_fix.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>winget install Microsoft.MSIXPackagingTool --source winget</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">winget install Microsoft.MSIXPackagingTool </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF">source winget</span></span></code></pre></div>



<p class="wp-block-paragraph">Et là ça passe, propre.</p>



<figure class="wp-block-image size-large"><img width="1024" height="349"  alt="" class="wp-image-361"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/MSIXPackagingtool-1024x349.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/MSIXPackagingtool-1024x349.jpg 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/MSIXPackagingtool-300x102.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/MSIXPackagingtool-768x262.jpg 768w, https://tazmenworld.com/wp-content/uploads/2026/06/MSIXPackagingtool.jpg 1393w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Note le message en fin d&rsquo;install : l&rsquo;outil te prévient que le <strong>MSIX Packaging Tool Driver</strong> doit être activé séparément dans les fonctionnalités Windows. Bonne nouvelle, l&rsquo;outil sait l&rsquo;activer tout seul à son premier lancement. Mauvaise nouvelle, il peut s&rsquo;y reprendre à deux fois. On verra ça à l&rsquo;étape III, pas la peine de s&rsquo;en occuper maintenant.</p>



<h2 class="wp-block-heading">II. Le certificat de signature : là où tout le monde se plante</h2>



<p class="wp-block-paragraph">Un package MSIX doit être signé. En production tu utilises ta PKI interne ou un certificat public. En lab, un certificat auto-signé suffit, à condition de respecter une règle d&rsquo;or que je te donne tout de suite, parce que c&rsquo;est elle qui m&rsquo;a coûté le plus de temps.</p>



<p class="wp-block-paragraph"><strong>Le subject du certificat doit correspondre exactement au Publisher name du package.</strong> Au caractère près. Si ton cert dit <code>CN=Tazmen Lab, O=Tazmen, C=World</code>, ton Publisher dans MSIX Packaging Tool doit dire exactement la même chose. La moindre virgule de travers, et la signature échoue.</p>



<p class="wp-block-paragraph">On génère le certificat en PowerShell, en admin :</p>



<p class="wp-block-paragraph">[CODE : new_cert.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># Crée le dossier de travail
New-Item -ItemType Directory -Path "C:\Tools" -Force

# Génère le certificat auto-signé
$cert = New-SelfSignedCertificate `
  -Type CodeSigningCert `
  -Subject "CN=Tazmen Lab, O=Tazmen, C=World" `
  -KeyUsage DigitalSignature `
  -FriendlyName "MSIX Lab Signing" `
  -CertStoreLocation "Cert:\CurrentUser\My" `
  -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")

# Exporte le .pfx (pour signer) et le .cer (pour la confiance)
$pwd = ConvertTo-SecureString -String "TonMotDePasse123!" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath "C:\Tools\MSIXLabCert.pfx" -Password $pwd
Export-Certificate -Cert $cert -FilePath "C:\Tools\MSIXLabCert.cer"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88"># Crée le dossier de travail</span></span>
<span class="line"><span style="color: #88C0D0">New-Item</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">ItemType Directory </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Path </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Tools</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Force</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># Génère le certificat auto-signé</span></span>
<span class="line"><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">cert</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">New-SelfSignedCertificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Type CodeSigningCert </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Subject </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">CN=Tazmen Lab, O=Tazmen, C=World</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">KeyUsage DigitalSignature </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">FriendlyName </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">MSIX Lab Signing</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">CertStoreLocation </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Cert:\CurrentUser\My</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">TextExtension </span><span style="color: #81A1C1">@</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">2.5.29.37={text}1.3.6.1.5.5.7.3.3</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">2.5.29.19={text}</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># Exporte le .pfx (pour signer) et le .cer (pour la confiance)</span></span>
<span class="line"><span style="color: #81A1C1">$</span><span style="color: #D8DEE9FF">pwd </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">ConvertTo-SecureString</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">String </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">TonMotDePasse123!</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Force </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">AsPlainText</span></span>
<span class="line"><span style="color: #88C0D0">Export-PfxCertificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Cert </span><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">cert</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">FilePath </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Tools\MSIXLabCert.pfx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Password </span><span style="color: #81A1C1">$</span><span style="color: #D8DEE9FF">pwd</span></span>
<span class="line"><span style="color: #88C0D0">Export-Certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Cert </span><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">cert</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">FilePath </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Tools\MSIXLabCert.cer</span><span style="color: #ECEFF4">&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">Le <code>.pfx</code> contient la clé privée, il sert à <strong>signer</strong>. Le <code>.cer</code> ne contient que la partie publique, il sert à <strong>faire confiance</strong> au package sur les machines cibles.</p>



<p class="wp-block-paragraph">Je te préviens sur deux pièges vécus :</p>



<p class="wp-block-paragraph"><strong>Piège 1 : la variable <code>$cert</code> meurt avec la session.</strong> Si tu fermes PowerShell entre la création du cert et l&rsquo;export, <code>$cert</code> est vide et l&rsquo;export plante avec <code>Cannot bind argument to parameter 'Cert' because it is null</code>. Garde la même fenêtre PowerShell ouverte du début à la fin, ou regénère le cert dans la nouvelle session.</p>



<p class="wp-block-paragraph"><strong>Piège 2 : le dossier de destination doit exister.</strong> Si <code>C:\Tools</code> n&rsquo;existe pas, l&rsquo;export te sort un <code>Le chemin d'accès spécifié est introuvable. (0x80070003)</code>. D&rsquo;où le <code>New-Item</code> en première ligne. Ça paraît évident écrit comme ça, mais sur le moment on cherche midi à quatorze heures.</p>



<h2 class="wp-block-heading">III. La capture MSIX, écran par écran</h2>



<p class="wp-block-paragraph">Lance <strong>MSIX Packaging Tool</strong> depuis le menu Démarrer. Choisis <strong>Create package</strong>, puis <strong>Create your package on this computer</strong>.</p>



<figure class="wp-block-image size-full"><img width="978" height="737"  alt="" class="wp-image-368"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage-1.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage-1.jpg 978w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage-1-300x226.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage-1-768x579.jpg 768w" sizes="auto, (max-width: 978px) 100vw, 978px" /></figure>



<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">Prepare computer</h3>



<p class="wp-block-paragraph">L&rsquo;outil vérifie l&rsquo;environnement. C&rsquo;est ici qu&rsquo;il installe le <strong>MSIX Packaging Tool Driver</strong> si besoin. Le « Checking&#8230; » peut traîner une minute ou deux, laisse-le faire.</p>



<p class="wp-block-paragraph">Deux lignes à regarder sur cet écran. <strong>Windows Update is active</strong> : l&rsquo;outil va le désactiver temporairement pendant la capture, c&rsquo;est normal et voulu. <strong>Pending reboot</strong> : si ta VM a un redémarrage en attente, l&rsquo;outil peut le réclamer. Le cas échéant, redémarre et relance.</p>



<figure class="wp-block-image size-full"><img width="980" height="740"  alt="" class="wp-image-367"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage2.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage2.jpg 980w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage2-300x227.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage2-768x580.jpg 768w" sizes="auto, (max-width: 980px) 100vw, 980px" /></figure>



<h3 class="wp-block-heading">Select installer</h3>



<p class="wp-block-paragraph">Trois champs à remplir :</p>



<ul class="wp-block-list">
<li><strong>Installer</strong> : pointe vers ton MSI Notepad++. Tu le télécharges d&rsquo;abord avec <code>Invoke-WebRequest</code> depuis la release GitHub officielle.</li>



<li><strong>Installer arguments</strong> : mets <code>/quiet /norestart</code> pour une install silencieuse.</li>



<li><strong>Signing preference</strong> : choisis <strong>Sign with a certificate (.pfx)</strong> et sélectionne ton <code>MSIXLabCert.pfx</code> avec son mot de passe.</li>
</ul>



<p class="wp-block-paragraph">[CODE : download_npp.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$url = "https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.9.6.4/npp.8.9.6.4.Installer.x64.msi"
Invoke-WebRequest -Uri $url -OutFile "C:\Temp\npp8964.msi"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">url</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.9.6.4/npp.8.9.6.4.Installer.x64.msi</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #88C0D0">Invoke-WebRequest</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Uri </span><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">url</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">OutFile </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Temp\npp8964.msi</span><span style="color: #ECEFF4">&quot;</span></span></code></pre></div>



<figure class="wp-block-image size-full"><img width="982" height="740"  alt="" class="wp-image-366"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage4.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage4.jpg 982w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage4-300x226.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage4-768x579.jpg 768w" sizes="auto, (max-width: 982px) 100vw, 982px" /></figure>



<h3 class="wp-block-heading">Package information</h3>



<p class="wp-block-paragraph">C&rsquo;est l&rsquo;écran sensible. Souviens-toi de la règle d&rsquo;or : le <strong>Publisher name doit matcher le subject du certificat</strong>.</p>



<figure class="wp-block-image size-full"><img width="977" height="737"  alt="" class="wp-image-365"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage5.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage5.jpg 977w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage5-300x226.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage5-768x579.jpg 768w" sizes="auto, (max-width: 977px) 100vw, 977px" /></figure>



<p class="wp-block-paragraph">Quelques remarques sur les champs :</p>



<ul class="wp-block-list">
<li><strong>Package name</strong> : pas de caractères spéciaux. <code>Notepad++(x64)</code> est <strong>refusé</strong> (les <code>+</code> et les parenthèses ne passent pas). Mets <code>NotepadPlusPlus</code>.</li>



<li><strong>Package display name</strong> : là tu peux mettre <code>Notepad++ (x64)</code>, c&rsquo;est juste l&rsquo;affichage.</li>



<li><strong>Publisher name</strong> : exactement le subject du cert. L&rsquo;outil affiche d&rsquo;ailleurs « Subject of the certificate provided » à côté, pour te rappeler la contrainte.</li>



<li><strong>Version</strong> : attention, l&rsquo;outil pré-remplit souvent une version tronquée du genre <code>8.9.6.0</code>. La vraie version Notepad++ est <code>8.9.6.4</code>. Corrige le dernier champ. Petit aveu : je ne l&rsquo;ai pas fait sur le coup, mon package est sorti en <code>8.9.6.0</code>. Ce n&rsquo;est pas bloquant pour un lab, mais en prod tu veux que la version du package colle à la version réelle de l&rsquo;app.</li>
</ul>



<h3 class="wp-block-heading">Accelerator</h3>



<p class="wp-block-paragraph">Cet écran sert aux templates de conversion pré-configurés. Tu n&rsquo;en as pas besoin pour Notepad++. <strong>Next</strong>, sans rien renseigner.</p>



<figure class="wp-block-image size-full"><img width="977" height="733"  alt="" class="wp-image-364"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage6.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage6.jpg 977w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage6-300x225.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage6-768x576.jpg 768w" sizes="auto, (max-width: 977px) 100vw, 977px" /></figure>



<h3 class="wp-block-heading">Installation</h3>



<p class="wp-block-paragraph">L&rsquo;installeur MSI tourne en arrière-plan, en mode capture. Tu ne verras pas forcément l&rsquo;assistant graphique de Notepad++, c&rsquo;est normal, le <code>/quiet</code> fait son office. L&rsquo;écran te propose un <strong>Restart machine</strong> : <strong>ne clique pas dessus</strong>, Notepad++ n&rsquo;a pas besoin de redémarrage. <strong>Next</strong>.</p>



<figure class="wp-block-image size-full"><img width="982" height="743"  alt="" class="wp-image-370"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage7.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage7.jpg 982w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage7-300x227.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage7-768x581.jpg 768w" sizes="auto, (max-width: 982px) 100vw, 982px" /></figure>



<h3 class="wp-block-heading">First launch tasks</h3>



<p class="wp-block-paragraph">L&rsquo;outil a détecté <code>notepad++.exe</code> automatiquement, avec le bon chemin et l&rsquo;icône. Clique sur <strong>Run</strong> pour lancer Notepad++. C&rsquo;est l&rsquo;étape de validation : l&rsquo;app doit s&rsquo;ouvrir normalement. Vérifie qu&rsquo;elle démarre, puis <strong>ferme-la</strong>.</p>



<figure class="wp-block-image size-full"><img width="976" height="736"  alt="" class="wp-image-371"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage8.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage8.jpg 976w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage8-300x226.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage8-768x579.jpg 768w" sizes="auto, (max-width: 976px) 100vw, 976px" /></figure>



<p class="wp-block-paragraph">Une popup « Are you done? » apparaît. Tu as lancé l&rsquo;app, c&rsquo;est tout ce qu&rsquo;il fallait capturer. Clique <strong>Yes, move on</strong>.</p>



<figure class="wp-block-image size-large"><img width="1024" height="568"  alt="" class="wp-image-378"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage9-1-1024x568.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage9-1-1024x568.jpg 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage9-1-300x166.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage9-1-768x426.jpg 768w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage9-1-1536x852.jpg 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage9-1.jpg 1615w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Package report</h3>



<figure class="wp-block-image size-full"><img width="977" height="741"  alt="" class="wp-image-375"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage12.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage12.jpg 977w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage12-300x228.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage12-768x582.jpg 768w" sizes="auto, (max-width: 977px) 100vw, 977px" /></figure>



<p class="wp-block-paragraph"><strong>No services were detected</strong> : parfait pour Notepad++. Aucun service Windows à embarquer, le package reste propre. C&rsquo;est exactement pour ça que Notepad++ est un bon cobaye. <strong>Next</strong>.</p>



<h3 class="wp-block-heading">Create package</h3>



<p class="wp-block-paragraph">Dernière ligne droite. Change le <strong>Save location</strong> pour quelque chose de propre, par exemple <code>C:\Temp\</code>, plutôt que le Desktop par défaut. Puis <strong>Create</strong>.</p>



<figure class="wp-block-image size-full"><img width="977" height="737"  alt="" class="wp-image-376"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage13.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage13.jpg 977w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage13-300x226.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage13-768x579.jpg 768w" sizes="auto, (max-width: 977px) 100vw, 977px" /></figure>



<p class="wp-block-paragraph">Et voilà :</p>



<figure class="wp-block-image size-full"><img width="982" height="741"  alt="" class="wp-image-377"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage14.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage14.jpg 982w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage14-300x226.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage14-768x580.jpg 768w" sizes="auto, (max-width: 982px) 100vw, 982px" /></figure>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Package successfully created
C:\Temp\NotepadPlusPlus_8.9.6.0_x64__74sz6hfr72mwy.msix</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">Package successfully created</span></span>
<span class="line"><span style="color: #D8DEE9FF">C:\Temp\NotepadPlusPlus_8.</span><span style="color: #B48EAD">9.6</span><span style="color: #D8DEE9FF">.0_x64__74sz6hfr72mwy.msix</span></span></code></pre></div>



<p class="wp-block-paragraph">Le <code>.msix</code> signé est sur le disque. Première moitié du boulot faite.</p>



<h2 class="wp-block-heading">IV. Du MSIX au CIM avec msixmgr (et le fameux 0x8bad0001)</h2>



<p class="wp-block-paragraph">Pour App Attach, le <code>.msix</code> ne suffit pas. Il faut le « dépaqueter » dans une <strong>image disque</strong> que les session hosts monteront dynamiquement. Deux formats existent : VHDX et CIM. Microsoft recommande <strong>CIM</strong> : montage plus rapide, moins de CPU et de RAM consommés, surtout sur Windows 11. On part là-dessus.</p>



<p class="wp-block-paragraph">L&rsquo;outil pour ça, c&rsquo;est <code>msixmgr</code>, qu&rsquo;on télécharge sur le lien court Microsoft :</p>



<p class="wp-block-paragraph">[CODE : get_msixmgr.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Invoke-WebRequest -Uri "https://aka.ms/msixmgr" -OutFile "C:\Tools\msixmgr.zip"
Expand-Archive "C:\Tools\msixmgr.zip" -DestinationPath "C:\Tools\msixmgr" -Force</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">Invoke-WebRequest</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Uri </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">https://aka.ms/msixmgr</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">OutFile </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Tools\msixmgr.zip</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #88C0D0">Expand-Archive</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Tools\msixmgr.zip</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">DestinationPath </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Tools\msixmgr</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Force</span></span></code></pre></div>



<p class="wp-block-paragraph">Puis on génère le CIM. Le dossier de destination doit exister, et il faut un sous-dossier dédié parce qu&rsquo;un CIM est composé de <strong>plusieurs fichiers</strong>, pas d&rsquo;un seul :</p>



<p class="wp-block-paragraph">[CODE : create_cim.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>New-Item -ItemType Directory -Path "C:\Temp\CIM\NotepadPlusPlus" -Force

C:\Tools\msixmgr\x64\msixmgr.exe `
  -Unpack `
  -packagePath "C:\Temp\NotepadPlusPlus_8.9.6.0_x64__74sz6hfr72mwy.msix" `
  -destination "C:\Temp\CIM\NotepadPlusPlus\notepadplusplus.cim" `
  -applyACLs `
  -create `
  -fileType CIM `
  -rootDirectory Apps</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">New-Item</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">ItemType Directory </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Path </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Temp\CIM\NotepadPlusPlus</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Force</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">C:\Tools\msixmgr\x64\</span><span style="color: #88C0D0">msixmgr.exe</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Unpack </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">packagePath </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Temp\NotepadPlusPlus_8.9.6.0_x64__74sz6hfr72mwy.msix</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">destination </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Temp\CIM\NotepadPlusPlus\notepadplusplus.cim</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">applyACLs </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">create </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">fileType CIM </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">rootDirectory Apps</span></span></code></pre></div>



<p class="wp-block-paragraph">Et c&rsquo;est là que j&rsquo;ai buté un bon moment. Premier essai :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Successfully created the CIM file: ...notepadplusplus.cim
&#91;WARNING&#93; ... failed to get unpacked. Please try again:
Failed with HRESULT 0x8bad0001 when trying to unpack ...</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">Successfully created the CIM file: ...notepadplusplus.cim</span></span>
<span class="line"><span style="color: #ECEFF4">&#91;</span><span style="color: #81A1C1">WARNING</span><span style="color: #ECEFF4">&#93;</span><span style="color: #D8DEE9FF"> ..</span><span style="color: #81A1C1">.</span><span style="color: #D8DEE9FF"> failed to get unpacked. Please </span><span style="color: #81A1C1">try</span><span style="color: #D8DEE9FF"> again:</span></span>
<span class="line"><span style="color: #D8DEE9FF">Failed with HRESULT </span><span style="color: #B48EAD">0x8bad0001</span><span style="color: #D8DEE9FF"> when trying to unpack ...</span></span></code></pre></div>



<p class="wp-block-paragraph">Le truc vicieux, c&rsquo;est que le CIM <strong>est créé</strong> mais <strong>vide</strong>. Le message « Successfully created » te fait croire que c&rsquo;est bon, alors que le contenu du package n&rsquo;a pas été extrait. Si tu ne lis pas le warning juste en dessous, tu pars avec une coquille vide.</p>



<p class="wp-block-paragraph">Le <code>0x8bad0001</code> veut dire que <code>msixmgr</code> <strong>ne fait pas confiance au certificat</strong> qui a signé le package. Logique : c&rsquo;est un cert auto-signé, Windows ne le connaît pas. Il faut l&rsquo;installer dans les bons magasins de certificats de la machine locale.</p>



<p class="wp-block-paragraph">Première tentative, le magasin <strong>Trusted People</strong> :</p>



<p class="wp-block-paragraph">[CODE : trust_cert_people.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Import-Certificate `
  -FilePath "C:\Tools\MSIXLabCert.cer" `
  -CertStoreLocation "Cert:\LocalMachine\TrustedPeople"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">Import-Certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">FilePath </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Tools\MSIXLabCert.cer</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">CertStoreLocation </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Cert:\LocalMachine\TrustedPeople</span><span style="color: #ECEFF4">&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">J&rsquo;ai relancé <code>msixmgr</code>. Toujours <code>0x8bad0001</code>. Le hic, c&rsquo;est qu&rsquo;un certificat auto-signé est sa propre autorité racine : pour que la chaîne de confiance soit complète, il doit aussi être dans le magasin <strong>Trusted Root Certification Authorities</strong>.</p>



<p class="wp-block-paragraph">[CODE : trust_cert_root.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Import-Certificate `
  -FilePath "C:\Tools\MSIXLabCert.cer" `
  -CertStoreLocation "Cert:\LocalMachine\Root"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">Import-Certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">FilePath </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Tools\MSIXLabCert.cer</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">`</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">CertStoreLocation </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Cert:\LocalMachine\Root</span><span style="color: #ECEFF4">&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">Windows t&rsquo;affiche un avertissement de sécurité à l&rsquo;import dans Root, confirme avec <strong>Oui</strong>. C&rsquo;est normal, tu déclares faire confiance à une autorité que tu viens de créer toi-même.</p>



<p class="wp-block-paragraph">Pour mettre toutes les chances de ton côté, active aussi le mode développeur qui lève les restrictions de signature MSIX en local :</p>



<p class="wp-block-paragraph">[CODE : enable_devmode.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$regPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock"
if (-not (Test-Path $regPath)) { New-Item -Path $regPath -Force | Out-Null }
Set-ItemProperty -Path $regPath -Name "AllowDevelopmentWithoutDevLicense" -Value 1
Set-ItemProperty -Path $regPath -Name "AllowAllTrustedApps" -Value 1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">regPath</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">-not</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">Test-Path</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">regPath</span><span style="color: #ECEFF4">))</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">New-Item</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Path </span><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">regPath</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Force </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Out-Null</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #88C0D0">Set-ItemProperty</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Path </span><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">regPath</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Name </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">AllowDevelopmentWithoutDevLicense</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Value </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #88C0D0">Set-ItemProperty</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Path </span><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">regPath</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Name </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">AllowAllTrustedApps</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Value </span><span style="color: #B48EAD">1</span></span></code></pre></div>



<p class="wp-block-paragraph">Je nettoie le CIM raté, je le regénère, et cette fois :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&#91;Warning&#93; The app ... depends on the following packages to run correctly:
Microsoft.WindowsAppRuntime.1.4
Successfully created the CIM file: C:\Temp\CIM\NotepadPlusPlus\notepadplusplus.cim</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">&#91;</span><span style="color: #81A1C1">Warning</span><span style="color: #ECEFF4">&#93;</span><span style="color: #D8DEE9FF"> The app ..</span><span style="color: #81A1C1">.</span><span style="color: #D8DEE9FF"> depends on the following packages to run correctly:</span></span>
<span class="line"><span style="color: #D8DEE9FF">Microsoft.WindowsAppRuntime.</span><span style="color: #B48EAD">1.4</span></span>
<span class="line"><span style="color: #D8DEE9FF">Successfully created the CIM file: C:\Temp\CIM\NotepadPlusPlus\notepadplusplus.cim</span></span></code></pre></div>



<p class="wp-block-paragraph">Plus de <code>0x8bad0001</code>. Le CIM est rempli pour de bon. Le nouveau warning sur <code>Microsoft.WindowsAppRuntime.1.4</code> est juste informatif, on va le traiter à l&rsquo;étape suivante.</p>



<p class="wp-block-paragraph">En clair, pour qu&rsquo;un CIM se génère vraiment : le cert doit être dans <strong>TrustedPeople ET Root</strong> sur la machine de packaging. Les deux. Note-le bien.</p>



<h2 class="wp-block-heading">V. Tester le package en local (sans host pool)</h2>



<p class="wp-block-paragraph">Pas besoin d&rsquo;un host pool AVD pour valider que ton package fonctionne. Tu peux l&rsquo;installer directement sur la VM de packaging avec <code>Add-AppxPackage</code>. C&rsquo;est même recommandé avant de partir sur le déploiement.</p>



<p class="wp-block-paragraph">[CODE : install_local.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Add-AppxPackage -Path "C:\Temp\NotepadPlusPlus_8.9.6.0_x64__74sz6hfr72mwy.msix"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">Add-AppxPackage</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Path </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C:\Temp\NotepadPlusPlus_8.9.6.0_x64__74sz6hfr72mwy.msix</span><span style="color: #ECEFF4">&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">Et là, dernier piège de la série :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Add-AppxPackage : Deployment failed with HRESULT: 0x80073CF3
... this package depends on a framework that could not be found.
Provide the framework "Microsoft.WindowsAppRuntime.1.4" ...</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">Add-AppxPackage</span><span style="color: #D8DEE9FF"> : Deployment failed with HRESULT: </span><span style="color: #B48EAD">0x80073CF3</span></span>
<span class="line"><span style="color: #D8DEE9FF">..</span><span style="color: #81A1C1">.</span><span style="color: #D8DEE9FF"> this package depends on a framework that could not be found.</span></span>
<span class="line"><span style="color: #D8DEE9FF">Provide the framework </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Microsoft.WindowsAppRuntime.1.4</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> ...</span></span></code></pre></div>



<p class="wp-block-paragraph">C&rsquo;est exactement le warning qu&rsquo;on avait eu en générant le CIM. Notepad++ packagé en MSIX a besoin du <strong>Windows App Runtime 1.4</strong>, qui n&rsquo;est pas présent sur la VM. Il faut l&rsquo;installer à part.</p>



<p class="wp-block-paragraph">Le réflexe <code>Invoke-WebRequest</code> sur <code>aka.ms</code> m&rsquo;a donné un fichier corrompu (« The file or directory is corrupted and unreadable »), et le lien GitHub direct s&rsquo;est fait couper par le réseau de la VM. Ce qui a marché du premier coup, c&rsquo;est encore winget :</p>



<p class="wp-block-paragraph">[CODE : install_runtime.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>winget install Microsoft.WindowsAppRuntime.1.4 --source winget</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">winget install Microsoft.WindowsAppRuntime.</span><span style="color: #B48EAD">1.4</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF">source winget</span></span></code></pre></div>



<figure class="wp-block-image size-large"><img width="1024" height="242"  alt="" class="wp-image-380"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage16-1024x242.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage16-1024x242.jpg 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage16-300x71.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage16-768x181.jpg 768w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage16.jpg 1187w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">60,6 Mo téléchargés, installé. Je relance l&rsquo;install du package, et cette fois Notepad++ apparaît dans le menu Démarrer et se lance comme une app native.</p>



<figure class="wp-block-image size-large"><img width="1024" height="557"  alt="" class="wp-image-382"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage15-1-1024x557.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage15-1-1024x557.jpg 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage15-1-300x163.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage15-1-768x418.jpg 768w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage15-1.jpg 1382w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-full"><img width="740" height="513"  alt="" class="wp-image-381"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage17.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/newpackage17.jpg 740w, https://tazmenworld.com/wp-content/uploads/2026/06/newpackage17-300x208.jpg 300w" sizes="auto, (max-width: 740px) 100vw, 740px" /></figure>



<p class="wp-block-paragraph">Pour le désinstaller après ton test :</p>



<p class="wp-block-paragraph">[CODE : uninstall_local.ps1]</p>



<p class="wp-block-paragraph">powershell</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Get-AppxPackage -Name "NotepadPlusPlus" | Remove-AppxPackage</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">Get-AppxPackage</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">Name </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">NotepadPlusPlus</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Remove-AppxPackage</span></span></code></pre></div>



<p class="wp-block-paragraph">À retenir pour la suite : sur tes session hosts AVD, ce runtime devra <strong>aussi</strong> être présent, soit dans le golden image, soit poussé par Intune ou GPO avant l&rsquo;attachement. Une dépendance manquante côté host, et ton app refusera de démarrer même parfaitement packagée.</p>



<h2 class="wp-block-heading">Ce que je retiens</h2>



<p class="wp-block-paragraph">Le packaging MSIX en lui-même n&rsquo;est pas compliqué. L&rsquo;assistant fait le job. Ce qui coince, c&rsquo;est la chaîne de confiance et les dépendances, et aucun de ces points n&rsquo;est mis en avant dans les tutos « trois clics ».</p>



<p class="wp-block-paragraph">Si tu ne devais retenir que quatre choses :</p>



<ol class="wp-block-list">
<li><strong>Force <code>--source winget</code></strong> sur les VMs Azure, la source msstore est cassée.</li>



<li><strong>Le Publisher name = le subject du cert</strong>, au caractère près, sinon la signature saute.</li>



<li><strong>Le cert auto-signé va dans TrustedPeople ET Root</strong>, sinon <code>msixmgr</code> sort un <code>0x8bad0001</code> et te génère un CIM vide en te faisant croire que tout va bien.</li>



<li><strong>Le Windows App Runtime est une dépendance à installer séparément</strong>, sur la VM de test comme sur les session hosts.</li>
</ol>



<p class="wp-block-paragraph">À ce stade tu as un <code>.msix</code> signé, testé et validé, et un CIM prêt à être attaché. C&rsquo;est tout ce dont tu as besoin pour la suite.</p>



<p class="wp-block-paragraph">Et la suite, justement, c&rsquo;est l&rsquo;attachement réel : monter le CIM sur un Azure Files, gérer les permissions SMB quand tes session hosts sont hors domaine AD classique, et faire la registration App Attach côté host pool. Ça, ça mérite son propre guide, parce que c&rsquo;est un autre niveau de pièges. Je le détaillerai dans un article séparé.</p>



<p class="wp-block-paragraph">A bientôt Louis 🐇 🤜 🤛 🐰</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/06/29/packager-une-application-en-msix-pour-azure-virtual-desktop-le-guide-qui-assume-les-galeres/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Comment remplacer ElevenLabs par XTTS en local et cloner sa propre voix</title>
		<link>https://tazmenworld.com/2026/06/14/comment-remplacer-elevenlabs-par-xtts-en-local-et-cloner-sa-propre-voix/</link>
					<comments>https://tazmenworld.com/2026/06/14/comment-remplacer-elevenlabs-par-xtts-en-local-et-cloner-sa-propre-voix/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Sun, 14 Jun 2026 07:59:48 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=331</guid>

					<description><![CDATA[Soyons clairs dès le départ : je n&#8217;utilise pas ElevenLabs au quotidien. La qualité est au sommet du marché, le clonage de voix est bluffant, et le multilingue tient parfaitement le français. Difficile de faire mieux côté rendu. Mais pour mon usage, l&#8217;abonnement est tout simplement trop cher au regard de ce que j&#8217;en ferais [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="576"  alt="" class="wp-image-340"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/xtts-1024x576.jpeg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/xtts-1024x576.jpeg 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/xtts-300x169.jpeg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/xtts-768x432.jpeg 768w, https://tazmenworld.com/wp-content/uploads/2026/06/xtts-1536x864.jpeg 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/xtts.jpeg 1672w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Soyons clairs dès le départ : je n&rsquo;utilise pas ElevenLabs au quotidien. La qualité est au sommet du marché, le clonage de voix est bluffant, et le multilingue tient parfaitement le français. Difficile de faire mieux côté rendu. Mais pour mon usage, l&rsquo;abonnement est tout simplement trop cher au regard de ce que j&rsquo;en ferais réellement.</p>



<p class="wp-block-paragraph">Le souci, c&rsquo;est qu&rsquo;il m&rsquo;arrive ponctuellement d&rsquo;en avoir besoin. Une voix off propre pour une vidéo, un test de clonage, une narration pour un article. Et là, deux choses bloquent. La première, c&rsquo;est le modèle économique. ElevenLabs fonctionne par abonnement avec un plafond de crédits, et le clonage de voix professionnel, celui qui donne le meilleur résultat, démarre à 22 dollars par mois sur le plan Creator. Le plan gratuit, lui, interdit tout usage commercial et impose une mention ElevenLabs dans tes productions, ce qui le rend inutilisable pour de la monétisation YouTube. Payer un abonnement mensuel pour un besoin occasionnel, ça n&rsquo;a aucun sens.</p>



<p class="wp-block-paragraph">La deuxième, c&rsquo;est la confidentialité. Pour cloner ma propre voix, je dois envoyer un échantillon de ma voix sur les serveurs d&rsquo;une société américaine. Or ta voix, c&rsquo;est une donnée biométrique. <strong>C&rsquo;est ce qu&rsquo;il y a de plus personnel, au même titre qu&rsquo;une empreinte digitale.</strong></p>



<p class="wp-block-paragraph">Alors j&rsquo;ai fait ce que je fais à chaque fois : j&rsquo;ai décidé de rapatrier la capacité sur ma propre machine. L&rsquo;objectif est simple. Avoir à disposition, à tout moment, une synthèse vocale française avec clonage de voix de qualité, sans abonnement, sans plafond, et sans que ma voix ne quitte mon réseau local. Je te préviens tout de suite : sur une carte Blackwell comme la RTX 5070 Ti, l&rsquo;installation par défaut plante. Et le contournement n&rsquo;est documenté nulle part en français. Voici donc le parcours complet, pièges compris.</p>



<h2 class="wp-block-heading">I. La quête de la souveraineté vocale</h2>



<p class="wp-block-paragraph">Pourquoi se compliquer la vie quand un service à 22 dollars par mois fait le travail ? La réponse tient en deux mots : maîtrise et confidentialité. En produisant mes voix sur ma propre station, je ne dépends plus d&rsquo;un quota de crédits, d&rsquo;une connexion internet ou d&rsquo;une politique de conservation que je ne contrôle pas. Et mon échantillon vocal reste chez moi, sur mon disque.</p>



<p class="wp-block-paragraph">Le moteur de tout ça, c&rsquo;est XTTS, le modèle de synthèse vocale de Coqui. Il fait du clonage de voix zero-shot multilingue, français inclus. Tu lui donnes 10 à 30 secondes d&rsquo;un échantillon, il génère ensuite n&rsquo;importe quel texte avec cette voix. Pour le piloter, j&rsquo;utilise AllTalk, un serveur qui enrobe XTTS avec une API compatible OpenAI, une interface web, et la gestion de plusieurs moteurs. C&rsquo;est le projet d&rsquo;<a href="https://github.com/erew123/alltalk_tts">erew123</a> sur GitHub.</p>



<p class="wp-block-paragraph">Ma configuration repose sur le matériel de ma <strong>Tazmen Station</strong> : un processeur <strong>AMD Ryzen 9 9900X</strong> épaulé par une carte <strong>NVIDIA GeForce RTX 5070 Ti</strong> avec <strong>16 Go de VRAM</strong>. Bonne nouvelle, XTTS en inférence ne mobilise qu&rsquo;environ <strong>4 Go de VRAM</strong>. Tu as donc largement la place de le faire cohabiter avec un modèle de langage ou de la génération d&rsquo;images sur la même carte.</p>



<p class="wp-block-paragraph">Le hic, c&rsquo;est que la 5070 Ti est une carte Blackwell. Et c&rsquo;est exactement là que l&rsquo;aventure commence.</p>



<h2 class="wp-block-heading">II. Le piège Blackwell</h2>



<p class="wp-block-paragraph">C&rsquo;est le point qui fait abandonner la moitié des gens, alors autant l&rsquo;attaquer en premier.</p>



<p class="wp-block-paragraph">L&rsquo;installation d&rsquo;AllTalk pose du <strong>PyTorch</strong> compilé pour <strong>CUDA 12.1</strong>. Ce build connaît les architectures GPU jusqu&rsquo;à sm_90, c&rsquo;est-à-dire la génération Hopper. Il ne connaît pas le sm_120 de Blackwell. Résultat concret : au premier chargement du modèle sur le GPU, c&rsquo;est le crash immédiat.</p>



<p class="wp-block-paragraph">Le contournement consiste à remplacer PyTorch par une version <strong>CUDA 12.8</strong>, qui elle gère Blackwell. En pratique, <strong>torch 2.7.0</strong> avec <strong>torchvision</strong> et <strong>torchaudio</strong> alignés sur la même version et le même canal cu128.</p>



<p class="wp-block-paragraph">Attention au piège dans le piège. Si tu installes torch et torchaudio sans verrouiller les versions, pip te choisit un torchaudio incompatible et tu te manges une erreur de symbole au démarrage du type <code>undefined symbol: torch_library_impl</code>. Il faut imposer les trois versions ensemble, dans l&rsquo;environnement Python d&rsquo;AllTalk, une fois l&rsquo;installation de base terminée :</p>



<p class="wp-block-paragraph">[CODE : fix_blackwell_cu128.sh]</p>



<pre class="wp-block-code"><code>pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cu128</code></pre>



<p class="wp-block-paragraph">La vérification immédiate, et celle qui doit devenir un réflexe, c&rsquo;est de confirmer que le GPU est bien vu :</p>



<p class="wp-block-paragraph">[CODE : verif_gpu.sh]</p>



<pre class="wp-block-code"><code>python -c "import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))"</code></pre>



<p class="wp-block-paragraph">Tu dois obtenir <code>2.7.0+cu128</code>, <code>True</code>, et le nom de ta carte. Si tu as ça, le sm_120 est géré et le plus dur est derrière toi.</p>



<figure class="wp-block-image size-large"><img width="1024" height="170"  alt="" class="wp-image-339"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-13-1024x170.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-13-1024x170.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-13-300x50.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-13-768x127.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-13.png 1165w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">III. L&rsquo;installation : attention à la branche</h2>



<p class="wp-block-paragraph">Première erreur que j&rsquo;ai commise, et que tu vas éviter. Le <code>git clone</code> standard tire la branche <code>master</code>, qui correspond à AllTalk <strong>V1</strong>. La V1 n&rsquo;a pas d&rsquo;interface graphique complète, pas de RVC, et son API renvoie les URLs dans un format différent qui casse l&rsquo;intégration avec certains outils. J&rsquo;ai perdu un bon moment dessus avant de comprendre.</p>



<p class="wp-block-paragraph">La version que tu veux, la <strong>V2</strong>, vit sur la branche <code>alltalkbeta</code>. La nuance n&rsquo;est écrite nulle part de façon évidente, alors note la bien :</p>



<p class="wp-block-paragraph">[CODE : install_alltalk_v2.sh]</p>



<pre class="wp-block-code"><code>git clone -b alltalkbeta https://github.com/erew123/alltalk_tts
cd alltalk_tts
chmod +x atsetup.sh
./atsetup.sh</code></pre>



<p class="wp-block-paragraph">Tu choisis l&rsquo;option <strong>Standalone Application</strong>, puis l&rsquo;installation de base. Le script crée un environnement Python isolé et tire toutes les dépendances. C&rsquo;est long, laisse mouliner.</p>



<figure class="wp-block-image size-full"><img width="968" height="701"  alt="" class="wp-image-332"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-12-11-06-51.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-12-11-06-51.png 968w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-12-11-06-51-300x217.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-12-11-06-51-768x556.png 768w" sizes="auto, (max-width: 968px) 100vw, 968px" /></figure>



<p class="wp-block-paragraph">Deux avertissements qui m&rsquo;ont coûté du temps. Au premier lancement, un compte à rebours de 60 secondes télécharge un modèle <strong>Piper</strong> par défaut. Si tu ne fais rien, tu te retrouves avec Piper, qui est un moteur correct mais sans clonage de voix. Choisis bien le moteur <strong>xtts</strong> dans le menu de démarrage. Et surtout, <strong>ne lance jamais AllTalk en root</strong>, sinon ton environnement Python se retrouve avec des fichiers root-owned et tu galères ensuite à chaque commande.</p>



<h2 class="wp-block-heading">IV. Les correctifs de dépendances</h2>



<p class="wp-block-paragraph">Le remplacement de PyTorch chamboule l&rsquo;arbre des dépendances. Trois ajustements à faire, et un bug propre à la branche beta à corriger.</p>



<p class="wp-block-paragraph">Premier point, <strong>setuptools</strong>. La réinstallation de torch monte setuptools en version récente, qui a supprimé le module <code>pkg_resources</code>. Sauf que la version de <strong>librosa</strong> embarquée par XTTS en a encore besoin. Sans ça, crash au démarrage avec <code>ModuleNotFoundError: No module named 'pkg_resources'</code>. Le correctif tient en une ligne :</p>



<p class="wp-block-paragraph">[CODE : fix_setuptools.sh]</p>



<pre class="wp-block-code"><code>pip install "setuptools&lt;81"</code></pre>



<p class="wp-block-paragraph">Deuxième point, les <strong>dépendances système</strong>. Le log d&rsquo;AllTalk te signale trois manques. Le plus important, c&rsquo;est <strong>espeak-ng</strong> : XTTS s&rsquo;en sert pour la phonémisation, ce n&rsquo;est pas optionnel. Les deux autres relèvent du confort, <strong>ffmpeg</strong> pour le transcodage des sorties audio et <strong>libaio</strong> pour faire taire un avertissement :</p>



<p class="wp-block-paragraph">[CODE : fix_deps_systeme.sh]</p>



<pre class="wp-block-code"><code>sudo apt install espeak-ng ffmpeg libaio-dev</code></pre>



<p class="wp-block-paragraph">Troisième point, un <strong>bug propre à la V2 beta</strong>. Quand tu changes de moteur depuis l&rsquo;interface, le code tente un appel chaîné <code>change_engine(...).save()</code> qui plante avec une <code>AttributeError</code>, parce que la méthode ne renvoie pas l&rsquo;objet attendu. On sépare proprement les deux appels :</p>



<p class="wp-block-paragraph">[CODE : patch_change_engine.sh]</p>



<pre class="wp-block-code"><code>sed -i 's/tts_engines_config.change_engine(requested_engine).save()/tts_engines_config.change_engine(requested_engine)\n        tts_engines_config.save()/' ~/alltalk_tts/tts_server.py</code></pre>



<p class="wp-block-paragraph">Une note de dépannage utile. Sur la V1, j&rsquo;avais aussi dû patcher le chargement des modèles à cause du passage de PyTorch 2.6 en <code>weights_only=True</code> par défaut, qui refuse les classes personnalisées de Coqui. Sur la V2, le fork de coqui-tts gère déjà ce cas et le modèle charge sans rien toucher. Si jamais tu vois une <code>UnpicklingError</code> au chargement, c&rsquo;est ce point précis qu&rsquo;il faut corriger.</p>



<h2 class="wp-block-heading">V. Le modèle XTTS et le basculement de moteur</h2>



<p class="wp-block-paragraph">Si le moteur xtts est sélectionné mais que le modèle n&rsquo;a jamais été téléchargé, AllTalk cherche le dossier <code>models/xtts/</code> et ne trouve rien. Tu télécharges le modèle, soit depuis l&rsquo;onglet <strong>TTS Engines Settings</strong> de l&rsquo;interface, soit en ligne de commande depuis le dépôt officiel sur Hugging Face :</p>



<p class="wp-block-paragraph">[CODE : telecharger_modele_xtts.sh]</p>



<pre class="wp-block-code"><code>mkdir -p ~/alltalk_tts/models/xtts/xttsv2_2.0.3
cd ~/alltalk_tts/models/xtts/xttsv2_2.0.3
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/model.pth
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/config.json
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/vocab.json
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/speakers_xtts.pth
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/dvae.pth
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/mel_stats.pth</code></pre>



<p class="wp-block-paragraph">Compte environ 2 Go au total, le fichier <code>model.pth</code> faisant à lui seul près de 1,8 Go. Ensuite, dans l&rsquo;interface, onglet <strong>Generate TTS</strong>, tu passes <strong>Available Engines</strong> sur <strong>xtts</strong> puis tu cliques <strong>Change Model</strong>.</p>



<p class="wp-block-paragraph">L&rsquo;interface web d&rsquo;AllTalk est accessible sur le port 7852, et l&rsquo;API sur le port 7851. C&rsquo;est cette API compatible OpenAI qui te permettra ensuite de brancher XTTS sur tes propres scripts ou sur n8n.</p>



<p class="wp-block-paragraph">Côté performance, sur ma <strong>RTX 5070 Ti</strong>, le modèle charge en 5 à 6 secondes. Et la génération tape entre <strong>0,2 et 0,5 seconde pour une phrase courte</strong>. C&rsquo;est largement sous le temps réel, et franchement comparable à ce que je constatais sur ElevenLabs, sans la latence réseau.</p>



<figure class="wp-block-image size-large"><img width="1024" height="487"  alt="" class="wp-image-341"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-14-1024x487.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-14-1024x487.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-14-300x143.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-14-768x365.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-14.png 1411w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">VI. Cloner sa voix : tout se joue sur l&rsquo;échantillon</h2>



<p class="wp-block-paragraph">C&rsquo;est le coeur du sujet, et c&rsquo;est aussi là que tout le monde se plante. <strong>Le clonage XTTS est aussi bon que ton échantillon. Ni plus, ni moins.</strong> Un clone moyen vient presque toujours d&rsquo;un sample bâclé, pas du modèle.</p>



<p class="wp-block-paragraph">Les règles à respecter pour un bon échantillon :</p>



<ol class="wp-block-list">
<li>Format <strong>mono</strong>, <strong>22050 Hz</strong>, <strong>16 bits</strong>.</li>



<li>Durée de <strong>10 à 30 secondes</strong>. Au-delà de 60 secondes, la qualité ne s&rsquo;améliore plus et l&rsquo;encodage ralentit.</li>



<li>Voix <strong>francophone</strong> si tu veux du français propre. Un locuteur anglophone clone un accent anglais sur ton texte français.</li>



<li><strong>Aucun bruit de fond</strong>, aucune respiration bruyante, aucun raclement de gorge, aucun silence en début ou en fin.</li>



<li><strong>Ton naturel et neutre</strong>. Si ton sample est joyeux ou agressif, le clone le sera aussi.</li>
</ol>



<p class="wp-block-paragraph">Une parenthèse cybersécurité qui devrait te faire réfléchir, parce que ce chiffre n&rsquo;est pas anodin. <strong>10 à 30 secondes de voix suffisent à produire un clone convaincant.</strong> C&rsquo;est exactement pour cette raison qu&rsquo;il ne faut jamais parler en premier quand tu reçois un appel suspect ou un numéro inconnu. Un simple « allô, oui, qui est à l&rsquo;appareil ? » peut donner à un escroc assez de matière pour cloner ta voix, et s&rsquo;en servir ensuite pour piéger un proche au téléphone, par exemple en simulant un appel de détresse. Le réflexe à prendre : laisse l&rsquo;interlocuteur se présenter d&rsquo;abord, et ne meuble pas le silence. La technologie qui te sert dans cet article peut tout aussi bien servir contre toi.</p>



<p class="wp-block-paragraph">Pour nettoyer un enregistrement, <strong>Audacity</strong> fait parfaitement le travail. Tu importes ton fichier, tu sélectionnes un passage de silence, puis Effect, Noise Reduction, Get Noise Profile, et tu appliques la réduction sur l&rsquo;ensemble. Tu coupes les respirations à la souris, tu normalises à -3 dB, et tu exportes en WAV mono 22050 Hz 16 bits.</p>



<p class="wp-block-paragraph">Si tu veux juste convertir un fichier existant au bon format, <strong>ffmpeg</strong> suffit :</p>



<p class="wp-block-paragraph">[CODE : convertir_sample.sh]</p>



<pre class="wp-block-code"><code>ffmpeg -i source.mp3 -ar 22050 -ac 1 -sample_fmt s16 ~/alltalk_tts/voices/mavoix.wav</code></pre>



<p class="wp-block-paragraph">Tu déposes le fichier dans le dossier <code>~/alltalk_tts/voices/</code>, tu cliques <strong>Refresh Settings</strong> dans l&rsquo;interface, et ta voix apparaît dans la liste. Sélectionne la, tape une phrase de test, et écoute le résultat.dans l&rsquo;interface, et votre voix apparaît dans la liste. Sélectionnez la, tapez une phrase de test, et écoutez le résultat.</p>



<figure class="wp-block-image size-large"><img width="1024" height="524"  alt="" class="wp-image-338"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1-1024x524.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1-1024x524.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1-300x153.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1-768x393.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1-1536x786.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1.png 2004w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Voici le résultat 😀 </p>



<figure class="wp-block-audio"><audio controls src="https://tazmenworld.com/wp-content/uploads/2026/06/demo.mp3"></audio></figure>



<h2 class="wp-block-heading">VII. Affiner le rendu</h2>



<p class="wp-block-paragraph">Si le clone n&rsquo;est pas à la hauteur malgré un bon échantillon, deux réglages dans l&rsquo;onglet <strong>Generate TTS</strong>.</p>



<p class="wp-block-paragraph">La <strong>température</strong>. Plus elle est basse, entre 0,5 et 0,65, plus le rendu colle à ton sample. Plus elle est haute, entre 0,75 et 0,85, plus c&rsquo;est expressif, mais ça peut dériver.</p>



<p class="wp-block-paragraph">La <strong>repetition penalty</strong>. La valeur par défaut à 10 est extrême. Descends à 2 ou 3 pour un rendu nettement plus naturel.</p>



<figure class="wp-block-image size-large"><img width="1024" height="388"  alt="" class="wp-image-334"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-08-47-01-1-1024x388.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-08-47-01-1-1024x388.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-08-47-01-1-300x114.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-08-47-01-1-768x291.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-08-47-01-1.png 1255w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Si ça ne suffit toujours pas, deux options plus lourdes existent. Le <strong>mode multi-sample</strong>, où tu fournis plusieurs fichiers WAV d&rsquo;une même personne pour stabiliser le clone. Et le <strong>fine-tuning</strong>, où tu entraînes réellement XTTS sur ta voix avec 2 à 20 minutes d&rsquo;audio propre, pour obtenir un modèle dédié bien supérieur au zero-shot. Sur une 5070 Ti, cet entraînement prend une demi-heure environ. Je détaillerai cette partie dans un article séparé, parce qu&rsquo;elle mérite son propre guide.</p>



<figure class="wp-block-audio"><audio controls src="https://tazmenworld.com/wp-content/uploads/2026/06/demo2.mp3"></audio></figure>



<h2 class="wp-block-heading">VIII. Les cas d&rsquo;usage concrets</h2>



<p class="wp-block-paragraph">Une fois XTTS en place, ça ouvre plusieurs workflows qui remplacent directement ce que je faisais sur ElevenLabs :</p>



<ol class="wp-block-list">
<li><strong>Voix off pour mes vidéos YouTube</strong>. J&rsquo;écris le script, je génère les pistes avec ma voix clonée, je monte dans mon éditeur. Zéro crédit consommé.</li>



<li><strong>Lecture audio de mes articles de blog</strong>. Via l&rsquo;API d&rsquo;AllTalk branchée sur n8n, je génère automatiquement une version audio de chaque article.</li>



<li><strong>Génération de faux podcasts</strong>. Un modèle de langage local écrit un dialogue à deux voix, XTTS le synthétise avec deux échantillons différents.</li>



<li><strong>Doublage de mes propres vidéos en français</strong>. C&rsquo;est le pipeline le plus puissant. On chaîne une transcription avec Whisper, une traduction avec un modèle local, puis une régénération en français avec ma propre voix.<br></li>
</ol>



<p class="wp-block-paragraph">Chacun de ces workflows mérite son propre tutoriel, et j&rsquo;y reviendrai dans la suite de cette série.</p>



<p class="wp-block-paragraph">Voici un exemple en anglais:<br></p>



<figure class="wp-block-audio"><audio controls src="https://tazmenworld.com/wp-content/uploads/2026/06/demo3.mp3"></audio></figure>



<p class="wp-block-paragraph">en espagnole:<br></p>



<figure class="wp-block-audio"><audio controls src="https://tazmenworld.com/wp-content/uploads/2026/06/demo4.mp3"></audio></figure>



<p class="wp-block-paragraph">En allemand:<br></p>



<figure class="wp-block-audio"><audio controls src="https://tazmenworld.com/wp-content/uploads/2026/06/demo5.mp3"></audio></figure>



<p class="wp-block-paragraph">est ça entre très bien dans un workfload n8n</p>



<h2 class="wp-block-heading">IX. Démarrage automatique avec systemd</h2>



<p class="wp-block-paragraph">Pour ne pas relancer le serveur à la main à chaque démarrage, un service <strong>systemd</strong>. Tu crées le fichier <code>/etc/systemd/system/alltalk.service</code> :</p>



<p class="wp-block-paragraph">[CODE : alltalk.service]</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=AllTalk TTS Server
After=network.target

&#91;Service]
Type=simple
User=ton_user
WorkingDirectory=/home/ton_user/alltalk_tts
ExecStart=/home/ton_user/alltalk_tts/start_alltalk.sh
Restart=on-failure
RestartSec=10

&#91;Install]
WantedBy=multi-user.target</code></pre>



<p class="wp-block-paragraph">Puis tu l&rsquo;actives :</p>



<p class="wp-block-paragraph">[CODE : activer_service.sh]</p>



<pre class="wp-block-code"><code>sudo systemctl daemon-reload
sudo systemctl enable alltalk
sudo systemctl start alltalk</code></pre>



<p class="wp-block-paragraph">AllTalk démarre désormais au boot, en arrière plan, avec relance automatique en cas de crash. Un détail qui m&rsquo;a piégé deux fois : à l&rsquo;arrêt manuel, le sous-process moteur a tendance à survivre et à garder le port 7851 occupé, ce qui bloque le redémarrage. Avant de relancer, vérifie avec <code>lsof -i:7851</code> que le port est libre, et au besoin libère le avec <code>kill $(lsof -t -i:7851)</code>.</p>



<h2 class="wp-block-heading">X. Conclusion : le bilan de la liberté</h2>



<p class="wp-block-paragraph">Après ce parcours de correctifs et de réglages, est-ce que le jeu en vaut la chandelle ? Pour moi, c&rsquo;est un oui franc.</p>



<p class="wp-block-paragraph">Soyons lucides, ElevenLabs garde une longueur d&rsquo;avance sur la qualité brute, surtout sur les nuances émotionnelles les plus fines. Mais XTTS en local atteint un niveau largement suffisant pour de la voix off, du doublage et de la lecture d&rsquo;articles. Et il le fait sans abonnement, sans plafond de crédits, et sans que ma voix ne quitte ma machine. Pour quelqu&rsquo;un qui prend ses données au sérieux, c&rsquo;est le point de rupture.</p>



<p class="wp-block-paragraph">Voici comment je résume la comparaison après plusieurs jours d&rsquo;utilisation :</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Caractéristique</strong></th><th><strong>ElevenLabs (Cloud)</strong></th><th><strong>XTTS Local + AllTalk</strong></th></tr></thead><tbody><tr><td><strong>Vie privée &amp; biométrie</strong></td><td>Échantillon vocal envoyé sur serveurs tiers (US)</td><td>Souveraineté totale, ta voix ne quitte pas ton réseau</td></tr><tr><td><strong>Coût mensuel</strong></td><td>À partir de 22 $/mois pour le clonage pro</td><td>0 € une fois le matériel acquis</td></tr><tr><td><strong>Quota</strong></td><td>Plafond de crédits, payé que tu l&rsquo;atteignes ou non</td><td>Génération illimitée</td></tr><tr><td><strong>Droits commerciaux</strong></td><td>Plan gratuit interdit + attribution imposée</td><td>Aucune restriction, aucune mention obligatoire</td></tr><tr><td><strong>Qualité</strong></td><td>Référence du marché, nuances émotionnelles au top</td><td>Très bonne, suffisante pour la majorité des usages</td></tr><tr><td><strong>Matériel requis</strong></td><td>Une simple connexion internet</td><td>GPU dédié (<strong>RTX 5070 Ti</strong>, 16 Go de VRAM)</td></tr><tr><td><strong>Clonage de voix</strong></td><td>Instantané et professionnel</td><td>Zero-shot, et fine-tuning possible en local</td></tr><tr><td><strong>Dépendance</strong></td><td>Dépend du service et de la connexion</td><td>Autonomie complète, fonctionne hors ligne</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">L&rsquo;installation n&rsquo;est pas plug and play sur une carte Blackwell, je ne vais pas te mentir. Mais une fois les correctifs passés, c&rsquo;est stable, rapide, et entièrement à toi. <strong>Le plus gros levier de qualité reste l&rsquo;échantillon : un bon enregistrement propre vaut tous les réglages du monde.</strong></p>



<p class="wp-block-paragraph">Dans le prochain article de cette série, je détaille les workflows en profondeur : la voix off, la lecture d&rsquo;articles via n8n, le faux podcast, et surtout le doublage de mes propres vidéos YouTube en chaînant Whisper, traduction et XTTS. La route vers l&rsquo;IA locale est encore longue, et on continue à en dessiner les contours.</p>



<p class="wp-block-paragraph">A bientôt Louis 🐇 🤜 🤛 🐰</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/06/14/comment-remplacer-elevenlabs-par-xtts-en-local-et-cloner-sa-propre-voix/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://tazmenworld.com/wp-content/uploads/2026/06/demo.mp3" length="77901" type="audio/mpeg" />
<enclosure url="https://tazmenworld.com/wp-content/uploads/2026/06/demo2.mp3" length="69093" type="audio/mpeg" />
<enclosure url="https://tazmenworld.com/wp-content/uploads/2026/06/demo3.mp3" length="59805" type="audio/mpeg" />
<enclosure url="https://tazmenworld.com/wp-content/uploads/2026/06/demo4.mp3" length="58965" type="audio/mpeg" />
<enclosure url="https://tazmenworld.com/wp-content/uploads/2026/06/demo5.mp3" length="82653" type="audio/mpeg" />

			</item>
		<item>
		<title>Quel matériel et pour quel prix en 2026 pour faire de l&#8217;IA en local</title>
		<link>https://tazmenworld.com/2026/06/11/quel-materiel-et-pour-quel-prix-en-2026-pour-faire-de-lia-en-local/</link>
					<comments>https://tazmenworld.com/2026/06/11/quel-materiel-et-pour-quel-prix-en-2026-pour-faire-de-lia-en-local/#comments</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Thu, 11 Jun 2026 06:30:52 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<category><![CDATA[Non classé]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=318</guid>

					<description><![CDATA[Fais le tour des réseaux sociaux et tu tomberas vite sur le même argument, répété en boucle : « l&#8217;IA en local, c&#8217;est gratuit, tu ne paies pas les tokens ». C&#8217;est l&#8217;argument massue, celui qui fait briller les yeux et sortir la carte bleue. Sauf que c&#8217;est faux. L&#8217;IA en local, tu la paies [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="575"  alt="" class="wp-image-328"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout-1024x575.jpeg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout-1024x575.jpeg 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout-300x168.jpeg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout-768x431.jpeg 768w, https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout-1536x863.jpeg 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout.jpeg 1672w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Fais le tour des réseaux sociaux et tu tomberas vite sur le même argument, répété en boucle : « l&rsquo;IA en local, c&rsquo;est gratuit, tu ne paies pas les tokens ». C&rsquo;est l&rsquo;argument massue, celui qui fait briller les yeux et sortir la carte bleue.</p>



<p class="wp-block-paragraph">Sauf que c&rsquo;est faux. L&rsquo;IA en local, <strong>tu la paies deux fois</strong> : une fois à l&rsquo;achat du matériel, et une deuxième fois en consommation électrique, mois après mois, tant que la machine tourne. Le cloud te facture au token ; le local te facture en watts. Dans les deux cas, il y a un compteur qui tourne. Il est juste moins visible côté local, parce qu&rsquo;il se planque dans ta facture EDF au lieu d&rsquo;arriver par mail à la fin du mois.</p>



<p class="wp-block-paragraph">Et tu risques d&rsquo;être surpris par le montant. Plus loin dans l&rsquo;article, je te montre ma propre facture sur douze mois, relevé fournisseur à l&rsquo;appui. Spoiler : ce n&rsquo;est pas anodin.</p>



<p class="wp-block-paragraph">Ça ne veut pas dire que le local est une mauvaise idée. Au contraire, sur certains usages c&rsquo;est imbattable, et tu gardes la main sur tes données et tes modèles sans dépendre d&rsquo;une API qui peut changer ses CGU ou ses prix du jour au lendemain. Ça veut juste dire qu&rsquo;il faut acheter en connaissance de cause, avec les deux factures en tête, pas une seule.</p>



<p class="wp-block-paragraph">Donc avant de claquer un budget, posons les bases. Et la première règle, celle qui détermine tout le reste, tient en une phrase : en IA locale, <strong>tu n&rsquo;achètes pas de la puissance de calcul, tu achètes de la mémoire</strong>.</p>



<h2 class="wp-block-heading">La règle de base : la mémoire d&rsquo;abord</h2>



<p class="wp-block-paragraph">Toute la littérature sérieuse 2026 dit la même chose. Tu choisis d&rsquo;abord la quantité de mémoire (VRAM sur un GPU, ou mémoire unifiée sur un mini-PC / un Mac), et ensuite seulement le reste.</p>



<p class="wp-block-paragraph">Les repères à garder en tête :</p>



<ul class="wp-block-list">
<li><strong>8–16 Go</strong> : modèles 7B en quantifié. Du RAG léger, des petits agents, de l&rsquo;expérimentation.</li>



<li><strong>24 Go</strong> : 32B utilisables en Q4/Q5 (Qwen 2.5-Coder 32B, Mistral Small). Le vrai point de bascule pour bosser sérieusement.</li>



<li><strong>40 Go+ ou mémoire unifiée 64–192 Go</strong> : 70B quantifiés (Llama 3.3 70B, DeepSeek R1 distill 70B, Qwen 2.5 72B), voire du 120B en 4-bit.</li>
</ul>



<p class="wp-block-paragraph">Un détail qu&rsquo;on oublie souvent : <strong>la bande passante mémoire détermine ta vitesse en tokens/seconde</strong>. Une RTX 3090 tape dans les ~936 Go/s, un boîtier AMD à mémoire unifiée plafonne souvent autour de ~120 Go/s, un Mac M4 Pro est à 273 Go/s. À mémoire égale, ça change tout sur le ressenti en inférence. Avoir 64 Go ne sert à rien si le modèle crache 4 tok/s.</p>



<h2 class="wp-block-heading">Les familles de matériel</h2>



<p class="wp-block-paragraph">Avant les tranches de budget, il faut distinguer <strong>les formes de produit</strong>, parce qu&rsquo;on compare souvent des trucs qui n&rsquo;ont rien à voir.</p>



<p class="wp-block-paragraph"><strong>GPU grand public (GeForce).</strong> Le meilleur rapport perf/prix pour du LLM + image classique. RTX 3060, 4060 Ti, 3090, 4090, 5090. Le marché de l&rsquo;occasion est ton ami.</p>



<p class="wp-block-paragraph"><strong>Mini-PC IA à mémoire unifiée.</strong> Ryzen AI Max (Strix Halo), Minisforum, GMKtec, Mac mini/Studio. Beaucoup de mémoire, faible conso, format compact. En contrepartie, une bande passante plus faible que les gros GPU (sauf Apple).</p>



<p class="wp-block-paragraph"><strong>Cartes data center détournées.</strong> Tesla P100, T4, P4, V100 récupérées d&rsquo;occasion et collées dans une tour ATX. Beaucoup de VRAM pour pas cher, mais c&rsquo;est un truc de bricoleur Linux (cooling à ajouter, drivers data center, pas de sortie vidéo).</p>



<p class="wp-block-paragraph"><strong>Edge / embarqué (Jetson).</strong> Orin Nano, AGX Orin, Thor. Conso ultra-basse, format NUC, parfait pour de l&rsquo;always-on silencieux ou du RAG embarqué. Pas pour du gros LLM à la maison.</p>



<p class="wp-block-paragraph"><strong>Stations IA compactes premium.</strong> DGX Spark, Mac Studio haut de gamme. 128 Go+ de mémoire unifiée, cher, mais redoutable en perf/watt.</p>



<h2 class="wp-block-heading">Par tranche de budget</h2>



<p class="wp-block-paragraph">Petite précaution avant de lire : les prix ci-dessous sont des prix observés mi-2026 sur le marché français/européen (occasion comprise). Ça bouge vite, parfois dans le mauvais sens : les Jetson Orin Nano ont pris une grosse hausse ces derniers mois, et le marché de l&rsquo;occasion réserve des absurdités (un Mac mini M1 d&rsquo;occasion peut coûter plus cher qu&rsquo;un M4 neuf… cherchez la logique).</p>



<h3 class="wp-block-heading">Moins de 400 €</h3>



<figure class="wp-block-image size-large is-resized"><img width="1024" height="788"  alt="" class="wp-image-322" style="aspect-ratio:1.2994888127422661;width:292px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-8-1024x788.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-8-1024x788.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-8-300x231.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-8-768x591.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-8.png 1254w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">L&rsquo;entrée de gamme. Tu vises du 7B quantifié et du RAG léger.</p>



<ul class="wp-block-list">
<li><strong>RTX 3060 12 Go d&rsquo;occasion</strong> : le classique. CUDA partout, ça marche, point.</li>



<li><strong>Tesla P4 8 Go</strong> ou <strong>P100 16 Go d&rsquo;occasion</strong> (~150–250 €) : énormément de VRAM par euro, mais cooling DIY et drivers data center.</li>



<li><strong>Tesla V100 32 Go sur AliExpress (~350 €)</strong> : le vrai bon plan VRAM/prix du moment, mais c&rsquo;est réservé aux bricoleurs. Voir l&rsquo;encadré dédié plus bas, parce qu&rsquo;il y a un piège électrique sérieux.</li>



<li><strong>Jetson Orin Nano (~350 €)</strong> : si tu veux un truc qui consomme 7 W et tourne en permanence. Attention, le prix a fortement grimpé ces derniers mois, ce n&rsquo;est plus le kit à 99 $ avant.</li>
</ul>



<p class="wp-block-paragraph">À ce niveau, ne rêve pas de génération d&rsquo;image lourde ni de 32B. C&rsquo;est un terrain de jeu, pas une station de prod.</p>



<h3 class="wp-block-heading">400 – 900 €</h3>



<figure class="wp-block-image size-large is-resized"><img width="1024" height="827"  alt="" class="wp-image-323" style="aspect-ratio:1.2382026633852146;width:353px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-9-1024x827.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-9-1024x827.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-9-300x242.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-9-768x620.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-9.png 1254w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Le sweet spot pour débuter sérieusement. 16 Go de VRAM ou un mini-PC milieu de gamme.</p>



<ul class="wp-block-list">
<li><strong>RTX 4060 Ti 16 Go</strong> ou <strong>RX 7600 XT 16 Go</strong> : 7–13B confortables et de l&rsquo;image raisonnable (SDXL, Flux en presets corrects).</li>



<li><strong>Tesla T4 16 Go</strong> : 70 W, excellente en perf/watt, parfaite pour un serveur d&rsquo;inférence allumé H24.</li>



<li><strong>Mini-PC Ryzen AI 32 Go</strong> : polyvalent, basse conso, mais attention au support GPU sous Linux (j&rsquo;y reviens plus bas).</li>
</ul>



<h3 class="wp-block-heading">900 – 1 800 €</h3>



<figure class="wp-block-image size-full is-resized"><img width="600" height="518"  alt="" class="wp-image-324" style="width:281px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-10.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-10.png 600w, https://tazmenworld.com/wp-content/uploads/2026/06/image-10-300x259.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>



<p class="wp-block-paragraph">Là, tu passes en 24 Go et tu peux faire du ComfyUI sérieux + du 32B. C&rsquo;est la tranche des <strong>GPU 24 Go d&rsquo;occasion</strong>, et clairement la plus rentable.</p>



<ul class="wp-block-list">
<li><strong>RTX 3090 24 Go d&rsquo;occasion (700–1 000 €)</strong> : LE meilleur achat, toutes catégories confondues. 24 Go, ~936 Go/s, compatibilité parfaite. Le neuf ne sert à rien ici, prends de l&rsquo;occasion. Si tu ne devais retenir qu&rsquo;une carte, c&rsquo;est elle.</li>



<li><strong>RTX 4090 24 Go d&rsquo;occasion (1 000–1 100 €)</strong> : même VRAM que la 3090 mais plus de patate, notamment en image. Là aussi le neuf est inutile.</li>



<li><strong>Tesla P100 32 Go</strong> : encore plus de VRAM pour pas cher, mais idle médiocre (voir section conso).</li>



<li><strong>Mini-PC à mémoire unifiée 64 Go</strong> type <strong>Minisforum AI X1 Pro</strong> (~1 100 $) : tu charges des modèles jusqu&rsquo;à ~50B en Q4 sans GPU dédié. Le piège : ~120 Go/s de bande passante, donc compte 15–25 tok/s sur un Qwen 14B Q4. C&rsquo;est lent mais ça tient en RAM ce qu&rsquo;un GPU 24 Go ne tiendra jamais.</li>
</ul>



<h3 class="wp-block-heading">1 800 – 3 000 €</h3>



<figure class="wp-block-image size-large is-resized"><img width="1024" height="434"  alt="" class="wp-image-325" style="aspect-ratio:2.359479850669964;width:277px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-11-1024x434.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-11-1024x434.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-11-300x127.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-11-768x326.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-11.png 1089w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">La tranche de la <strong>mémoire unifiée compacte</strong> et de l&rsquo;edge costaud. Beaucoup de mémoire, faible conso, format de bureau, mais on troque la vitesse des gros GPU contre la capacité.</p>



<ul class="wp-block-list">
<li><strong>Beelink SER9 (HX-370, ~2 300 €)</strong> : mini-PC Ryzen AI, basse conso (~7–9 W idle).</li>



<li><strong>Minisforum Strix Halo 64 Go (~2 300 €)</strong> : le modèle 128 Go n&rsquo;est toujours pas dispo, on est cantonné au 64 Go pour l&rsquo;instant. TDP modulable 45–120 W.</li>



<li><strong>Mac mini M4 64 Go (~2 800 €)</strong> : 70B quantifiés accessibles, idle dérisoire (~4–8 W), perf/watt imbattable. L&rsquo;option la plus propre pour un nœud LLM always-on costaud.</li>



<li><strong>Jetson AGX Orin 64 Go (~2 400 € avec boîtier)</strong> : si tu fais de l&rsquo;edge sérieux ou du RAG embarqué.</li>
</ul>



<h3 class="wp-block-heading">Plus de 3 000 €</h3>



<figure class="wp-block-image size-large is-resized"><img width="1024" height="824"  alt="" class="wp-image-326" style="aspect-ratio:1.2434030224569432;width:400px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-12-1024x824.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-12-1024x824.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-12-300x241.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-12-768x618.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-12.png 1226w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Le haut du panier. C&rsquo;est là que le 70B confortable, le 120B en 4-bit et l&rsquo;image lourde deviennent vraiment fluides, mais le ticket d&rsquo;entrée fait mal.</p>



<ul class="wp-block-list">
<li><strong>RTX 5090 32 Go (3 500–5 000 €)</strong> : la puissance brute. 32 Go GDDR7, ~575 W rien que pour la carte. Réserve-la si tu fais de l&rsquo;image lourde ou du training.</li>



<li><strong>Mac Studio M4 (à partir de ~4 400 € selon config)</strong> : jusqu&rsquo;à 192 Go unifiée, 70B quantifiés + vidéo + IA, idle ridicule. Le compromis perf/watt le plus propre pour une station.</li>



<li><strong>DGX Spark (~5 000 €)</strong> : 128 Go unifiée (GB10), écosystème CUDA natif dans un format de bureau.</li>



<li><strong>Multi-GPU 4× 3090</strong> en rack : 96 Go de VRAM totale pour qui veut du 70B+ sans compromis. C&rsquo;est plus un labo qu&rsquo;une machine perso, et la facture électrique suit (voir plus bas).</li>
</ul>



<h2 class="wp-block-heading">Le prix de la mémoire : la variable qui va tout chambouler</h2>



<p class="wp-block-paragraph">Tous les prix ci-dessus sont une photo à l&rsquo;instant T, et cette photo va se dégrader. On a passé l&rsquo;article à répéter que tu achètes de la mémoire avant tout : il faut donc parler du fait que la mémoire est en pleine crise de prix.</p>



<p class="wp-block-paragraph">Depuis fin 2025, la DRAM et la NAND flambent. Les tarifs ont été multipliés par 3 à 4 en moins d&rsquo;un an. La cause tient en trois lettres : la HBM, cette mémoire ultra-rapide qui équipe les accélérateurs IA des data centers (NVIDIA H100/H200/B200, AMD MI300…). Les trois seuls fabricants mondiaux (Samsung, SK Hynix, Micron) ont réorienté leurs capacités vers cette HBM à forte marge, au détriment de la DDR4, DDR5, LPDDR5 et de la NAND grand public. Résultat : moins d&rsquo;offre, des stocks tendus, des prix qui s&rsquo;envolent. Et ça ne s&rsquo;arrête pas à la RAM système : la GDDR des cartes graphiques est touchée par le même effet, donc les GPU sont aussi concernés.</p>



<p class="wp-block-paragraph">Et ce n&rsquo;est pas fini. Micron annonce +50 à 60 % sur la DRAM dès le premier trimestre 2026, TrendForce table sur +58 à 63 % de plus au deuxième trimestre. Pour résorber la pénurie, il faudrait augmenter la production de 12 % par an d&rsquo;ici 2027 ; les plans industriels actuels ne prévoient que 7,5 %. L&rsquo;écart ne se comble pas par magie : une nouvelle usine de semi-conducteurs met des années à monter en cadence. Les prévisions convergent vers une tension qui dure au moins jusqu&rsquo;en 2027, avec un plateau des prix cette année-là et une éventuelle détente seulement à partir de 2028. Les plus pessimistes (Counterpoint) évoquent 2030.</p>



<figure class="wp-block-image size-large"><img width="1024" height="542"  alt="" class="wp-image-321"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-7-1024x542.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-7-1024x542.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-7-300x159.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-7-768x406.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-7-1536x812.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/image-7.png 1830w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Donc oui, il y a eu de légères respirations sur certains tarifs, mais la tendance de fond est haussière, et elle va le rester un moment. Ça a deux conséquences très concrètes pour toi.</p>



<p class="wp-block-paragraph">D&rsquo;abord, <strong>les configs gourmandes en mémoire vont coûter de plus en plus cher</strong>. Un mini-PC 128 Go de mémoire unifiée ou une carte à grosse VRAM, c&rsquo;est exactement ce que le marché s&rsquo;arrache. Si ton projet en dépend, le surcoût ne fera que grimper.</p>



<p class="wp-block-paragraph">Ensuite, et c&rsquo;est là que je vais à contre-courant du discours ambiant : <strong>dans pas mal de cas, le calcul honnête, c&rsquo;est de ne pas acheter maintenant</strong>. À ces prix-là, monter une vraie config locale revient cher, et on sait que la mémoire restera tendue jusqu&rsquo;en 2027-2028. Une stratégie tout à fait défendable, c&rsquo;est donc : j&rsquo;attends deux ans que le marché se détende, et en attendant j&rsquo;utilise les API. Tu paies au token sur la période, mais tu n&rsquo;immobilises pas 3 000 ou 5 000 € dans une machine achetée au pic, qui aura perdu de la valeur quand les prix mémoire seront retombés. Pour un usage modéré, l&rsquo;addition API sur deux ans peut largement rester sous le coût d&rsquo;achat + électricité d&rsquo;une grosse config.</p>



<p class="wp-block-paragraph">Si malgré tout tu veux du local tout de suite, <strong>l&rsquo;occasion est ta meilleure protection</strong>. Une RTX 3090 ou 4090 d&rsquo;occasion, avec sa VRAM déjà soudée et payée au prix d&rsquo;hier, te met à l&rsquo;abri de la flambée. C&rsquo;est l&rsquo;arbitrage à faire : soit tu passes par l&rsquo;occasion maintenant, soit tu encaisses le coût API quelque temps et tu investis quand le marché aura soufflé. Ce qui n&rsquo;a pas de sens, c&rsquo;est d&rsquo;acheter du neuf gourmand en mémoire en plein pic.</p>



<p class="wp-block-paragraph">Dernier point à connaître : à partir de 2026, <strong>la disponibilité risque de devenir un problème avant même le prix</strong>. Si tu choisis la voie « j&rsquo;achète maintenant », garde en tête que trouver le composant pourra être plus compliqué que le payer.</p>



<h2 class="wp-block-heading">Inférence vs diffusion : ce que ça change</h2>



<p class="wp-block-paragraph">On mélange trop souvent les deux usages, alors qu&rsquo;ils ne sollicitent pas le matériel pareil.</p>



<p class="wp-block-paragraph"><strong>Inférence LLM.</strong> C&rsquo;est dominé par la <strong>bande passante mémoire</strong>. Le modèle doit être lu en entier à chaque token généré. D&rsquo;où l&rsquo;importance de la VRAM (pour faire rentrer le modèle) ET de la bande passante (pour le lire vite). Une P100 à 16 Go fera tourner un 32B Q4, mais ses ~550 Go/s la rendent plus lente qu&rsquo;une 3090.</p>



<p class="wp-block-paragraph"><strong>Diffusion / génération d&rsquo;image.</strong> Là, l&rsquo;architecture du GPU compte davantage. Les Tensor Cores modernes (FP8, etc.) accélèrent énormément. C&rsquo;est pour ça qu&rsquo;une Pascal (P100) fait tourner ComfyUI mais reste sensiblement plus lente qu&rsquo;une 3090/4090/5090 sur le même workflow. En image, l&rsquo;ancienneté de l&rsquo;archi se paie cash.</p>



<p class="wp-block-paragraph">Conclusion pratique : si ton truc c&rsquo;est le LLM, optimise la mémoire et la bande passante. Si c&rsquo;est l&rsquo;image, oriente-toi vers une archi récente (Ampere minimum, idéalement Ada/Blackwell).</p>



<h2 class="wp-block-heading">La consommation : le truc que personne ne regarde</h2>



<p class="wp-block-paragraph">C&rsquo;est l&rsquo;angle mort des tableaux VRAM/prix. Si ta machine tourne H24 pour Ollama, n8n ou ComfyUI, deux chiffres comptent : la conso <strong>idle</strong> (machine allumée, modèle pas chargé) et la conso <strong>en calcul</strong>.</p>



<p class="wp-block-paragraph"><strong>Attention, point crucial</strong> : les chiffres ci-dessous sont <strong>pour la carte seule</strong>. C&rsquo;est toute la config qui consomme. CPU, carte mère, RAM, ventilation, alim avec son rendement : ajoute facilement 100 à 250 W sous charge par-dessus le GPU. Une config autour d&rsquo;une RTX 5090 dépasse le plus souvent <strong>1 000 W</strong> à pleine charge. Donc quand tu lis « 575 W » pour la 5090, lis plutôt « 1 000 W au mur » pour la machine complète.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">GPU (carte seule)</th><th class="has-text-align-left" data-align="left">Mémoire</th><th class="has-text-align-right" data-align="right">Idle</th><th class="has-text-align-right" data-align="right">Calcul</th><th class="has-text-align-left" data-align="left">Verdict 24/7</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">Tesla T4</td><td class="has-text-align-left" data-align="left">16 Go</td><td class="has-text-align-right" data-align="right">~36 W</td><td class="has-text-align-right" data-align="right">~70–75 W</td><td class="has-text-align-left" data-align="left">Excellent serveur sobre</td></tr><tr><td class="has-text-align-left" data-align="left">Tesla P100</td><td class="has-text-align-left" data-align="left">16 Go</td><td class="has-text-align-right" data-align="right">~25–30 W</td><td class="has-text-align-right" data-align="right">~250 W</td><td class="has-text-align-left" data-align="left">Bricolable, idle moyen</td></tr><tr><td class="has-text-align-left" data-align="left">Tesla V100</td><td class="has-text-align-left" data-align="left">16–32 Go</td><td class="has-text-align-right" data-align="right">~40–50 W</td><td class="has-text-align-right" data-align="right">~250 W</td><td class="has-text-align-left" data-align="left">Puissant, mauvaise veille</td></tr><tr><td class="has-text-align-left" data-align="left">RTX 3090</td><td class="has-text-align-left" data-align="left">24 Go</td><td class="has-text-align-right" data-align="right">~10–30 W</td><td class="has-text-align-right" data-align="right">~350 W</td><td class="has-text-align-left" data-align="left">Bon ratio polyvalent</td></tr><tr><td class="has-text-align-left" data-align="left">RTX 4090</td><td class="has-text-align-left" data-align="left">24 Go</td><td class="has-text-align-right" data-align="right">~4–29 W</td><td class="has-text-align-right" data-align="right">~450–480 W</td><td class="has-text-align-left" data-align="left">Fort, lourd en charge</td></tr><tr><td class="has-text-align-left" data-align="left">RTX 5090</td><td class="has-text-align-left" data-align="left">32 Go</td><td class="has-text-align-right" data-align="right">~45–100 W</td><td class="has-text-align-right" data-align="right">~575 W</td><td class="has-text-align-left" data-align="left">Config complète &gt;1 000 W</td></tr><tr><td class="has-text-align-left" data-align="left">Jetson Orin Nano</td><td class="has-text-align-left" data-align="left">8 Go</td><td class="has-text-align-right" data-align="right">~2,5–7 W</td><td class="has-text-align-right" data-align="right">~7–15 W</td><td class="has-text-align-left" data-align="left">Top edge always-on</td></tr><tr><td class="has-text-align-left" data-align="left">Jetson AGX Orin</td><td class="has-text-align-left" data-align="left">64 Go</td><td class="has-text-align-right" data-align="right">~15–20 W</td><td class="has-text-align-right" data-align="right">~30–60 W</td><td class="has-text-align-left" data-align="left">Bon compromis edge costaud</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Côté boîtiers compacts, l&rsquo;intérêt c&rsquo;est que les chiffres sont <strong>système complet</strong> (pas de tour à ajouter autour) :</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Plateforme (système complet)</th><th class="has-text-align-left" data-align="left">Mémoire</th><th class="has-text-align-right" data-align="right">Idle</th><th class="has-text-align-right" data-align="right">Charge</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">Mac mini M4</td><td class="has-text-align-left" data-align="left">16–64 Go</td><td class="has-text-align-right" data-align="right">~4–8 W</td><td class="has-text-align-right" data-align="right">~30–40 W</td></tr><tr><td class="has-text-align-left" data-align="left">Mac Studio M4</td><td class="has-text-align-left" data-align="left">36–192 Go</td><td class="has-text-align-right" data-align="right">~6–10 W</td><td class="has-text-align-right" data-align="right">~170–220 W</td></tr><tr><td class="has-text-align-left" data-align="left">DGX Spark</td><td class="has-text-align-left" data-align="left">128 Go</td><td class="has-text-align-right" data-align="right">~22–25 W</td><td class="has-text-align-right" data-align="right">~240 W (max système)</td></tr><tr><td class="has-text-align-left" data-align="left">Beelink SER9 (HX-370)</td><td class="has-text-align-left" data-align="left">32–64 Go</td><td class="has-text-align-right" data-align="right">~7–9 W</td><td class="has-text-align-right" data-align="right">~78 W</td></tr><tr><td class="has-text-align-left" data-align="left">Minisforum Strix Halo (Ryzen AI Max+ 395)</td><td class="has-text-align-left" data-align="left">jusqu&rsquo;à 128 Go</td><td class="has-text-align-right" data-align="right">~9–12 W</td><td class="has-text-align-right" data-align="right">~120 W</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">C&rsquo;est aussi là que les boîtiers compacts à mémoire unifiée prennent leur revanche sur les gros GPU : un Mac mini ou un Strix Halo te fait tourner un 70B en consommant ce qu&rsquo;une tour avec 5090 brûle au repos. Si ton usage c&rsquo;est l&rsquo;always-on, le perf/watt écrase la perf brute.</p>



<p class="wp-block-paragraph">Le truc à retenir, qui n&rsquo;apparaît jamais dans un tableau prix/VRAM : <strong>une P100 ou une V100 est souvent bloquée en état de perf élevé au repos</strong>, donc son idle est mauvais. Géniale pour bricoler et calculer, beaucoup moins pour un serveur domestique qui passe sa vie à attendre. Ça se rattrape sous Linux en réglant les p-states (voir l&rsquo;astuce dans l&rsquo;encadré V100 plus bas), mais c&rsquo;est un réglage à faire, ce n&rsquo;est pas automatique. À l&rsquo;inverse, une T4, un Jetson ou un Mac mini sont imbattables pour de l&rsquo;always-on sans rien toucher.</p>



<p class="wp-block-paragraph">Règle simple de lecture :</p>



<ul class="wp-block-list">
<li><strong>Tu calcules souvent</strong> : 3090/4090/5090, peu importe l&rsquo;idle.</li>



<li><strong>Tu veux un nœud IA allumé toute la journée</strong> : Mac mini, Jetson, T4. La sobriété prime.</li>
</ul>



<h3 class="wp-block-heading">Rien n&rsquo;est gratuit : la facture, en vrai</h3>



<p class="wp-block-paragraph">Petite parenthèse vécue, parce que c&rsquo;est facile de raisonner en watts sans jamais regarder la note. Voici ma conso réelle sur 12 mois (relevé fournisseur, en € par mois) :</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Mois</th><th class="has-text-align-right" data-align="right">€</th><th class="has-text-align-left" data-align="left">Mois</th><th class="has-text-align-right" data-align="right">€</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">Juil. 2025</td><td class="has-text-align-right" data-align="right">86</td><td class="has-text-align-left" data-align="left">Janv. 2026</td><td class="has-text-align-right" data-align="right">215</td></tr><tr><td class="has-text-align-left" data-align="left">Août 2025</td><td class="has-text-align-right" data-align="right">92</td><td class="has-text-align-left" data-align="left">Févr. 2026</td><td class="has-text-align-right" data-align="right">209</td></tr><tr><td class="has-text-align-left" data-align="left">Sept. 2025</td><td class="has-text-align-right" data-align="right">97</td><td class="has-text-align-left" data-align="left">Mars 2026</td><td class="has-text-align-right" data-align="right">193</td></tr><tr><td class="has-text-align-left" data-align="left">Oct. 2025</td><td class="has-text-align-right" data-align="right">116</td><td class="has-text-align-left" data-align="left">Avr. 2026</td><td class="has-text-align-right" data-align="right">164</td></tr><tr><td class="has-text-align-left" data-align="left">Nov. 2025</td><td class="has-text-align-right" data-align="right">149</td><td class="has-text-align-left" data-align="left">Mai 2026</td><td class="has-text-align-right" data-align="right">86</td></tr><tr><td class="has-text-align-left" data-align="left">Déc. 2025</td><td class="has-text-align-right" data-align="right">195</td><td class="has-text-align-left" data-align="left"><strong>Total</strong></td><td class="has-text-align-right" data-align="right"><strong>~1 601</strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">J&rsquo;ai commencé à utiliser ma 5070 mi-octobre, et la courbe grimpe à partir de là. En mai, je suis passé sur des API pour une partie du travail, et la facture retombe à 86 €, exactement le niveau d&rsquo;avant la 5070.</p>



<figure class="wp-block-image size-large"><img width="1024" height="404"  alt="" class="wp-image-320"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-6-1024x404.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-6-1024x404.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-6-300x118.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-6-768x303.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-6.png 1428w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Et là, pas d&rsquo;échappatoire : <strong>je me chauffe au bois</strong> :D. Le pic hivernal n&rsquo;est donc pas un artefact du chauffage électrique. Le seul gros changement sur la période, c&rsquo;est la machine qui s&rsquo;est mise à tourner pour faire de l&rsquo;IA. La corrélation est limpide : GPU allumé mi-octobre, la facture décolle ; bascule sur API en mai, elle redescend à son niveau de départ. Il reste bien quelques variations saisonnières mineures (éclairage, jours plus courts), mais elles ne pèsent pas 100 € par mois. Le coupable, c&rsquo;est le calcul local.</p>



<p class="wp-block-paragraph">Mais le message de fond tient : <strong>rien n&rsquo;est gratuit</strong>. La machine locale a un coût électrique réel et récurrent, et l&rsquo;API a un coût au token. L&rsquo;IA locale n&rsquo;est pas « gratuite » par opposition au cloud : tu déplaces juste la dépense de la facture API vers la facture EDF. À toi de voir laquelle correspond à ton usage et à ton volume.</p>



<h3 class="wp-block-heading">Encadré bricoleur : la Tesla V100 32 Go (~350 €)</h3>



<figure class="wp-block-image size-large is-resized"><img width="1024" height="1024"  alt="" class="wp-image-319" style="width:489px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-5-1024x1024.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-5-1024x1024.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-5-300x300.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-5-150x150.png 150w, https://tazmenworld.com/wp-content/uploads/2026/06/image-5-768x768.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-5-1536x1536.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/image-5.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">C&rsquo;est le meilleur ratio VRAM/prix du moment, mais ça se mérite. Avant de cliquer sur AliExpress, tu dois savoir trois choses :</p>



<ul class="wp-block-list">
<li><strong>L&rsquo;alimentation est piégeuse.</strong> Le connecteur n&rsquo;est pas un PCIe standard, il y a une modif/adaptateur à faire. Mal branchée, <strong>tu risques de cramer la carte mère</strong>. Les adaptateurs se trouvent en ligne, mais c&rsquo;est une manip à ne pas rater.</li>



<li><strong>Ventilation passive.</strong> Comme toutes les cartes data center, pas de ventilo intégré. Il faut ajouter un shroud + ventilateur sinon ça monte en température.</li>



<li><strong>Idle à programmer sous Linux.</strong> Par défaut elle reste bloquée en état de perf élevé (P0), donc elle tire 40 W et plus au repos pour ne rien faire. Sans réglage des p-states, ton idle est catastrophique pour du 24/7.</li>
</ul>



<p class="wp-block-paragraph"><strong>Astuce : dompter les p-states.</strong> Le problème touche toutes les cartes data center (P100, V100, T4…) : par défaut elles ne redescendent pas en basse conso au repos. Deux approches.</p>



<p class="wp-block-paragraph">D&rsquo;abord, active le persistence mode pour fiabiliser le comportement des clocks :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo nvidia-smi -pm 1</code></pre>



<p class="wp-block-paragraph">Ensuite, le plus simple et le plus propre : le démon <strong><code>nvidia-pstated</code></strong> (open-source, dispo sur GitHub). Il surveille l&rsquo;utilisation du GPU et force la carte en p-state bas (P8) dès qu&rsquo;elle est inactive, puis la repasse en P0 sous charge, automatiquement, sans bricoler tes clocks à la main. Sur une P100/V100, ça fait tomber l&rsquo;idle de ~40 W à une dizaine de watts. Tu le lances en service systemd et tu n&rsquo;y penses plus.</p>



<p class="wp-block-paragraph">Alternative manuelle si tu veux verrouiller les fréquences toi-même (<code>nvidia-smi -lgc</code>), mais tu plafonnes alors les perfs et c&rsquo;est moins souple que le démon. Pour un serveur allumé en permanence, <code>nvidia-pstated</code> est de loin la meilleure option : c&rsquo;est lui qui transforme une carte « mauvais idle » en carte 24/7 acceptable.</p>



<p class="wp-block-paragraph">En clair : 350 € pour 32 Go, c&rsquo;est imbattable, mais c&rsquo;est un projet Linux à part entière, pas un achat plug-and-play. Si tu n&rsquo;es pas à l&rsquo;aise avec le tuning matériel, reste sur une 3090 d&rsquo;occasion.</p>



<h2 class="wp-block-heading">Compatibilité : le piège PyTorch / CUDA</h2>



<p class="wp-block-paragraph">C&rsquo;est là que beaucoup se font avoir. Avoir 64 Go de mémoire unifiée ne sert à rien si ta stack logicielle ne sait pas l&rsquo;exploiter au GPU. Petit tour par écosystème.</p>



<p class="wp-block-paragraph"><strong>NVIDIA / CUDA.</strong> Le standard de fait. PyTorch, vLLM, Ollama, ComfyUI : sur de l&rsquo;Ampere ou de l&rsquo;Ada (3090, 4090…), tout marche nativement, builds officiels, zéro galère. C&rsquo;est la raison numéro un pour rester sur du NVIDIA si tu fais du dev ou du training, pas juste de l&rsquo;inférence.</p>



<p class="wp-block-paragraph">Sauf qu&rsquo;il y a une grosse exception, et elle est contre-intuitive : <strong>la série RTX 5000 (Blackwell) est aujourd&rsquo;hui le moins bon choix CUDA</strong>. Ces cartes utilisent une nouvelle compute capability, sm_120, et les versions stables de PyTorch ne sont compilées que jusqu&rsquo;à sm_90 (Hopper). Concrètement, sur une 5070 / 5080 / 5090 fraîchement montée, tu te prends souvent un <code>CUDA error: no kernel image is available for execution on the device</code>, ou pire, un fallback silencieux sur le CPU. Le seul moyen d&rsquo;en tirer quelque chose, c&rsquo;est de passer par les builds <strong>nightly</strong> (cu128/cu129, Python 3.13 conseillé) ou de compiler PyTorch depuis les sources. Ça fonctionne, mais ce n&rsquo;est pas une version stable définitive.</p>



<p class="wp-block-paragraph">Et ça dure. La série 50 est sortie début 2025 ; on est mi-2026 et le support officiel de sm_120 dans le PyTorch stable n&rsquo;est toujours pas là. Les demandes côté PyTorch (dont une qui cite nommément la 5070 Ti) sont encore ouvertes. Plus d&rsquo;un an à bricoler du nightly pour faire tourner une carte vendue, entre autres, pour l&rsquo;IA : c&rsquo;est le monde à l&rsquo;envers. Et le plus cocasse, c&rsquo;est qu&rsquo;on parle déjà de la suite : les fuites (Kopite7kimi, relayé par Wccftech) annoncent une génération RTX 60 sous architecture Rubin pour le second semestre 2027. Autrement dit, NVIDIA prépare déjà la relève alors que la génération actuelle n&rsquo;est toujours pas correctement prise en charge par la stack logicielle. Bref, si tu veux du NVIDIA sans prise de tête logicielle, une 3090 ou 4090 d&rsquo;occasion t&rsquo;évitera ces galères ; la 5090 ne se justifie que si tu as vraiment besoin de sa puissance brute et que le tuning logiciel ne te fait pas peur.</p>



<p class="wp-block-paragraph"><strong>AMD / ROCm.</strong> Sur les gros GPU AMD dédiés, ROCm progresse et PyTorch a ses builds. Mais sur les <strong>iGPU Ryzen AI récents (Strix Halo compris), le support ROCm reste partiel en 2026</strong>. Ollama tourne très bien en CPU+RAM, mais sans accélération GPU complète. Donc le mini-PC AMD 64 Go que tu lorgnes : il chargera de gros modèles, mais souvent en s&rsquo;appuyant sur le CPU. À garder en tête avant d&rsquo;acheter.</p>



<p class="wp-block-paragraph"><strong>Apple / Metal / MLX.</strong> PyTorch a un backend MPS qui fonctionne, mais tous les ops ne sont pas couverts. Pour Apple Silicon, le vrai chemin c&rsquo;est <strong>MLX</strong> (le framework d&rsquo;Apple) ou Ollama/llama.cpp. La bonne nouvelle : la grosse bande passante mémoire (273 Go/s sur M4 Pro) compense, et le perf/watt est excellent.</p>



<p class="wp-block-paragraph"><strong>Pascal (P100/V100).</strong> CUDA-capable, donc Ollama/vLLM/ComfyUI tournent. Mais c&rsquo;est de l&rsquo;archi ancienne : pas de FP8, pas de Tensor Cores modernes, et il faut surveiller que les versions récentes de PyTorch ne lâchent pas le support des vieilles compute capabilities (sm_60/sm_70). Plus les drivers <strong>data center</strong> (pas GeForce) et le cooling DIY. C&rsquo;est jouable, mais ce n&rsquo;est clairement pas plug-and-play.</p>



<p class="wp-block-paragraph"><strong>Jetson.</strong> Écosystème Linux embarqué (JetPack), pas Windows. CUDA présent mais parfois plus limité que sur GPU desktop côté bibliothèques. Parfait pour de l&rsquo;edge, pas pour reproduire ta station de dev.</p>



<h2 class="wp-block-heading">En résumé : quel matériel pour quel besoin</h2>



<ul class="wp-block-list">
<li><strong>Découvrir, RAG léger, 7B, petit budget.</strong> RTX 3060 12 Go d&rsquo;occasion, ou une Tesla P4/T4 si tu acceptes le bricolage. T4 si c&rsquo;est pour du H24 sobre. Et si tu es à l&rsquo;aise avec le tuning matériel, la V100 32 Go à ~350 € est imbattable en VRAM/prix.</li>



<li><strong>Bosser sérieusement, 32B, ComfyUI, le meilleur rapport qualité/prix.</strong> La <strong>RTX 3090 24 Go d&rsquo;occasion (700–1 000 €)</strong>. Sans hésiter. CUDA natif, 24 Go, bande passante correcte. Le neuf ne sert à rien.</li>



<li><strong>Charger de gros modèles 70B sans exploser le budget GPU.</strong> Un mini-PC à mémoire unifiée 64–128 Go (Minisforum, Strix Halo, ~2 300 €). En acceptant la lenteur et le support GPU partiel sous Linux.</li>



<li><strong>Nœud IA allumé en permanence, basse conso.</strong> Mac mini M4 (~2 800 € en 64 Go) ou Jetson. Conso de N100, moteur IA en plus.</li>



<li><strong>70B confortable, perf/watt propre, format bureau.</strong> Mac Studio M4 (~4 400 €) ou DGX Spark (~5 000 €), si le budget suit.</li>



<li><strong>Image lourde, puissance brute, training.</strong> RTX 4090 d&rsquo;occasion (~1 000–1 100 €) ou 5090 (3 500–5 000 €), archi récente obligatoire, sans oublier que la config 5090 complète tape dans les 1 000 W.</li>
</ul>



<p class="wp-block-paragraph">Le bon réflexe : pars de ton usage réel (inférence ? image ? always-on ?), déduis la mémoire dont tu as besoin, vérifie que ta stack supporte le matériel <strong>au GPU</strong>, et seulement après regarde le prix. Dans cet ordre. La machine la plus tape-à-l&rsquo;œil sur le papier n&rsquo;est pas forcément celle qui tournera le mieux chez toi.</p>



<p class="wp-block-paragraph">Et garde en tête les deux factures et le calendrier. À l&rsquo;achat, la mémoire est en pleine flambée et la tendance reste haussière jusqu&rsquo;en 2027-2028 : à ces prix-là, le calcul le plus malin n&rsquo;est pas forcément d&rsquo;acheter aujourd&rsquo;hui. Pour beaucoup, attendre deux ans que le marché se détende et tenir avec les API entre-temps coûte moins cher que d&rsquo;immobiliser plusieurs milliers d&rsquo;euros dans une machine achetée au pic. Si tu veux quand même du local maintenant, passe par l&rsquo;occasion, pas par du neuf gourmand en mémoire. En consommation, un GPU qui tourne, c&rsquo;est une centaine d&rsquo;euros par mois sur ta facture, chiffre réel à l&rsquo;appui. L&rsquo;IA en local n&rsquo;est pas gratuite. Elle peut valoir largement le coup, mais en connaissance de cause, les deux factures posées sur la table, et parfois la meilleure décision c&rsquo;est juste d&rsquo;attendre.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/06/11/quel-materiel-et-pour-quel-prix-en-2026-pour-faire-de-lia-en-local/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
		<item>
		<title>J&#8217;ai quitté OpenRouter pour OpenCode Go : ce que ça change vraiment sur la facture</title>
		<link>https://tazmenworld.com/2026/06/09/jai-quitte-openrouter-pour-opencode-go-ce-que-ca-change-vraiment-sur-la-facture/</link>
					<comments>https://tazmenworld.com/2026/06/09/jai-quitte-openrouter-pour-opencode-go-ce-que-ca-change-vraiment-sur-la-facture/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 06:49:40 +0000</pubDate>
				<category><![CDATA[Non classé]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=312</guid>

					<description><![CDATA[Je fais tourner un agent autonome (Hermes Agent de Nous Research) sur un mini PC dédié à la maison. Jusqu&#8217;à cette semaine, toutes ses requêtes LLM passaient par OpenRouter, avec DeepSeek V4 Flash comme modèle par défaut. OpenRouter, c&#8217;est pratique : une seule clé, des dizaines de modèles, paiement à l&#8217;usage. Mais le paiement à [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img width="1024" height="572"  alt="" class="wp-image-316"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/opencode_cleanup.jpeg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/opencode_cleanup.jpeg 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/opencode_cleanup-300x168.jpeg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/opencode_cleanup-768x429.jpeg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Je fais tourner un agent autonome (<a href="https://github.com/NousResearch/hermes-agent">Hermes Agent</a> de Nous Research) sur un mini PC dédié à la maison. Jusqu&rsquo;à cette semaine, toutes ses requêtes LLM passaient par OpenRouter, avec DeepSeek V4 Flash comme modèle par défaut.</p>



<p class="wp-block-paragraph">OpenRouter, c&rsquo;est pratique : une seule clé, des dizaines de modèles, paiement à l&rsquo;usage. Mais le paiement à l&rsquo;usage a un défaut quand on laisse tourner un agent : on ne sait jamais à l&rsquo;avance ce qu&rsquo;on va payer.</p>



<p class="wp-block-paragraph">J&rsquo;ai regardé mes chiffres. Ils m&rsquo;ont décidé.</p>



<h2 class="wp-block-heading">Les chiffres qui font mal</h2>



<p class="wp-block-paragraph">Sur <strong>2 jours</strong> d&rsquo;utilisation, voici ce que mon dashboard OpenRouter affichait :</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Modèle</th><th>Coût</th><th>Requêtes</th><th>Tokens</th></tr></thead><tbody><tr><td>DeepSeek V4 Flash</td><td>2,31 $</td><td>861</td><td>36 M</td></tr><tr><td>DeepSeek V4 Pro</td><td>1,40 $</td><td>13</td><td>~1,8 M</td></tr><tr><td><strong>Total</strong></td><td><strong>3,71 $</strong></td><td><strong>874</strong></td><td><strong>37,8 M</strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Deux choses sautent aux yeux.</p>



<figure class="wp-block-image size-large"><img width="1024" height="331"  alt="" class="wp-image-315"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-4-1024x331.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-4-1024x331.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-4-300x97.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-4-768x248.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-4-1536x497.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/image-4.png 1973w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">D&rsquo;abord, 3,71 $ en deux jours. Si je projette ça sur un mois, je tourne autour de <strong>55 $</strong>. C&rsquo;est beaucoup pour un agent perso.</p>



<p class="wp-block-paragraph">Ensuite, le détail qui m&rsquo;a le plus surpris : DeepSeek V4 Pro. <strong>13 requêtes seulement, mais 1,40 $</strong>  soit près de 40 % de ma facture pour 1,5 % de mes appels. Ces quelques requêtes lourdes que l&rsquo;agent décide de router vers un gros modèle, on ne les voit pas venir. Et c&rsquo;est exactement là que le paiement à l&rsquo;usage devient imprévisible.</p>



<h2 class="wp-block-heading">OpenCode Go : le coût fixe</h2>



<p class="wp-block-paragraph"><a href="https://opencode.ai/go">OpenCode Go</a>, c&rsquo;est un abonnement à <strong>10 $/mois</strong> (5 $ le premier mois) qui donne accès à une douzaine de modèles open source curatés : DeepSeek V4 Flash et Pro, Qwen3, Kimi K2, GLM-5, MiniMax, MiMo.</p>



<p class="wp-block-paragraph">Le point clé pour moi : l&rsquo;endpoint est <strong>compatible OpenAI</strong>. Pas besoin d&rsquo;utiliser l&rsquo;outil OpenCode lui-même. On branche la clé sur n&rsquo;importe quel agent qui parle à une API LLM/Hermes dans mon cas.</p>



<h2 class="wp-block-heading">La migration, étape par étape</h2>



<p class="wp-block-paragraph">Bonne surprise : Hermes supporte OpenCode Go nativement. La section est déjà prévue dans le fichier de config. La bascule m&rsquo;a pris cinq minutes.</p>



<h3 class="wp-block-heading">1. Récupérer la clé OpenCode Go</h3>



<p class="wp-block-paragraph">Après abonnement sur <a href="https://opencode.ai/go">opencode.ai/go</a>, la clé API se récupère depuis le dashboard. Elle commence par <code>sk-</code>.</p>



<h3 class="wp-block-heading">2. Ajouter la clé dans le <code>.env</code></h3>



<p class="wp-block-paragraph">Le fichier d&rsquo;environnement de Hermes se trouve dans <code>~/.hermes/.env</code>. On y décommente la ligne dédiée à OpenCode Go et on colle la clé :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>OPENCODE_GO_API_KEY=sk-votre-cle-ici</code></pre>



<p class="wp-block-paragraph">À noter : on peut laisser l&rsquo;ancienne clé OpenRouter en place. Hermes utilise le provider défini dans la config, pas celui dont la clé est présente. Pratique pour revenir en arrière sans rien réécrire.</p>



<h3 class="wp-block-heading">3. Pointer Hermes sur OpenCode Go</h3>



<p class="wp-block-paragraph">Trois commandes suffisent. On change le provider, l&rsquo;URL de base, et le modèle par défaut :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>hermes config set model.provider opencode-go
hermes config set model.base_url https://opencode.ai/zen/go/v1
hermes config set model.default opencode-go/deepseek-v4-flash</code></pre>



<p class="wp-block-paragraph">Je garde le même modèle (DeepSeek V4 Flash), je change juste le tuyau qui y mène.</p>



<h3 class="wp-block-heading">4. Vérifier depuis Telegram</h3>



<p class="wp-block-paragraph">Mon Hermes est piloté en partie via Telegram. La commande <code>/model</code> affiche la configuration courante et permet de changer de provider à la volée. C&rsquo;est le moyen le plus rapide de confirmer que la bascule a pris.</p>



<figure class="wp-block-image size-full"><img width="424" height="341"  alt="" class="wp-image-313"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-2.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-2.png 424w, https://tazmenworld.com/wp-content/uploads/2026/06/image-2-300x241.png 300w" sizes="auto, (max-width: 424px) 100vw, 424px" /></figure>



<p class="wp-block-paragraph">Et le résultat une fois le modèle sélectionné :</p>



<figure class="wp-block-image size-full"><img width="496" height="199"  alt="" class="wp-image-314"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-3.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-3.png 496w, https://tazmenworld.com/wp-content/uploads/2026/06/image-3-300x120.png 300w" sizes="auto, (max-width: 496px) 100vw, 496px" /></figure>



<p class="wp-block-paragraph">C&rsquo;est fait. L&rsquo;agent tourne désormais entièrement sur OpenCode Go.</p>



<h2 class="wp-block-heading">Le calcul, sans enjoliver</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th></th><th>Sur 2 jours</th><th>Projeté sur ~30 jours</th></tr></thead><tbody><tr><td>OpenRouter (réel)</td><td>3,71 $</td><td>~55 $</td></tr><tr><td>OpenCode Go (fixe)</td><td>—</td><td>10 $</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Sur le papier, c&rsquo;est <strong>80 % d&rsquo;économie</strong>. Mais je veux être honnête sur deux nuances, parce que c&rsquo;est facile de vendre du rêve avec ce genre de tableau.</p>



<p class="wp-block-paragraph"><strong>Nuance 1 : mes deux jours étaient atypiques.</strong> J&rsquo;étais en plein build de mon serveur d&rsquo;automation, avec des sessions très denses. Mon usage courant est plus léger. Donc les 55 $ projetés sont un plafond, pas une moyenne.</p>



<p class="wp-block-paragraph"><strong>Nuance 2 : OpenCode Go n&rsquo;est pas illimité.</strong> Les limites sont exprimées en valeur dollar, pas en nombre de requêtes, et elles se rechargent toutes les 5 heures. Les modèles plus légers durent plus longtemps que les gros. Si vous balancez du DeepSeek V4 Pro en continu, vous taperez le plafond. Pour un usage agent normal sur un modèle Flash, ça passe largement.</p>



<p class="wp-block-paragraph">Autrement dit : l&rsquo;économie est réelle, mais elle suppose un usage qui rentre dans les limites du forfait. Ce n&rsquo;est pas une licence pour consommer sans compter.</p>



<h2 class="wp-block-heading">Ce que je retiens</h2>



<p class="wp-block-paragraph">Le vrai gain, ce n&rsquo;est pas seulement le prix. C&rsquo;est la <strong>prévisibilité</strong>. Je sais que je paie 10 $ ce mois-ci, point. Plus de facture qui dérape à cause de quelques requêtes routées vers un modèle premium sans que je l&rsquo;aie demandé.</p>



<p class="wp-block-paragraph">Pour un agent qui tourne 24/7 sur du matériel perso, c&rsquo;est exactement ce que je cherchais : un coût plat, une seule clé, et assez de modèles pour ne jamais être bloqué.</p>



<h2 class="wp-block-heading">Je n&rsquo;abandonne pas OpenRouter pour autant</h2>



<p class="wp-block-paragraph">Important : OpenCode Go remplace OpenRouter pour le <strong>cerveau texte</strong> de mon agent, pas pour tout le reste. Je garde OpenRouter en parallèle, et il garde tout son sens pour des usages plus spécialisés : le TTS, la génération d&rsquo;image et la génération de vidéo. C&rsquo;est devenu un vrai hub multimodal, là où le paiement à l&rsquo;usage reste le bon modèle, on ne génère pas une vidéo toutes les cinq minutes.</p>



<p class="wp-block-paragraph">En vidéo justement, je travaille beaucoup en local sur ma machine principale (ComfyUI, GPU dédié). LTX et Wan sont d&rsquo;excellents modèles open source, largement suffisants pour la plupart de mes besoins, et gratuits une fois le matériel amorti.</p>



<p class="wp-block-paragraph">Mais soyons honnêtes : quand je veux le résultat au-dessus du lot, un Seedance 2.0 reste exceptionnel. C&rsquo;est là que le cloud garde l&rsquo;avantage  pour ces générations ponctuelles où la qualité prime sur le coût. D&rsquo;où l&rsquo;intérêt de garder une porte ouverte sur OpenRouter, qui donne accès à ce genre de modèle sous la même clé.</p>



<p class="wp-block-paragraph">La bonne architecture, pour moi, n&rsquo;est donc pas « tout cloud » ni « tout local ». C&rsquo;est : <strong>OpenCode Go pour le LLM de l&rsquo;agent</strong> (coût fixe, prévisible), <strong>le local pour le gros du multimodal</strong> (LTX, Wan), et <strong>OpenRouter en appoint</strong> pour le TTS et les générations haut de gamme comme Seedance 2.0.</p>



<h2 class="wp-block-heading">En résumé</h2>



<p class="wp-block-paragraph">Si votre conso OpenRouter en LLM dépasse régulièrement 10 $/mois, basculer le cerveau de votre agent vers OpenCode Go est vite rentable. En dessous, restez sur le paiement à l&rsquo;usage vous paierez moins. Et dans les deux cas, gardez OpenRouter sous la main pour ce qu&rsquo;il fait désormais très bien : le multimodal à la demande.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/06/09/jai-quitte-openrouter-pour-opencode-go-ce-que-ca-change-vraiment-sur-la-facture/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Pourquoi acheter un Mac mini ? Alors qu&#8217;un mini PC à 130€ fait tourner Hermes Agent 24h/24 aussi bien</title>
		<link>https://tazmenworld.com/2026/06/05/pourquoi-acheter-un-mac-mini-alors-quun-mini-pc-a-130e-fait-tourner-hermes-agent-24h-24-aussi-bien/</link>
					<comments>https://tazmenworld.com/2026/06/05/pourquoi-acheter-un-mac-mini-alors-quun-mini-pc-a-130e-fait-tourner-hermes-agent-24h-24-aussi-bien/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Fri, 05 Jun 2026 13:54:20 +0000</pubDate>
				<category><![CDATA[Non classé]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=296</guid>

					<description><![CDATA[Depuis quelques mois, je vois passer beaucoup de publications et de vidéos YouTube qui expliquent qu&#8217;il faut un Mac mini ou un VPS pour faire tourner un agent autonome comme OpenClow ou Hermes Agent. 700€ la machine, ou un abonnement mensuel qui part indéfiniment. Et en y réfléchissant bien, à ce qu&#8217;on leur demande concrètement [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="569"  alt="" class="wp-image-307"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/mac-vs-n150v2-1024x569.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/mac-vs-n150v2-1024x569.jpg 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/mac-vs-n150v2-300x167.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/mac-vs-n150v2-768x427.jpg 768w, https://tazmenworld.com/wp-content/uploads/2026/06/mac-vs-n150v2-1536x854.jpg 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/mac-vs-n150v2.jpg 1682w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Depuis quelques mois, je vois passer beaucoup de publications et de vidéos YouTube qui expliquent qu&rsquo;il faut un Mac mini ou un VPS pour faire tourner un agent autonome comme OpenClow ou Hermes Agent. 700€ la machine, ou un abonnement mensuel qui part indéfiniment. Et en y réfléchissant bien, à ce qu&rsquo;on leur demande concrètement : tourner 24h/24, attendre des messages Telegram, exécuter des workflows la nuit pendant qu&rsquo;on dort. Pas de l&rsquo;inférence lourde, pas de rendu 3D. Juste orchestrer et déléguer.</p>



<p class="wp-block-paragraph">Je vais te montrer une autre voie : un mini PC à 130€, moins gourmand, moins cher, qui fait exactement le même boulot.</p>



<p class="wp-block-paragraph">Cette machine tourne sans écran ni clavier depuis plusieurs semaines chez moi. Elle reçoit mes ordres par Telegram, exécute des tâches en arrière-plan, et s&rsquo;appuie sur ma machine principale ou OpenRouter quand elle a besoin de compute. C&rsquo;est le <strong>control plan permanent</strong> du setup, pas la brute de calcul.</p>



<p class="wp-block-paragraph">Voilà comment j&rsquo;ai fait, brique par brique, avec les détails d&rsquo;installation que j&rsquo;aurais aimé trouver en un seul endroit.</p>



<figure class="wp-block-image size-full"><img width="1020" height="768"  alt="" class="wp-image-297"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/PXL_20260604_155539924.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/PXL_20260604_155539924.jpg 1020w, https://tazmenworld.com/wp-content/uploads/2026/06/PXL_20260604_155539924-300x226.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/PXL_20260604_155539924-768x578.jpg 768w" sizes="auto, (max-width: 1020px) 100vw, 1020px" /></figure>



<h2 class="wp-block-heading">1. Le matos et pourquoi pas autre chose</h2>



<h3 class="wp-block-heading">Le mini PC : MLLSE G2 Pro</h3>



<p class="wp-block-paragraph">Intel N150, 12 Go de LPDDR5, 512 Go de SSD, WiFi 5, Bluetooth 5.0. Windows 11 Pro pré-installé, que j&rsquo;ai remplacé par du Linux en dix minutes.</p>



<p class="wp-block-paragraph">Le N150 est un quad-core basse consommation. Il ne va pas faire tourner un Llama 70B en local. Ce n&rsquo;est pas son rôle. Son rôle, c&rsquo;est d&rsquo;être <strong>sobre et toujours allumé</strong>. Sous charge normale de serveur, il tire <strong>9W</strong>. C&rsquo;est ridicule. Une ampoule LED de bureau en consomme davantage. Ramené à l&rsquo;année entière, ça représente environ <strong>8€ d&rsquo;électricité</strong> pour un serveur qui tourne 24h/24, à comparer aux 180€ d&rsquo;un VPS entrée de gamme sur la même période, rien qu&rsquo;en abonnement. Le chassis est conçu pour un usage permanent : pas de batterie qui gonfle, pas de ventilo qui s&rsquo;encrasse.</p>



<h3 class="wp-block-heading">Pourquoi pas un VPS cloud ?</h3>



<p class="wp-block-paragraph">5€/mois, ça paraît rien. Sur trois ans, tu as payé 180€ pour une machine qui n&rsquo;est pas chez toi, qui ne voit pas ton réseau local, et qui te facture chaque byte de trafic sortant. Mon agent IA a besoin de parler à Ollama sur ma machine principale, à ComfyUI, à SearXNG. Avec un VPS, tout ça passerait soit par internet (latence plus coût), soit par un tunnel VPN. Avec un mini PC sur le LAN, c&rsquo;est une simple requête HTTP sur le réseau interne. Pas de souci.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th></th><th>Mini PC local</th><th>VPS cloud</th></tr></thead><tbody><tr><td>Coût d&rsquo;entrée</td><td>130€ une fois</td><td>0€</td></tr><tr><td>Abonnement mensuel</td><td>0€</td><td>5 à 15€/mois</td></tr><tr><td>Coût total sur 3 ans</td><td>~154€ (matériel + élec)</td><td>180 à 540€</td></tr><tr><td>Accès réseau local</td><td>✅ Natif, zéro config</td><td>❌ Tunnel VPN requis</td></tr><tr><td>Latence vers Ollama, ComfyUI</td><td>&lt; 1ms (LAN)</td><td>20 à 100ms+</td></tr><tr><td>Données chez soi</td><td>✅</td><td>❌ Chez le prestataire</td></tr><tr><td>Coupure si impayé</td><td>Non</td><td>Oui</td></tr><tr><td>Upgrade RAM / SSD</td><td>✅ Possible</td><td>Dépend de l&rsquo;offre</td></tr><tr><td>Accès admin complet</td><td>✅ Root physique</td><td>✅ Root SSH</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Le mini PC coûte plus cher le premier jour. Il est moins cher dès le quatorzième mois, et il reste sur ton réseau.</p>



<h3 class="wp-block-heading">Pourquoi pas un vieux laptop ?</h3>



<p class="wp-block-paragraph">Un laptop qui tourne 24h/24, c&rsquo;est une batterie qui gonfle dans les douze mois, un ventilo qui accumule de la poussière, et une consommation 3 à 5× supérieure au mini PC. La machine n&rsquo;est pas faite pour ça. Le mini PC, si.</p>



<h3 class="wp-block-heading">Pourquoi pas le Mac mini M4 à 700€ ?</h3>



<p class="wp-block-paragraph">Parce que le gros calcul, je l&rsquo;ai déjà : Ryzen 9 + RTX 5070 Ti sur ma machine principale. Ce que je cherche ici, c&rsquo;est un <strong>orchestrateur sobre et permanent</strong> qui sait déléguer. La même logique headless que partout ailleurs : mettre le bon outil au bon endroit, ne pas gâcher la ressource. Le Mac mini ferait la même chose six fois plus cher.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. La stack : ce qu&rsquo;on installe et pourquoi chaque brique</h2>



<p class="wp-block-paragraph">Avant le détail de l&rsquo;installation, une vue d&rsquo;ensemble de l&rsquo;architecture cible.</p>



<p class="wp-block-paragraph">[SCHÉMA : tazmenworld ↔ autoserver ↔ Telegram ↔ internet]</p>



<figure class="wp-block-image size-large"><img width="1024" height="936"  alt="" class="wp-image-310"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-1-1024x936.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-1-1024x936.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-1-300x274.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-1-768x702.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-1.png 1205w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Le control plan (<code>autoserver</code>) décide et orchestre. Le compute (<code>tazmenworld</code>) calcule. La seule sortie cloud : les appels LLM vers OpenRouter. C&rsquo;est du <strong>pay-per-use</strong>, pas un abonnement fixe. À l&rsquo;usage courant, quelques dizaines de requêtes par jour sur DeepSeek V4, ça se chiffre en centimes. Tout le reste reste sur le réseau local.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. Ubuntu Server 26.04 LTS : le socle headless</h2>



<p class="wp-block-paragraph">Pas d&rsquo;interface graphique. C&rsquo;est un serveur, il vit en console. On choisit <strong>Ubuntu Server 26.04 LTS « Resolute Raccoon »</strong>, supporté jusqu&rsquo;en 2031 (2036 avec Ubuntu Pro, gratuit jusqu&rsquo;à 5 machines personnelles).</p>



<h3 class="wp-block-heading">Créer la clé USB depuis tazmenworld</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>cd ~/Downloads
wget https://releases.ubuntu.com/26.04/ubuntu-26.04-live-server-amd64.iso

# Identifier la clé USB
lsblk

# Écrire l'image (remplace /dev/sdX, ATTENTION : tout sera effacé)
sudo dd if=ubuntu-26.04-live-server-amd64.iso of=/dev/sdX bs=4M status=progress conv=fsync
sync</code></pre>



<h3 class="wp-block-heading">Options d&rsquo;installation qui comptent</h3>



<p class="wp-block-paragraph">On démarre sur la clé (touche <strong>F7</strong> ou <strong>Del</strong> au boot pour le menu), puis dans l&rsquo;installeur Subiquity :</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Étape</th><th>Choix</th></tr></thead><tbody><tr><td>Type d&rsquo;installation</td><td><strong>Ubuntu Server (minimized)</strong>, moins de paquets, moins de RAM grignotée</td></tr><tr><td>Réseau</td><td>DHCP pour l&rsquo;instant, on passe en IP statique après</td></tr><tr><td>Stockage</td><td><strong>Use entire disk</strong>, pas de LVM pour simplifier</td></tr><tr><td>Nom du serveur</td><td><code>autoserver</code></td></tr><tr><td><strong>OpenSSH</strong></td><td>✅ <strong>À cocher absolument</strong>, sinon tu ne peux plus te connecter à distance</td></tr><tr><td>Snaps additionnels</td><td>Rien, on installe tout manuellement</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Une fois installé, on retire la clé USB, on redémarre. La machine boote en console texte. C&rsquo;est normal, c&rsquo;est voulu.</p>



<h3 class="wp-block-heading">Mise à jour complète et outils de base</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt upgrade -y
sudo apt autoremove -y

sudo apt install -y \
  curl wget git nano htop net-tools \
  ca-certificates gnupg lsb-release \
  ufw fail2ban unattended-upgrades \
  tree jq ncdu

sudo reboot</code></pre>



<h3 class="wp-block-heading">IP statique via Netplan</h3>



<p class="wp-block-paragraph">Un serveur ne peut pas changer d&rsquo;IP à chaque redémarrage. On configure une IP fixe via Netplan, mais avant d&rsquo;écrire quoi que ce soit, on vérifie <strong>la vraie adresse de la passerelle</strong>. Sur ton réseau, elle n&rsquo;est pas forcément <code>192.168.1.1</code>. La vérifier d&rsquo;abord sur <code>tazmenworld</code> :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>ip route | grep default
# Exemple : default via 192.168.1.254 dev enp14s0
#                       ↑ c'est cette IP qu'on met dans netplan</code></pre>



<p class="wp-block-paragraph">Puis on identifie l&rsquo;interface réseau sur <code>autoserver</code> :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>ip link show
# Exemple : enp2s0 (Ethernet), préférer l'Ethernet au WiFi pour un serveur</code></pre>



<p class="wp-block-paragraph">On édite la config :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo nano /etc/netplan/00-installer-config.yaml</code></pre>



<p class="wp-block-paragraph">yaml</p>



<pre class="wp-block-code"><code>network:
  version: 2
  renderer: networkd
  ethernets:
    enp2s0:                        # adapter à ton interface
      addresses:
        - 192.168.1.20/24
      routes:
        - to: default
          via: 192.168.1.254       # ta vraie passerelle, pas une supposée
      nameservers:
        addresses: &#91;1.1.1.1, 8.8.8.8]
      dhcp4: <strong>false</strong></code></pre>



<p class="wp-block-paragraph">On applique et on vérifie :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo netplan apply
ip addr show enp2s0        # l'IP 192.168.1.20 doit apparaître
ping -c 3 1.1.1.1          # si ça ne répond pas → passerelle incorrecte
ping -c 3 tazmenworld      # joignabilité réseau local</code></pre>



<h3 class="wp-block-heading">Synchronisation horaire</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo timedatectl set-timezone Europe/Paris
timedatectl status
# "System clock synchronized: yes" doit apparaître</code></pre>



<h3 class="wp-block-heading">Sécurisation SSH</h3>



<p class="wp-block-paragraph">On génère une paire de clés ed25519 sur <code>tazmenworld</code> :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>ssh-keygen -t ed25519 -C "tazmenworld→autoserver" -f ~/.ssh/autoserver_key</code></pre>



<p class="wp-block-paragraph">On copie la clé publique sur <code>autoserver</code> (avec le mot de passe temporaire) :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>ssh-copy-id -i ~/.ssh/autoserver_key.pub &lt;votre_user&gt;@192.168.1.20</code></pre>



<p class="wp-block-paragraph">On teste la connexion par clé :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>ssh -i ~/.ssh/autoserver_key &lt;votre_user&gt;@192.168.1.20</code></pre>



<p class="wp-block-paragraph">Puis on durcit la config SSH sur <code>autoserver</code> :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo nano /etc/ssh/sshd_config</code></pre>



<pre class="wp-block-code"><code>Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
AllowUsers &lt;votre_user&gt;
X11Forwarding no</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Spécificité Ubuntu 26.04, deux points à ne pas rater :</strong></p>



<p class="wp-block-paragraph"><strong>1. X11Forwarding en double.</strong> Le fichier par défaut contient souvent <code>X11Forwarding yes</code> plus haut. Commente cette ligne, sinon ta ligne <code>no</code> en bas sera ignorée.</p>



<p class="wp-block-paragraph"><strong>2. Socket activation.</strong> Ubuntu 26.04 gère le port SSH via <code>ssh.socket</code>. Un simple <code>restart ssh</code> ne suffit pas :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo systemctl daemon-reload
sudo systemctl restart ssh.socket</code></pre>
</blockquote>



<p class="wp-block-paragraph"><strong>⚠️ Teste depuis un deuxième terminal avant de fermer ta session actuelle :</strong></p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code># Depuis tazmenworld, nouveau terminal
ssh -i ~/.ssh/autoserver_key -p 2222 &lt;votre_user&gt;@192.168.1.20</code></pre>



<p class="wp-block-paragraph">Si ça passe, on peut fermer l&rsquo;ancienne session. On configure ensuite un profil SSH sur <code>tazmenworld</code> pour ne plus jamais taper l&rsquo;IP :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>nano ~/.ssh/config</code></pre>



<pre class="wp-block-code"><code>Host autoserver
    HostName 192.168.1.20
    Port 2222
    User &lt;votre_user&gt;
    IdentityFile ~/.ssh/autoserver_key
    ServerAliveInterval 60</code></pre>



<p class="wp-block-paragraph">Désormais : <code>ssh autoserver</code>. C&rsquo;est tout.</p>



<h3 class="wp-block-heading">Pare-feu UFW et Fail2ban</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code># Règles UFW
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp comment "SSH"
sudo ufw allow 5678/tcp comment "n8n"
sudo ufw allow from 192.168.1.0/24 comment "Réseau local"
sudo ufw enable
sudo ufw status verbose</code></pre>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code># Fail2ban, bannissement auto des tentatives de brute-force
sudo nano /etc/fail2ban/jail.local</code></pre>



<p class="wp-block-paragraph">ini</p>



<pre class="wp-block-code"><code>&#91;DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 3

&#91;sshd]
enabled  = true
port     = 2222
logpath  = /var/log/auth.log</code></pre>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd</code></pre>



<h3 class="wp-block-heading">Mises à jour automatiques de sécurité</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo dpkg-reconfigure --priority=low unattended-upgrades
# → Yes</code></pre>



<p class="wp-block-paragraph">Le serveur se patche tout seul sur les failles de sécurité. On n&rsquo;a plus à y penser.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4. Docker : l&rsquo;isolement propre</h2>



<p class="wp-block-paragraph">Pour n8n, on containerise. Docker isole le service, simplifie les mises à jour, et évite de polluer le système hôte.</p>



<p class="wp-block-paragraph"><strong>Note Ubuntu 26.04 :</strong> Resolute Raccoon a supprimé le support de cgroup v1. Docker le gère nativement depuis la v20.10, mais il faut impérativement passer par le <strong>dépôt officiel Docker</strong>, pas le paquet <code>docker.io</code> des dépôts Ubuntu qui est souvent en retard.</p>



<h3 class="wp-block-heading">Installation Docker CE (méthode officielle)</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code># Supprimer d'éventuelles vieilles versions
sudo apt remove -y docker docker-engine docker.io containerd runc <strong>2</strong>&gt;/dev/null

# Clés GPG et dépôt officiel Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb &#91;arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
                    docker-buildx-plugin docker-compose-plugin</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Si <code>apt update</code> échoue</strong> avec une erreur sur le codename <code>resolute</code> : le dépôt Docker n&rsquo;a peut-être pas encore indexé 26.04. Solution : forcer le codename <code>noble</code> (24.04), les paquets sont compatibles.</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>echo \
  "deb &#91;arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu noble stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null
sudo apt update</code></pre>
</blockquote>



<h3 class="wp-block-heading">Ajouter l&rsquo;utilisateur au groupe docker</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo usermod -aG docker &lt;votre_user&gt;</code></pre>



<p class="wp-block-paragraph"><strong>Piège sur install minimized :</strong> <code>newgrp</code> n&rsquo;est pas disponible. Le groupe ne s&rsquo;active pas dans la session en cours. Tu dois te déconnecter et te reconnecter, sans message d&rsquo;erreur explicite, juste un <code>permission denied</code> silencieux sur <code>docker run</code> si tu oublies ce détail.</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>exit
# puis : ssh autoserver

# Tester depuis la nouvelle session
docker run --rm hello-world
docker compose version</code></pre>



<h3 class="wp-block-heading">Configurer le daemon Docker</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo nano /etc/docker/daemon.json</code></pre>



<p class="wp-block-paragraph">json</p>



<pre class="wp-block-code"><code>{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "default-address-pools": &#91;
    {"base": "172.20.0.0/16", "size": 24}
  ]
}</code></pre>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo systemctl restart docker
docker info | grep -i "log driver"
# Attendu : Logging Driver: json-file</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">5. Structure des répertoires</h2>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo mkdir -p /opt/autoserver/{n8n,hermes,shared,backups}
sudo chown -R &lt;votre_user&gt;:&lt;votre_user&gt; /opt/autoserver</code></pre>



<pre class="wp-block-code"><code>/opt/autoserver/
├── n8n/
│   ├── docker-compose.yml
│   ├── .env
│   └── data/            ← volume persistant n8n
├── hermes/
│   └── data/
├── shared/              ← fichiers échangés entre services
└── backups/             ← sauvegardes automatiques</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">6. n8n : le moteur de workflows</h2>



<p class="wp-block-paragraph">n8n, c&rsquo;est le chef d&rsquo;orchestre des automatisations que tu as câblées. Il sait : « à 7h chaque matin, lance cette recherche ; si tel webhook arrive, déclenche ce traitement ». Interface visuelle, scriptable, il se connecte à des centaines de services.</p>



<h3 class="wp-block-heading">Fichier d&rsquo;environnement</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>nano /opt/autoserver/n8n/.env</code></pre>



<p class="wp-block-paragraph">env</p>



<pre class="wp-block-code"><code># Réseau
N8N_HOST=0.0.0.0
N8N_PORT=5678
N8N_PROTOCOL=http
WEBHOOK_URL=http://192.168.1.20:5678/

# Sécurité
N8N_ENCRYPTION_KEY=&lt;générer_avec_openssl_rand_-hex_16&gt;
GENERIC_TIMEZONE=Europe/Paris
NODE_ENV=production

# Indispensable en HTTP local, voir section "pièges"
N8N_SECURE_COOKIE=false

# Désactiver la télémétrie (évite des erreurs réseau parasites dans les logs)
N8N_DIAGNOSTICS_ENABLED=false
N8N_VERSION_NOTIFICATIONS_ENABLED=false

# Connexion Ollama sur tazmenworld
OLLAMA_BASE_URL=http://192.168.1.100:11434</code></pre>



<p class="wp-block-paragraph">Pour générer une clé d&rsquo;encryption solide :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>openssl rand -hex 16</code></pre>



<h3 class="wp-block-heading">Docker Compose n8n</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>nano /opt/autoserver/n8n/docker-compose.yml</code></pre>



<p class="wp-block-paragraph">yaml</p>



<pre class="wp-block-code"><code>services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
    env_file:
      - .env
    volumes:
      - ./data:/home/node/.n8n
      - /opt/autoserver/shared:/shared
    networks:
      - autoserver_net
    extra_hosts:
      - "tazmenworld:192.168.1.100"

networks:
  autoserver_net:
    name: autoserver_net
    driver: bridge</code></pre>



<p class="wp-block-paragraph">Le <code>extra_hosts</code> permet d&rsquo;appeler <code>http://tazmenworld:11434</code> depuis les workflows n8n au lieu d&rsquo;une IP brute : plus lisible, et ça survit à un changement d&rsquo;IP sans tout recâbler.</p>



<h3 class="wp-block-heading">Fix permissions du volume (indispensable)</h3>



<p class="wp-block-paragraph">n8n tourne dans son container sous l&rsquo;utilisateur <code>node</code> (UID 1000). Si le dossier <code>data</code> appartient à root, il ne peut pas écrire et <strong>crashe en boucle</strong> dès le démarrage sans message clair.</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo chown -R 1000:1000 /opt/autoserver/n8n/data</code></pre>



<h3 class="wp-block-heading">Autoriser Docker à sortir sur internet (UFW)</h3>



<p class="wp-block-paragraph">Par défaut, UFW bloque le forwarding des containers. n8n démarre correctement, mais tout appel HTTP externe échoue en silence : les workflows ne peuvent pas joindre d&rsquo;API extérieure.</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo nano /etc/default/ufw
# Changer cette ligne :
# DEFAULT_FORWARD_POLICY="DROP"  →  DEFAULT_FORWARD_POLICY="ACCEPT"

sudo ufw reload</code></pre>



<h3 class="wp-block-heading">Lancer n8n</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>cd /opt/autoserver/n8n
docker compose up -d
docker compose logs -f     # Ctrl+C pour quitter</code></pre>



<p class="wp-block-paragraph">Quand tu vois <code>n8n ready on ::, port 5678</code>, l&rsquo;interface est accessible depuis <code>tazmenworld</code> via <code>http://192.168.1.20:5678</code>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">7. Hermes Agent : l&rsquo;IA qui décide seule</h2>



<p class="wp-block-paragraph">C&rsquo;est la brique qui fait passer le setup d&rsquo;un serveur d&rsquo;automatisation classique à un <strong>agent IA autonome</strong>. Hermes Agent est un projet open-source de Nous Research (licence MIT) : mémoire persistante entre les sessions, génération de ses propres skills, terminal sandboxé sous Docker, et gateway Telegram intégré. Là où n8n exécute des rails que tu as tracés, Hermes reçoit un objectif et se débrouille.</p>



<h3 class="wp-block-heading">Installation</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash</code></pre>



<p class="wp-block-paragraph">Le script gère tout : Python 3.11, Node.js 22, ripgrep, ffmpeg. Il lance ensuite automatiquement le wizard de configuration.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Prérequis :</strong> internet doit être accessible depuis <code>autoserver</code>. Si <code>curl -I https://github.com</code> répond <code>No route to host</code>, tu as un problème de passerelle dans Netplan. Voir la section sur l&rsquo;IP statique.</p>
</blockquote>



<h3 class="wp-block-heading">Configuration via le wizard</h3>



<figure class="wp-block-image size-large"><img width="1024" height="712"  alt="" class="wp-image-303"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-09-37-1024x712.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-09-37-1024x712.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-09-37-300x208.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-09-37-768x534.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-09-37.png 1498w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Les choix qui importent :</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Étape</th><th>Choix</th></tr></thead><tbody><tr><td>Backend LLM</td><td><strong>OpenRouter</strong>, pour requêter DeepSeek V4</td></tr><tr><td>Clé API OpenRouter</td><td><code>sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code></td></tr><tr><td>Modèle</td><td><code>deepseek/deepseek-v4</code></td></tr><tr><td>Outils</td><td>Tout cocher ✅ (web search, génération d&rsquo;image, browser, terminal)</td></tr><tr><td>Terminal backend</td><td><strong>Docker</strong>, sandbox isolé, propre</td></tr><tr><td>Messaging</td><td><strong>Set up messaging now</strong> → Telegram</td></tr><tr><td>Type de service</td><td><strong>System service</strong>, démarre au boot sans session ouverte</td></tr></tbody></table></figure>



<figure class="wp-block-image size-large"><img width="1024" height="764"  alt="" class="wp-image-301"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-21-58-1024x764.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-21-58-1024x764.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-21-58-300x224.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-21-58-768x573.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-21-58.png 1505w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img width="1024" height="601"  alt="" class="wp-image-302"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-26-22-1024x601.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-26-22-1024x601.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-26-22-300x176.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-26-22-768x451.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-04-22-26-22.png 1505w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Configurer le bot Telegram</h3>



<ol class="wp-block-list">
<li>Ouvre Telegram, cherche <code>@BotFather</code> → <code>/newbot</code></li>



<li>Donne un nom et un identifiant à ton bot</li>



<li>Récupère le token : <code>123456789:AAH-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code></li>



<li>Cherche <code>@userinfobot</code> → note ton User ID numérique</li>



<li>Renseigne le token et l&rsquo;User ID dans le wizard</li>



<li>Réponds <strong>Y</strong> pour le Home Channel (DM direct avec le bot)</li>



<li>Réponds <strong>Y</strong> pour installer comme service en arrière-plan</li>
</ol>



<h3 class="wp-block-heading">Activer le linger : le détail qui rend le setup vraiment autonome</h3>



<p class="wp-block-paragraph">Le gateway Telegram tourne en <strong>user service</strong> systemd. Sans cette configuration, il ne démarre pas au boot si aucune session utilisateur n&rsquo;est ouverte. Résultat : après une coupure de courant à 3h du matin, ton agent reste silencieux jusqu&rsquo;à ce que quelqu&rsquo;un se connecte en SSH.</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo loginctl enable-linger &lt;votre_user&gt;

# Vérifier
loginctl show-user &lt;votre_user&gt; | grep Linger
# Attendu : Linger=yes</code></pre>



<p class="wp-block-paragraph">Une fois activé, le serveur peut redémarrer seul : le gateway Telegram revient en ligne sans intervention de ta part.</p>



<h3 class="wp-block-heading">Vérification et commandes utiles</h3>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code># Statut du gateway
systemctl --user status hermes-gateway

# Test CLI interactif
source ~/.bashrc
hermes
&gt; Bonjour, que peux-tu faire sur ce serveur ?

# Changer de modèle à chaud, sans redémarrage
hermes setup model

# Mettre à jour
hermes update

# Diagnostic complet
hermes doctor</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">8. Intégration avec la stack de tazmenworld</h2>



<p class="wp-block-paragraph">Depuis n8n ou Hermes sur <code>autoserver</code>, tous les services de <code>tazmenworld</code> sont accessibles directement par IP locale :</p>



<pre class="wp-block-code"><code>Ollama        → http://192.168.1.100:11434
Open WebUI    → http://192.168.1.100:3000
ComfyUI       → http://192.168.1.100:8188
SearXNG       → http://192.168.1.100:8080
n8n principal → http://192.168.1.100:5678</code></pre>



<p class="wp-block-paragraph">Pour centraliser ça proprement :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>nano /opt/autoserver/.env.global</code></pre>



<p class="wp-block-paragraph">env</p>



<pre class="wp-block-code"><code>TAZMENWORLD_IP=192.168.1.100
AUTOSERVER_IP=192.168.1.20

OLLAMA_URL=http://192.168.1.100:11434
OPENWEBUI_URL=http://192.168.1.100:3000
COMFYUI_URL=http://192.168.1.100:8188
SEARXNG_URL=http://192.168.1.100:8080
N8N_TAZMEN_URL=http://192.168.1.100:5678

OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
OPENROUTER_API_KEY=sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code></pre>



<p class="wp-block-paragraph">Et les deux instances n8n peuvent se parler : depuis <code>autoserver</code>, un nœud <strong>HTTP Request</strong> vers <code>http://192.168.1.100:5678/webhook/&lt;ton-webhook-id&gt;</code> déclenche un workflow sur <code>tazmenworld</code>. Les deux instances bossent ensemble.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">9. Hermes en action : la démo Telegram</h2>



<p class="wp-block-paragraph">Là où n8n exécute des rails que tu as tracés, Hermes reçoit un <strong>objectif en langage naturel</strong> et se débrouille pour l&rsquo;atteindre. Sa mémoire persistante lui permet de se souvenir des échanges précédents et d&rsquo;ajuster son comportement au fil du temps.</p>



<p class="wp-block-paragraph">Exemple concret, hier soir depuis le téléphone :</p>



<pre class="wp-block-code"><code>Moi :    Fais une veille sur les modèles open-weight sortis cette semaine.
         Résume les 5 plus intéressants en 3 lignes chacun et dépose
         le résumé dans /shared/veille.md

Hermes : Je lance les recherches. Je te préviens quand c'est déposé.

&#91;quelques minutes plus tard]

Hermes : ✅ Résumé déposé dans /shared/veille.md, 5 modèles couverts.</code></pre>



<figure class="wp-block-video"><video height="468" style="aspect-ratio: 748 / 468;" width="748" controls src="https://tazmenworld.com/wp-content/uploads/2026/06/hermes_agent.mp4" class="lws-optimize-lazyload"></video></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Le fichier était là le matin. Je n&rsquo;avais pas rouvert l&rsquo;app entre les deux messages.</p>



<p class="wp-block-paragraph">Ce qui rend ça possible, c&rsquo;est le linger activé plus haut. L&rsquo;agent tourne en fond, il n&rsquo;a pas besoin que tu sois connecté en SSH, il n&rsquo;attend pas que l&rsquo;écran soit allumé. Il fait son boulot, prévient, et attend le prochain ordre.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">10. Les trois pièges que j&rsquo;ai rencontrés</h2>



<h3 class="wp-block-heading">Piège 1 : La passerelle réseau qu&rsquo;on suppose à tort</h3>



<p class="wp-block-paragraph">En configurant l&rsquo;IP statique, j&rsquo;ai mis <code>192.168.1.1</code> comme passerelle sans vérifier. Résultat : ping local OK, accès internet mort. Impossible d&rsquo;installer Hermes : <code>curl -I https://github.com</code> répondait <code>No route to host</code>.</p>



<p class="wp-block-paragraph">La règle : <strong>ne jamais supposer</strong> l&rsquo;IP de la passerelle. La vérifier en amont avec <code>ip route | grep default</code> sur une machine qui marche, reporter la vraie valeur dans Netplan. Vingt secondes de vérification qui évitent une heure de debug.</p>



<h3 class="wp-block-heading">Piège 2 : Les permissions Docker sur trois fronts</h3>



<p class="wp-block-paragraph">Trois problèmes distincts, tous liés aux permissions, tous bloquants à leur façon.</p>



<p class="wp-block-paragraph"><strong>Le groupe docker ne s&rsquo;active pas immédiatement.</strong> Après <code>usermod -aG docker</code>, sur une install minimized <code>newgrp</code> n&rsquo;est pas disponible. Le groupe ne prend effet qu&rsquo;après déconnexion/reconnexion, sans message d&rsquo;erreur explicite, juste un <code>permission denied</code> sur <code>docker run</code>.</p>



<p class="wp-block-paragraph"><strong>n8n crashe en boucle au démarrage.</strong> Le container tourne sous l&rsquo;UID 1000 (<code>node</code>). Si le dossier <code>data</code> appartient à root, n8n ne peut pas écrire et redémarre toutes les trente secondes. Fix : <code>sudo chown -R 1000:1000 /opt/autoserver/n8n/data</code>. C&rsquo;est la première chose à faire avant de lancer le container.</p>



<p class="wp-block-paragraph"><strong>n8n ne sort pas sur internet.</strong> UFW bloque par défaut le forwarding des containers. Les workflows se déclenchent, mais tout appel HTTP externe échoue en silence. Fix : passer <code>DEFAULT_FORWARD_POLICY</code> de <code>"DROP"</code> à <code>"ACCEPT"</code> dans <code>/etc/default/ufw</code>, puis <code>sudo ufw reload</code>.</p>



<h3 class="wp-block-heading">Piège 3 : Le cookie n8n qui bloque la connexion</h3>



<p class="wp-block-paragraph">Tu ouvres l&rsquo;interface, tu entres tes identifiants, ça ne passe pas. Aucun message d&rsquo;erreur clair. n8n exige par défaut un cookie sécurisé qui ne fonctionne qu&rsquo;en HTTPS. En HTTP sur le réseau local, c&rsquo;est l&rsquo;impasse.</p>



<p class="wp-block-paragraph">Une ligne dans le <code>.env</code> règle l&rsquo;affaire :</p>



<p class="wp-block-paragraph">env</p>



<pre class="wp-block-code"><code>N8N_SECURE_COOKIE=false</code></pre>



<p class="wp-block-paragraph">Redémarre le container, l&rsquo;interface s&rsquo;ouvre. À ne configurer qu&rsquo;en local sur un réseau de confiance. Dès qu&rsquo;on expose vers l&rsquo;extérieur, on passe par un reverse proxy HTTPS.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">11. Ce qu&rsquo;on peut faire avec</h2>



<p class="wp-block-paragraph">Le setup une fois en place, voilà ce qui tourne concrètement.</p>



<p class="wp-block-paragraph"><strong>Veille techno automatique.</strong> Chaque matin à 7h, n8n déclenche une recherche via SearXNG sur <code>tazmenworld</code>, envoie les résultats à l&rsquo;agent, et m&rsquo;expédie un digest propre sur Telegram. J&rsquo;ouvre le téléphone au réveil avec un résumé au lieu de vingt onglets à scroller.</p>



<p class="wp-block-paragraph"><strong>Tâches longues en arrière-plan.</strong> Je donne un objectif à Hermes le soir (un comparatif de solutions, une analyse de logs, une rédaction), il découpe, cherche, rédige, et dépose le fichier dans <code>/shared/</code>. Au matin, c&rsquo;est prêt. Le « pendant que tu dors » du titre, c&rsquo;est littéralement ça.</p>



<p class="wp-block-paragraph"><strong>Délégation au GPU.</strong> L&rsquo;agent reçoit une demande de génération d&rsquo;image, mais le N150 n&rsquo;a pas de GPU sérieux. Pas de souci : il envoie le job à ComfyUI sur <code>tazmenworld</code> via <code>http://192.168.1.100:8188</code>, récupère le résultat, me le renvoie. Le control plan décide, le compute exécute.</p>



<p class="wp-block-paragraph"><strong>Webhooks inter-machines.</strong> Un workflow sur <code>autoserver</code> peut déclencher un workflow sur le n8n de <code>tazmenworld</code> via un nœud HTTP Request vers <code>http://192.168.1.100:5678/webhook/&lt;id&gt;</code>. Les deux instances se parlent sans passer par internet.</p>



<p class="wp-block-paragraph"><strong>Sauvegarde automatique à 3h du matin.</strong> Un cron sauvegarde les volumes Docker et garde les 7 dernières copies. Un alias <code>as-status</code> donne en deux secondes l&rsquo;état des containers, la RAM, le disque, et la connectivité vers <code>tazmenworld</code>. Le serveur se surveille tout seul.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">Il y a six mois, monter ce genre de setup demandait une connaissance pointue de Docker, des agents IA, et du self-hosting Linux. Aujourd&rsquo;hui, l&rsquo;installation tient en une soirée, et le résultat c&rsquo;est un control plan IA permanent sur ton réseau local, piloté depuis ton téléphone, qui bosse sans te demander la permission.</p>



<p class="wp-block-paragraph">Le Mac mini n&rsquo;est pas mauvais. Il est juste disproportionné pour ce rôle. Et le vrai problème d&rsquo;un VPS, ce n&rsquo;est pas le prix : c&rsquo;est qu&rsquo;il ne voit pas ton réseau local. Un agent IA qui ne peut pas parler à tes services, c&rsquo;est un outil à moitié aveugle.</p>



<p class="wp-block-paragraph">Le mini PC à 130€ règle les deux problèmes : il est sur ton LAN, il est sobre, il ne s&rsquo;arrête pas. Le calcul lourd, il a juste à savoir l&rsquo;adresse de ta vraie machine pour le déléguer. C&rsquo;est la même logique qu&rsquo;on applique partout ici : ne pas gâcher la ressource, mettre le bon outil au bon endroit.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Matériel : MLLSE G2 Pro (Intel N150, 12 Go LPDDR5, 512 Go SSD). Stack : Ubuntu Server 26.04 LTS, Docker, n8n, Hermes Agent (Nous Research, licence MIT), DeepSeek V4 via OpenRouter. Les tokens, clés API et mots de passe dans les exemples sont des espaces réservés, génère les tiens avec les commandes indiquées.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/06/05/pourquoi-acheter-un-mac-mini-alors-quun-mini-pc-a-130e-fait-tourner-hermes-agent-24h-24-aussi-bien/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://tazmenworld.com/wp-content/uploads/2026/06/hermes_agent.mp4" length="2948597" type="video/mp4" />

			</item>
	</channel>
</rss>
