.HTA — HTML Application
Un fichier .hta est une application Windows autonome écrite en HTML, CSS et JavaScript (ou VBScript), exécutée par le moteur MSHTML avec des privilèges système complets — sans le bac à sable d'un navigateur web.
Définition & fonctionnement
HTA signifie HTML Trusted Application. C'est un format propriétaire Microsoft qui transforme une page HTML ordinaire en une application de bureau Windows à part entière — avec une fenêtre propre, un accès complet au système de fichiers, au registre Windows et à tous les objets COM.
Techniquement, un .hta est identique à un fichier HTML — même
syntaxe, même CSS, même JavaScript — à une différence fondamentale : il est exécuté par
mshta.exe au lieu d'un navigateur, ce qui supprime toute restriction de sécurité
et donne accès aux composants Windows natifs via ActiveX.
Le runtime : mshta.exe
mshta.exe est présent sur toutes les versions de Windows depuis Windows 2000,
dans C:\Windows\System32\mshta.exe. Il instancie le moteur MSHTML dans une fenêtre
applicative dédiée sans chrome de navigateur.
# Lancement automatique (association de fichier Windows) MonApp.hta # Lancement explicite via le runtime mshta.exe "C:\MonApp\MonApp.hta" # Depuis un partage réseau (intranet entreprise) mshta.exe "\\serveur\partage\outil.hta"
Historique & contexte
Le format HTA est né dans l'ère où Microsoft cherchait à positionner Internet Explorer non pas comme un simple navigateur, mais comme la couche d'interface universelle de Windows.
Microsoft introduit le format HTA avec Internet Explorer 5.0 et Windows 98 SE. L'objectif : créer des outils d'administration internes avec les technologies web (HTML4, CSS1, JScript).
HTA devient un pilier des outils d'administration système. Les équipes IT l'utilisent
massivement pour créer des interfaces de déploiement et de configuration de parc.
mshta.exe est intégré à toutes les installations Windows.
Les HTA se multiplient en entreprise. Ils remplacent des applications VB6 vieillissantes sans coût de développement important. WScript.Shell, FSO et WMI les rendent extrêmement puissants.
L'essor du web moderne (HTML5, CSS3), la mort progressive d'IE, et les premières failles exploitées via HTA amorcent le déclin. PowerShell propose une alternative plus sûre pour l'administration système.
Des groupes APT exploitent massivement les fichiers HTA pour distribuer des malwares, notamment via e-mails piégés. Microsoft ajoute des avertissements SmartScreen mais maintient le support.
Windows 11 et Defender for Endpoint bloquent de plus en plus les HTA par défaut
en entreprise. Le format n'est plus développé, mais mshta.exe reste
présent et fonctionnel pour les usages locaux de confiance.
Compatibilité par plateforme
.hta ne fonctionnent
que sur Windows. Incompatibles avec macOS, Linux, iOS, Android et tout
navigateur web moderne. Ce n'est pas un manque de port — c'est une impossibilité
architecturale.| Fonctionnalité | Win 10/11 | Win 7/8 | Wine Linux | macOS | Mobile |
|---|---|---|---|---|---|
| Rendu HTML/CSS | OUI | OUI | PARTIEL | NON | NON |
| JavaScript (ES5) | OUI | OUI | PARTIEL | NON | NON |
| VBScript | OUI | OUI | NON | NON | NON |
| WScript.Shell | OUI | OUI | NON | NON | NON |
| FileSystemObject | OUI | OUI | NON | NON | NON |
| ActiveX / COM | OUI | OUI | NON | NON | NON |
| CSS3 / Flexbox | LIMITÉ | NON | NON | NON | NON |
| ES6+ (let, =>, fetch) | NON | NON | NON | NON | NON |
var() (variables CSS), CSS Grid, ES6 (let, const,
arrow functions, Promise, fetch). Coder en ES5 strict et CSS
compatible IE11. Toujours inclure
<meta http-equiv="x-ua-compatible" content="IE=edge">.Structure d'un fichier HTA
Un fichier HTA est un fichier texte (UTF-8 ou ANSI) avec l'extension .hta.
Sa structure est celle d'une page HTML classique, augmentée de la balise propriétaire
<hta:application> dans le <head>.
<html> <head> <title>Mon Application</title> <!-- Balise qui transforme le HTML en HTA --> <hta:application id="monApp" applicationname="MonApp" border="thin" caption="yes" showintaskbar="yes" singleinstance="yes" windowstate="normal" /> <!-- Force le mode de rendu IE le plus récent disponible --> <meta http-equiv="x-ua-compatible" content="IE=edge"/> <meta charset="utf-8"/> <style> body { font-family: Segoe UI, Arial; background: #1a1a2e; } </style> <!-- VBScript : tâches système bas niveau --> <script language="VBScript"> Function ScriptDir() Dim p p = document.location.pathname p = Replace(p, "/", "\") If Left(p, 1) = "\" Then p = Mid(p, 2) ScriptDir = Left(p, InStrRev(p, "\") - 1) End Function </script> <!-- JavaScript ES5 : logique applicative et DOM --> <script> var shell = new ActiveXObject("WScript.Shell"); var fso = new ActiveXObject("Scripting.FileSystemObject"); function ouvrirNotepad() { shell.Run("notepad.exe"); } </script> </head> <body> <button onclick="ouvrirNotepad()">Ouvrir Notepad</button> </body> </html>
La balise <hta:application>
C'est la balise qui différencie un HTA d'un HTML ordinaire. Placée dans le <head>,
elle n'est interprétée que par mshta.exe — les navigateurs l'ignorent.
| Attribut | Valeurs | Description |
|---|---|---|
applicationname | chaîne | Nom de l'application affiché dans les propriétés Windows. |
border | thick thin dialog none | Style de bordure de la fenêtre. |
borderstyle | normal complex raised static sunken | Apparence de la bordure. |
caption | yes / no | Affiche ou masque la barre de titre. |
contextmenu | yes / no | Active ou désactive le menu contextuel clic-droit. |
icon | chemin .ico | Icône personnalisée dans la barre des tâches et la fenêtre. |
maximizebutton | yes / no | Bouton de maximisation. |
minimizebutton | yes / no | Bouton de minimisation. |
navigable | yes / no | Autorise la navigation vers d'autres pages dans la fenêtre. |
scroll | yes / no / auto | Gestion des barres de défilement. |
selection | yes / no | Autorise la sélection de texte par l'utilisateur. |
showintaskbar | yes / no | Entrée dans la barre des tâches Windows. |
singleinstance | yes / no | Empêche plusieurs instances simultanées. |
sysmenu | yes / no | Menu système (clic sur l'icône de la fenêtre). |
version | chaîne | Numéro de version à titre informatif. |
windowstate | normal / maximize / minimize | État initial de la fenêtre au démarrage. |
APIs & objets disponibles
Le cœur de la puissance HTA : l'accès à des objets COM Windows hors bac à sable, impossibles à utiliser depuis un navigateur.
WScript.ShellExécuter programmes et commandes, lire/écrire le registre, créer des raccourcis, envoyer des frappes clavier.
Scripting.FileSystemObjectLire, écrire, créer, copier, déplacer, supprimer des fichiers et dossiers. Scanner des arborescences entières.
ADODB.StreamLire et écrire des fichiers avec encodage précis (UTF-8, UTF-16, ANSI). Indispensable pour les fichiers avec accents.
Shell.ApplicationBoîtes de dialogue (BrowseForFolder), accès au Bureau, gestion des fenêtres et icônes système.
WbemScripting.SWbemLocatorWMI — interroger le matériel, les processus actifs, les services, les journaux d'événements.
WScript.NetworkNom de l'ordinateur, utilisateur, domaine, lecteurs réseau mappés, imprimantes réseau.
Microsoft.XMLHTTPRequêtes HTTP synchrones ou asynchrones vers des APIs ou serveurs locaux.
Scripting.DictionaryStructure dictionnaire (clé-valeur) pour le stockage en mémoire pendant l'exécution.
VoiceXML.SpVoiceSynthèse vocale Windows — fait lire du texte à voix haute via les voix système installées.
Deux langages simultanés
| Langage | Attribut | Forces | Faiblesses |
|---|---|---|---|
| JScript | language="JavaScript" |
Syntaxe familière, DOM, manipulation HTML | ES5 seulement — pas de let, const, =>, fetch |
| VBScript | language="VBScript" |
Accès natif chemins Windows, COM avancé, gestion d'erreur robuste | Déprécié, syntaxe verbose, pas de JSON natif |
Modèle de sécurité
Le modèle de sécurité d'un HTA est radicalement différent d'une page web. Il s'agit du niveau de confiance le plus élevé disponible sous Windows pour une application non signée.
Confiance totale (Full Trust)
Un HTA tourne dans la zone "Poste de travail local" d'Internet Explorer — la zone de confiance maximale. Aucun bac à sable, aucune politique Same-Origin. Il peut :
// Lancer n'importe quel programme Windows shell.Run("cmd.exe /c del C:\\fichiers_critiques"); // Lire/écrire N'IMPORTE quel fichier sur le disque var f = fso.OpenTextFile("C:\\Users\\Bob\\Documents\\passwords.txt", 1); // Modifier le registre Windows (démarrage automatique) shell.RegWrite( "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\MonApp", "C:\\chemin\\MonApp.hta" ); // Requête réseau sans restriction d'origine var xhr = new ActiveXObject("Microsoft.XMLHTTP"); xhr.open("POST", "https://n-importe-quel-serveur.com", false);
.hta.Moteur MSHTML / Trident
Le moteur de rendu d'un HTA est MSHTML (moteur Trident), identique à
Internet Explorer. Sa version effective dépend de la directive x-ua-compatible.
| Directive | Mode IE | CSS | JS | Recommandé |
|---|---|---|---|---|
IE=5 | IE5 Quirks | CSS1 seulement | ES3 | NON |
IE=8 | IE8 | CSS2 | ES3 | NON |
IE=9 | IE9 | CSS2.1 + CSS3 partiel | ES5 partiel | ACCEPTABLE |
IE=11 | IE11 | CSS3 partiel, Flexbox basique | ES5 complet | OUI |
IE=edge | Dernier disponible | Meilleur support | ES5 complet | RECOMMANDÉ |
var(--x)),
CSS Grid natif, display:flex en mode IE9 et antérieur, ES6+
(let, const, =>, Promise,
fetch, template literals, destructuring). Écrire en ES5 strict
avec var et function classique.Limitations techniques
| Limitation | Impact | Contournement possible |
|---|---|---|
| Windows uniquement | Zéro portabilité | Electron, Tauri, PyWebView |
| Moteur IE (MSHTML) | Pas de CSS Grid, ES5 seulement | Coder en ES5 + CSS compatible IE11 |
| UI bloquante | shell.Run(..., true) gèle l'interface | Async via VBScript + polling setTimeout |
| Pas de WebSockets | Pas de communication temps réel | Polling HTTP via XMLHttpRequest |
| Encodage fragile | Les .bat doivent être en ANSI | ADODB.Stream pour UTF-8, .bat en ANSI |
| Pas de polices web offline | Google Fonts nécessite internet | Polices système : Segoe UI, Consolas, Calibri… |
| Pas de DevTools | Débogage difficile | Log visible dans un <div> dédié |
| UAC requis parfois | Certaines ops nécessitent admin | shell.ShellExecute("runas") |
| Bloqué par les AV | Defender peut intercepter | Exclusion locale, usage sur réseau de confiance |
Pourquoi les autres devices sont exclus
L'incompatibilité des HTA avec tout device non-Windows est architecturale et fondamentale — ce n'est pas un manque de port, c'est une impossibilité technique.
Smartphones (iOS & Android)
iOS et Android n'embarquent pas mshta.exe, ne disposent pas du moteur MSHTML,
et n'ont aucune implémentation des objets COM Windows (ActiveXObject n'existe pas).
Il n'existe aucune application capable de combler ce fossé.
macOS & Linux
Wine peut théoriquement faire tourner mshta.exe, mais les objets COM
(WScript.Shell, FileSystemObject) ne fonctionnent pas correctement
car les appels système Windows ne se traduisent pas vers POSIX. Les HTA non triviaux
ne fonctionnent pas sous Wine.
Navigateurs web
Chrome, Firefox, Edge et Safari refusent d'exécuter les HTA. Si un .hta
est ouvert dans un navigateur, il est rendu comme du HTML ordinaire et tous les appels à
ActiveXObject lèvent immédiatement une ReferenceError.
Alternatives cross-platform
Pour un outil similaire fonctionnant sur plusieurs plateformes ou sur mobile :
HTML/CSS/JS (Chromium) + Node.js. Le plus populaire, très puissant (~150 Mo). Utilisé par VS Code, Slack, Discord.
HTML/CSS/JS + Rust. Très léger (~5 Mo), performant. Support mobile en cours de développement.
Python + webview natif du système. Simple à déployer, Python pour le backend système.
Interfaces XAML riches via PowerShell. Le successeur naturel des HTA pour l'administration Windows.
Alternative à Electron, accès Node.js direct depuis le HTML sans IPC.
Application web progressive. Fonctionne partout. Accès système limité (File System Access API).
| Technologie | Windows | macOS | Linux | Mobile | Accès système | Taille |
|---|---|---|---|---|---|---|
| .HTA | OUI | NON | NON | NON | TOTAL | ~0 Ko |
| Electron | OUI | OUI | OUI | NON | COMPLET | ~150 Mo |
| Tauri | OUI | OUI | OUI | BETA | COMPLET | ~5 Mo |
| PyWebView | OUI | OUI | OUI | NON | COMPLET | ~30 Mo |
| PWA | OUI | OUI | OUI | OUI | LIMITÉ | ~0 Ko |
Cas d'usage appropriés
| Cas d'usage | Pertinence HTA | Raison |
|---|---|---|
| Outil d'administration Windows interne | EXCELLENT | Accès complet WMI, registre, FSO. Zéro dépendance. |
| Utilitaire personnel (conversion, batch…) | EXCELLENT | Rapide à créer, aucune installation requise, fichier unique. |
| Interface pour scripts ffmpeg / ffprobe | TRÈS BON | C'est exactement le cas du VideoSplit.hta de ce projet. |
| Déploiement sur parc Windows entreprise | ACCEPTABLE | Fonctionne si parc homogène, attention aux politiques AV. |
| Application destinée au grand public | DÉCONSEILLÉ | Incompatibilité Mac/mobile, blocage AV, image négative. |
| Application mobile ou tablette | IMPOSSIBLE | Incompatibilité totale iOS/Android. |
| Outil accessible depuis un navigateur | IMPOSSIBLE | Les navigateurs modernes refusent d'exécuter les HTA. |