COM, DCOM et le Shell¶
Ce que vous allez apprendre¶
- Ce qu'est COM et pourquoi le registre en est le pilier central
- La structure de
HKCR\CLSID\{GUID}et le role de chaque sous-cle - Les ProgID, TypeLib et les modeles de threading
- La configuration DCOM : AppID, permissions,
dcomcnfg.exe - Les extensions Shell en profondeur : menus contextuels, apercu, miniatures, etc.
- Les associations de fichiers dans HKCR :
.ext, ProgID,OpenWithProgids,UserChoice - Les extensions d'espace de noms (dossiers virtuels)
- Comment creer des entrees de menu contextuel personnalisees
- L'enregistrement et le desenregistrement d'objets COM
- Le depannage des erreurs COM, DCOM et des extensions Shell cassees
COM en 30 secondes¶
COM (Component Object Model) est le systeme qui permet a des logiciels de partager du code sans se connaitre.
Quand vous faites un clic droit sur un fichier .zip et voyez "Extraire tout...", c'est une extension Shell COM. Quand Excel expose ses objets a un script VBA, c'est COM. Quand DCOM permet d'administrer un serveur a distance, c'est COM sur le reseau.
Et tout repose sur le registre.
Analogie
COM est comme les Pages Jaunes : un logiciel cherche un service par son identifiant (GUID), le registre lui dit ou trouver le fichier DLL qui le fournit, et Windows charge cette DLL a la volee. Sans le registre, personne ne trouverait personne.
En resume
- COM permet a des logiciels de partager du code via des composants identifies par des GUID dans le registre
- Le registre sert de repertoire central : il associe chaque identifiant COM au fichier DLL ou EXE qui le fournit
- Menus contextuels, automatisation Office et administration a distance (DCOM) reposent tous sur COM
CLSID : le coeur de COM¶
Chaque objet COM est identifie par un CLSID (Class Identifier) — un GUID unique au monde.
Exemple concret : Windows Script Host¶
Get-ItemProperty "HKLM:\SOFTWARE\Classes\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8}\InprocServer32"
HKCR vs HKLM\SOFTWARE\Classes
HKEY_CLASSES_ROOT (HKCR) est une vue fusionnee de HKLM\SOFTWARE\Classes (configuration machine) et HKCU\SOFTWARE\Classes (configuration utilisateur). Les cles HKCU ont priorite. En pratique, pour lire c'est equivalent ; pour ecrire, visez directement HKLM ou HKCU.
Structure complete d'un CLSID¶
graph TD
CLSID["HKCR\CLSID\{GUID}"]
CLSID --> DEF["(Default) = Nom lisible"]
CLSID --> IPS["InprocServer32<br/><small>DLL chargee dans le processus appelant</small>"]
CLSID --> LS["LocalServer32<br/><small>EXE lance separement</small>"]
CLSID --> PID["ProgID<br/><small>Nom lisible programme</small>"]
CLSID --> VPID["VersionIndependentProgID"]
CLSID --> TL["TypeLib<br/><small>Bibliotheque de types</small>"]
CLSID --> PRG["Programmable<br/><small>Utilisable en script</small>"]
CLSID --> TREAT["TreatAs<br/><small>Redirection vers un autre CLSID</small>"]
CLSID --> APPID["AppID<br/><small>Configuration DCOM</small>"]
IPS --> TM["ThreadingModel<br/><small>Apartment, Free, Both, Neutral</small>"] | Sous-cle / Valeur | Description |
|---|---|
(Default) | Nom affichable de l'objet COM |
InprocServer32 | Chemin vers la DLL (chargee dans le processus appelant) |
LocalServer32 | Chemin vers l'EXE (lance comme processus separe) |
InprocHandler32 | DLL handler (cas intermediaire) |
ProgID | Identifiant texte avec version (Word.Document.8) |
VersionIndependentProgID | Identifiant texte sans version (Word.Document) |
TypeLib | GUID de la bibliotheque de types |
Programmable | Cle vide — indique que l'objet est scriptable |
TreatAs | Redirige l'activation vers un autre CLSID |
AppID | Lie a la configuration DCOM |
En resume
- Chaque objet COM est identifie par un CLSID (GUID unique) enregistre sous
HKCR\CLSID\{GUID} - Les sous-cles principales sont
InprocServer32(DLL),LocalServer32(EXE),ProgIDetTypeLib HKCRest une vue fusionnee deHKLM\SOFTWARE\ClassesetHKCU\SOFTWARE\Classes(HKCU prioritaire)
InprocServer32 vs LocalServer32¶
| Propriete | InprocServer32 | LocalServer32 |
|---|---|---|
| Type de fichier | DLL (.dll, .ocx) | EXE (.exe) |
| Espace d'execution | Dans le processus appelant | Processus separe |
| Performance | Rapide (pas de marshalling) | Plus lent (communication inter-processus) |
| Isolation | Aucune (crash = crash de l'appelant) | Bonne (crash isole) |
| Exemple | Extensions Shell | Excel Automation |
# InprocServer32 example: Shell extension DLL
Get-ItemProperty "HKLM:\SOFTWARE\Classes\CLSID\{1894C7AB-E9B2-4FF2-8B6E-42EBD680F7E4}\InprocServer32" -ErrorAction SilentlyContinue |
Select-Object "(default)", ThreadingModel
(default) ThreadingModel
--------- --------------
C:\Windows\System32\explorerframe.dll Apartment
En resume
InprocServer32charge une DLL dans le processus appelant (rapide, pas d'isolation)LocalServer32lance un EXE separe (plus lent, mais isole en cas de crash)- Le choix entre les deux determine le compromis performance / stabilite
ProgID et VersionIndependentProgID¶
Un ProgID est un alias textuel lisible pour un CLSID.
| ProgID | CLSID |
|---|---|
Excel.Application | {00024500-0000-0000-C000-000000000046} |
Word.Document | {000209FF-0000-0000-C000-000000000046} |
Scripting.FileSystemObject | {0D43FE01-F093-11CF-8940-00A0C9054228} |
WScript.Shell | {72C24DD5-D70A-438B-8A42-98424B88AFB8} |
La resolution fonctionne dans les deux sens :
graph LR
P["HKCR\Excel.Application"]
P -->|"CLSID = {GUID}"| C["HKCR\CLSID\{GUID}"]
C -->|"ProgID = Excel.Application"| P # Resolve ProgID to CLSID
(Get-ItemProperty "HKLM:\SOFTWARE\Classes\WScript.Shell\CLSID").'(default)'
# Resolve CLSID to ProgID
(Get-ItemProperty "HKLM:\SOFTWARE\Classes\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8}\ProgID").'(default)'
Versions de ProgID¶
| Cle | Exemple | Usage |
|---|---|---|
ProgID | WScript.Shell.1 | Version specifique |
VersionIndependentProgID | WScript.Shell | Toujours la derniere version |
Le VersionIndependentProgID a son propre CLSID sous HKCR, et une sous-cle CurVer pointe vers le ProgID versionne actuel.
En resume
- Un ProgID est un alias textuel lisible (ex :
Excel.Application) qui pointe vers un CLSID - La resolution fonctionne dans les deux sens : ProgID vers CLSID et CLSID vers ProgID
- Le
VersionIndependentProgIDpointe toujours vers la derniere version via la sous-cleCurVer
Modeles de threading (ThreadingModel)¶
COM supporte plusieurs modeles de threading pour gerer la concurrence.
| Valeur | Modele | Description |
|---|---|---|
Apartment | STA (Single-Threaded Apartment) | L'objet ne peut etre appele que depuis un seul thread |
Free | MTA (Multi-Threaded Apartment) | L'objet peut etre appele depuis n'importe quel thread |
Both | STA ou MTA | S'adapte au contexte de l'appelant |
Neutral | NTA (Neutral Apartment) | Pas de marshalling, le thread appelant execute directement |
| (absent) | STA (main thread only) | Seul le thread principal peut acceder a l'objet |
Analogie
- Apartment = un bureau individuel avec une seule porte. Tout le monde fait la queue.
- Free = un open space. Tout le monde entre quand il veut (mais gare aux collisions).
- Both = flexible — s'installe dans le bureau ou l'open space selon le besoin.
- Neutral = un comptoir d'accueil — le visiteur est servi la ou il se trouve.
# Check threading model of a COM object
(Get-ItemProperty "HKLM:\SOFTWARE\Classes\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}\InprocServer32").ThreadingModel
En resume
ThreadingModeldetermine comment COM gere la concurrence :Apartment(mono-thread),Free(multi-thread),BothouNeutral- Si
ThreadingModelest absent, l'objet n'est accessible que depuis le thread principal - Un mauvais modele de threading provoque des blocages ou des plantages dans les applications multi-thread
TypeLib (bibliotheques de types)¶
Une TypeLib decrit les interfaces, methodes et proprietes d'un objet COM. C'est le "mode d'emploi" que les outils de developpement utilisent pour l'autocompletion.
# Locate the TypeLib for Scripting runtime
Get-ChildItem "HKLM:\SOFTWARE\Classes\TypeLib\{420B2830-E718-11CF-893D-00A0C9054228}" |
Get-ChildItem | ForEach-Object {
[PSCustomObject]@{
Version = $_.PSParentPath -replace '.*\\'
Platform = $_.PSChildName
Path = (Get-ItemProperty $_.PSPath).'(default)'
}
}
Version Platform Path
------- -------- ----
1.0 win32 C:\Windows\SysWOW64\scrrun.dll
1.0 win64 C:\Windows\System32\scrrun.dll
En resume
- Une TypeLib decrit les interfaces, methodes et proprietes d'un objet COM
- Elle est enregistree sous
HKCR\TypeLib\{GUID}\{version}avec des chemins distincts pour win32 et win64 - Les outils de developpement utilisent les TypeLib pour l'autocompletion et la validation de types
COM Categories¶
Les categories COM regroupent des objets par fonctionnalite. Elles sont sous :
| GUID de categorie | Description |
|---|---|
{40FC6ED4-2438-11CF-A3DB-080036F12502} | Controles qui supportent l'edition visuelle |
{40FC6ED5-2438-11CF-A3DB-080036F12502} | Controles avec donnees persistantes |
{7DD95801-9882-11CF-9FA9-00AA006C42C4} | Controles securises pour le scripting |
Un objet COM declare ses categories via :
En resume
- Les categories COM regroupent les objets par fonctionnalite sous
HKCR\Component Categories\{GUID} - Un objet declare ses categories via la sous-cle
Implemented Categories - Elles servent a filtrer les controles par capacite (edition visuelle, securite scripting, etc.)
DCOM : COM sur le reseau¶
DCOM (Distributed COM) permet d'activer des objets COM sur une machine distante.
Configuration AppID¶
Chaque application DCOM est identifiee par un AppID :
| Valeur | Type | Description |
|---|---|---|
(Default) | REG_SZ | Nom de l'application |
RunAs | REG_SZ | Compte d'execution (Interactive User, un compte specifique) |
LaunchPermission | REG_BINARY | ACL binaire — qui peut lancer l'objet |
AccessPermission | REG_BINARY | ACL binaire — qui peut acceder a l'objet |
AuthenticationLevel | REG_DWORD | Niveau d'authentification requis |
DllSurrogate | REG_SZ | Chemin vers un processus hote pour les DLL |
RemoteServerName | REG_SZ | Nom du serveur distant (pour les clients) |
# List AppIDs with their names
Get-ChildItem "HKLM:\SOFTWARE\Classes\AppID" |
Where-Object { $_.PSChildName -match '^\{' } |
ForEach-Object {
$props = Get-ItemProperty $_.PSPath
if ($props.'(default)') {
[PSCustomObject]@{
AppID = $_.PSChildName
Name = $props.'(default)'
RunAs = $props.RunAs
}
}
} | Select-Object -First 10 | Format-Table -AutoSize
AppID Name RunAs
----- ---- -----
{000C101C-0000-0000-C000-000000000046} Microsoft Office Interactive User
{00020906-0000-0000-C000-000000000046} Microsoft Word Document
{4839DDB7-58C2-48F5-8283-E1D1807D0D7D} DfsShellExtension
dcomcnfg.exe : l'interface graphique DCOM¶
dcomcnfg.exe (Component Services) est l'interface graphique pour configurer DCOM.
Tout ce qu'il modifie se trouve dans le registre :
| Onglet dcomcnfg | Cle de registre |
|---|---|
| Proprietes par defaut | HKLM\SOFTWARE\Microsoft\Ole |
| Securite par defaut | HKLM\SOFTWARE\Microsoft\Ole\DefaultLaunchPermission |
| Protocoles | HKLM\SOFTWARE\Microsoft\Rpc |
| Application specifique | HKCR\AppID\{GUID} |
# Check default DCOM settings
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Ole" |
Select-Object EnableDCOM, LegacyAuthenticationLevel, LegacyImpersonationLevel
| Valeur | Signification |
|---|---|
EnableDCOM = Y | DCOM est active |
AuthenticationLevel = 2 | Connect (authentification a la connexion) |
ImpersonationLevel = 3 | Impersonate (le serveur peut agir au nom du client) |
Securite DCOM
DCOM est une surface d'attaque connue. Les permissions par defaut sont souvent trop permissives. Verifiez les LaunchPermission et AccessPermission de chaque AppID expose au reseau.
En resume
- DCOM etend COM au reseau via les AppID sous
HKCR\AppID\{GUID} - Chaque AppID definit le compte d'execution (
RunAs), les permissions de lancement et d'acces dcomcnfg.exeest l'interface graphique ; toute modification se retrouve dans le registre sousHKLM\SOFTWARE\Microsoft\Ole
Extensions Shell : le registre controle votre clic droit¶
Les extensions Shell sont des objets COM qui s'integrent dans l'Explorateur Windows. Elles sont enregistrees sous les CLSID des types de fichiers.
Types d'extensions Shell¶
| Extension | Sous-cle registre | Description |
|---|---|---|
| Context Menu Handler | shellex\ContextMenuHandlers | Entrees du menu contextuel |
| Property Sheet Handler | shellex\PropertySheetHandlers | Onglets dans les proprietes |
| Icon Overlay Handler | HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers | Icones superposees (ex : OneDrive, Git) |
| Drag-and-Drop Handler | shellex\DragDropHandlers | Actions de glisser-deposer |
| Copy Hook Handler | HKCR\Directory\shellex\CopyHookHandlers | Interception de copie/deplacement de dossiers |
| Preview Handler | shellex\{8895b1c6-b41f-4c1c-a562-0d564250836f} | Volet d'apercu |
| Thumbnail Handler | shellex\{e357fccd-a995-4576-b01f-234630154e96} | Miniatures dans l'Explorateur |
| Infotip Handler | shellex\{00021500-0000-0000-C000-000000000046} | Info-bulle au survol |
Context Menu Handlers¶
Les gestionnaires de menu contextuel ajoutent des entrees au clic droit.
# List context menu handlers for all files
Get-ChildItem "HKLM:\SOFTWARE\Classes\*\shellex\ContextMenuHandlers" -ErrorAction SilentlyContinue |
ForEach-Object {
[PSCustomObject]@{
Handler = $_.PSChildName
CLSID = (Get-ItemProperty $_.PSPath).'(default)'
}
} | Select-Object -First 10 | Format-Table -AutoSize
Handler CLSID
------- -----
7-Zip {23170F69-40C1-278A-1000-000100020000}
ModernSharing {E2BF9676-5F8F-435C-97EB-11607A5BEDF7}
OpenWithEncryptionMenu {A470F8CF-A1E8-4f65-8335-227475AA5C46}
Icon Overlay Handlers¶
Les icones superposees (la coche verte de OneDrive, le cadenas de Git) sont des extensions Shell.
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers" |
ForEach-Object {
[PSCustomObject]@{
Name = $_.PSChildName.Trim()
CLSID = (Get-ItemProperty $_.PSPath).'(default)'
}
} | Format-Table -AutoSize
Name CLSID
---- -----
OneDrive1 {BBACC218-34EA-4666-9D7A-C78F2274A524}
OneDrive2 {5AB7172C-9C11-405C-8DD5-AF20F3606282}
OneDrive3 {A78ED123-AB77-406B-9962-2A5D9D2F7F30}
Tortoise1Normal {C5994560-53D9-4125-87C9-F193FC689CB2}
Tortoise2Modified {C5994561-53D9-4125-87C9-F193FC689CB2}
Limite de 15 overlays
Windows ne prend en charge que 15 icones overlay maximum. Les entrees sont triees par ordre alphabetique, d'ou les espaces au debut des noms (pour apparaitre en premier). Si vous avez plus de 15 overlays, les derniers sont ignores.
Preview Handlers (volet d'apercu)¶
# Find which handler provides preview for .pdf files
$progId = (Get-ItemProperty "HKLM:\SOFTWARE\Classes\.pdf" -ErrorAction SilentlyContinue).'(default)'
if ($progId) {
$previewGuid = "{8895b1c6-b41f-4c1c-a562-0d564250836f}"
Get-ItemProperty "HKLM:\SOFTWARE\Classes\$progId\shellex\$previewGuid" -ErrorAction SilentlyContinue |
Select-Object '(default)'
}
Thumbnail Handlers (miniatures)¶
# Find thumbnail handler for .jpg
$thumbGuid = "{e357fccd-a995-4576-b01f-234630154e96}"
Get-ItemProperty "HKLM:\SOFTWARE\Classes\.jpg\shellex\$thumbGuid" -ErrorAction SilentlyContinue |
Select-Object '(default)'
En resume
- Les extensions Shell sont des objets COM integres a l'Explorateur via des sous-cles
shellex - Les types principaux : menus contextuels, icones overlay, apercu, miniatures, glisser-deposer
- Windows limite a 15 icones overlay ; l'ordre alphabetique determine la priorite
Associations de fichiers dans HKCR¶
Architecture en deux niveaux¶
Le systeme d'association de fichiers utilise deux niveaux d'indirection :
graph LR
EXT[".txt<br/><small>Extension</small>"]
PID["txtfile<br/><small>ProgID</small>"]
CMD["shell\open\command<br/><small>Commande d'ouverture</small>"]
EXT -->|"(Default) = txtfile"| PID
PID --> CMD
CMD -->|"notepad.exe %1"| APP["Bloc-notes"] Niveau 1 : l'extension¶
| Valeur | Description |
|---|---|
(Default) | ProgID associe |
Content Type | Type MIME |
PerceivedType | Type percu : text, image, audio, video, compressed, document, system |
OpenWithProgids | Sous-cle listant les ProgID alternatifs |
Niveau 2 : le ProgID¶
Get-ItemProperty "HKLM:\SOFTWARE\Classes\txtfile"
Get-ItemProperty "HKLM:\SOFTWARE\Classes\txtfile\shell\open\command"
# txtfile
(default) : Text Document
FriendlyTypeName : @%SystemRoot%\system32\notepad.exe,-469
# txtfile\shell\open\command
(default) : %SystemRoot%\system32\notepad.exe %1
OpenWithProgids : alternatives d'ouverture¶
UserChoice : le choix de l'utilisateur¶
L'utilisateur peut surcharger l'association par defaut. Ce choix est stocke dans HKCU :
Get-ItemProperty "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.txt\UserChoice"
UserChoice est protege par un hash
La valeur Hash est calculee par Windows pour empecher les applications de modifier les associations en douce. Si vous modifiez ProgId sans mettre a jour le Hash, Windows ignorera votre modification. Utilisez plutot les API officielles ou les Parametres Windows.
OpenWithList : applications recemment utilisees¶
Contient les applications que l'utilisateur a utilisees pour ouvrir ce type de fichier, dans l'ordre de MRUList.
En resume
- L'association de fichiers suit deux niveaux : l'extension (
.txt) pointe vers un ProgID (txtfile), qui definit la commande d'ouverture UserChoicedans HKCU permet a l'utilisateur de surcharger l'association par defaut, protegee par un hashOpenWithProgidsetOpenWithListgerent les alternatives et l'historique des applications utilisees
Extensions d'espace de noms (dossiers virtuels)¶
Les dossiers speciaux comme "Ce PC", "Corbeille" ou "Reseau" sont des extensions d'espace de noms Shell enregistrees comme des CLSID.
| Dossier virtuel | CLSID |
|---|---|
| Ce PC (My Computer) | {20D04FE0-3AEA-1069-A2D8-08002B30309D} |
| Corbeille (Recycle Bin) | {645FF040-5081-101B-9F08-00AA002F954E} |
| Panneau de configuration | {21EC2020-3AEA-1069-A2DD-08002B30309D} |
| Reseau | {F02C1A0D-BE21-4350-88B0-7367FC96EF3C} |
| Bureau | {00021400-0000-0000-C000-000000000046} |
La fenetre "Ce PC" s'ouvre dans l'Explorateur Windows.
Aucune sortie dans la console.
Masquer un dossier virtuel du Bureau¶
# Hide "This PC" from desktop
$path = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel"
New-ItemProperty -Path $path -Name "{20D04FE0-3AEA-1069-A2D8-08002B30309D}" -Value 1 -PropertyType DWord -Force
{20D04FE0-3AEA-1069-A2D8-08002B30309D} : 1
PSPath : ...HideDesktopIcons\NewStartPanel
En resume
- Les dossiers virtuels (Ce PC, Corbeille, Reseau) sont des extensions d'espace de noms identifiees par un CLSID
- On peut les ouvrir directement via
explorer shell:::{CLSID} - On peut masquer un dossier virtuel du Bureau via une valeur DWORD dans
HideDesktopIcons\NewStartPanel
Creer des entrees de menu contextuel personnalisees¶
Methode 1 : menu contextuel simple (sans DLL)¶
Ajouter "Ouvrir avec Notepad++" au clic droit sur tous les fichiers :
:: Create the verb under * (all files)
reg add "HKCR\*\shell\OpenWithNpp" /ve /d "Edit with Notepad++" /f
reg add "HKCR\*\shell\OpenWithNpp" /v "Icon" /d "C:\Program Files\Notepad++\notepad++.exe,0" /f
reg add "HKCR\*\shell\OpenWithNpp\command" /ve /d "\"C:\Program Files\Notepad++\notepad++.exe\" \"%%1\"" /f
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
Structure creee dans le registre :
HKCR\*\shell\OpenWithNpp
(Default) = "Edit with Notepad++"
Icon = "C:\Program Files\Notepad++\notepad++.exe,0"
\command
(Default) = "C:\Program Files\Notepad++\notepad++.exe" "%1"
Methode 2 : menu contextuel pour les dossiers¶
reg add "HKCR\Directory\shell\OpenTerminal" /ve /d "Open Terminal Here" /f
reg add "HKCR\Directory\shell\OpenTerminal" /v "Icon" /d "wt.exe,0" /f
reg add "HKCR\Directory\shell\OpenTerminal\command" /ve /d "wt.exe -d \"%%V\"" /f
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
Methode 3 : menu contextuel avec sous-menu (cascading)¶
:: Create a cascading menu group
reg add "HKCR\Directory\Background\shell\MyTools" /ve /d "My Tools" /f
reg add "HKCR\Directory\Background\shell\MyTools" /v "MUIVerb" /d "My Tools" /f
reg add "HKCR\Directory\Background\shell\MyTools" /v "SubCommands" /d "MyTools.cmd;MyTools.ps1" /f
reg add "HKCR\Directory\Background\shell\MyTools" /v "Icon" /d "shell32.dll,294" /f
:: Define sub-commands
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MyTools.cmd" /ve /d "Open CMD" /f
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MyTools.cmd\command" /ve /d "cmd.exe /k cd /d \"%%V\"" /f
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MyTools.ps1" /ve /d "Open PowerShell" /f
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MyTools.ps1\command" /ve /d "powershell.exe -NoExit -Command \"Set-Location '%%V'\"" /f
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
Valeurs speciales pour les entrees de menu¶
| Valeur | Type | Description |
|---|---|---|
(Default) | REG_SZ | Texte affiche dans le menu |
MUIVerb | REG_SZ | Texte affiche (prioritaire sur Default) |
Icon | REG_SZ | Icone (fichier.exe,index ou fichier.ico) |
Position | REG_SZ | Top, Bottom (position dans le menu) |
Extended | (presence suffit) | N'apparait qu'avec Shift"clic droit"++ |
NeverDefault | (presence suffit) | N'est jamais l'action par defaut (double-clic) |
HasLUAShield | REG_SZ | Affiche le bouclier UAC |
SubCommands | REG_SZ | Liste des sous-commandes (menu en cascade) |
AppliesTo | REG_SZ | Filtre (ex : System.FileExtension:=.log) |
Le drapeau Extended
Ajoutez une valeur vide nommee Extended pour que l'entree n'apparaisse qu'avec Shift"clic droit"++. Utile pour les outils avances que vous ne voulez pas encombrer le menu standard.
En resume
- Un menu contextuel simple se cree sous
HKCR\*\shell\{verbe}\commandpour les fichiers, ouHKCR\Directory\shell\pour les dossiers - Les menus en cascade utilisent
SubCommandset leCommandStorede l'Explorateur - Les valeurs
Position,Extended,IconetAppliesTopermettent de controler l'apparence et la visibilite
Enregistrement et desenregistrement d'objets COM¶
regsvr32.exe : pour les DLL COM¶
:: Register a COM DLL
regsvr32 C:\path\to\mycomponent.dll
:: Unregister
regsvr32 /u C:\path\to\mycomponent.dll
:: Silent mode (no dialog)
regsvr32 /s C:\path\to\mycomponent.dll
Une boite de dialogue confirme "DllRegisterServer in ... succeeded."
En mode /s, aucune sortie si la commande reussit.
Ce que fait regsvr32
Il charge la DLL en memoire et appelle sa fonction DllRegisterServer(). Cette fonction ecrit les cles CLSID, ProgID, TypeLib, etc. dans le registre. DllUnregisterServer() les supprime.
Enregistrement manuel (sans regsvr32)¶
Parfois necessaire pour le depannage ou sur des systemes verrouilles.
:: Manually register a COM object
reg add "HKCR\CLSID\{00000000-1111-2222-3333-444444444444}" /ve /d "My COM Object" /f
reg add "HKCR\CLSID\{00000000-1111-2222-3333-444444444444}\InprocServer32" /ve /d "C:\path\to\mycom.dll" /f
reg add "HKCR\CLSID\{00000000-1111-2222-3333-444444444444}\InprocServer32" /v "ThreadingModel" /d "Both" /f
reg add "HKCR\CLSID\{00000000-1111-2222-3333-444444444444}\ProgID" /ve /d "MyApp.MyObject.1" /f
:: Register the ProgID
reg add "HKCR\MyApp.MyObject.1" /ve /d "My COM Object" /f
reg add "HKCR\MyApp.MyObject.1\CLSID" /ve /d "{00000000-1111-2222-3333-444444444444}" /f
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
Enregistrement per-utilisateur (sans privileges admin)¶
:: Register under HKCU instead of HKLM
reg add "HKCU\SOFTWARE\Classes\CLSID\{00000000-1111-2222-3333-444444444444}" /ve /d "My COM Object" /f
reg add "HKCU\SOFTWARE\Classes\CLSID\{00000000-1111-2222-3333-444444444444}\InprocServer32" /ve /d "C:\Users\User\mycom.dll" /f
reg add "HKCU\SOFTWARE\Classes\CLSID\{00000000-1111-2222-3333-444444444444}\InprocServer32" /v "ThreadingModel" /d "Both" /f
The operation completed successfully.
The operation completed successfully.
The operation completed successfully.
En resume
regsvr32enregistre une DLL COM en appelant sa fonctionDllRegisterServer()qui ecrit les cles CLSID et ProgID- L'enregistrement manuel est possible en creant directement les cles
CLSID,InprocServer32etProgID - L'enregistrement sous
HKCU\SOFTWARE\Classesne necessite pas de privileges administrateur
Depannage COM et Shell¶
Erreur DCOM 10016 dans le journal d'evenements¶
C'est l'erreur DCOM la plus courante : "The application-specific permission settings do not grant Local Activation permission."
# Find recent DCOM error events
Get-WinEvent -FilterHashtable @{LogName="System"; Id=10016} -MaxEvents 5 |
Select-Object TimeCreated, Message | Format-List
TimeCreated : 2026-04-02 09:15:33
Message : The application-specific permission settings do not grant Local
Activation permission for the COM Server application with CLSID
{2593F8B9-4EAF-457C-B68A-50F6B8EA6B54} and APPID
{15C20B67-12E7-4BB6-92BB-7AFF07997402} to the user
PC\User SID (S-1-5-21-...) from address LocalHost (Using LRPC)
running in the application container Unavailable SID (Unavailable).
Solution : ouvrir dcomcnfg.exe > Component Services > Computers > My Computer > DCOM Config, trouver l'application concernee, et modifier les permissions de lancement.
Extensions Shell cassees : l'Explorateur plante¶
graph TD
A["L'Explorateur plante<br/>au clic droit"] --> B["Demarrer en Safe Mode"]
B --> C["Lancer ShellExView<br/>(outil NirSoft)"]
C --> D["Trier par type :<br/>Context Menu Handler"]
D --> E["Desactiver les extensions<br/>tierces une par une"]
E --> F["Identifier le coupable"] Methode manuelle sans outil tiers :
# List all third-party context menu handlers
Get-ChildItem "HKLM:\SOFTWARE\Classes\*\shellex\ContextMenuHandlers" -ErrorAction SilentlyContinue |
ForEach-Object {
$clsid = (Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue).'(default)'
if ($clsid -match '^\{') {
$dllPath = (Get-ItemProperty "HKLM:\SOFTWARE\Classes\CLSID\$clsid\InprocServer32" -ErrorAction SilentlyContinue).'(default)'
if ($dllPath -and $dllPath -notmatch 'Windows|Microsoft') {
[PSCustomObject]@{
Handler = $_.PSChildName
CLSID = $clsid
DLL = $dllPath
}
}
}
} | Format-Table -AutoSize
Handler CLSID DLL
------- ----- ---
7-Zip {23170F69-40C1-278A-1000-000100020000} C:\Program Files\7-Zip\7-zip.dll
Notepad++64 {B298D29A-A6ED-11DE-BA8C-A68E55D89593} C:\Program Files\Notepad++\NppShell.dll
TortoiseGit {D0F1D173-7A4C-4B97-B602-835B9D4D6EAF} C:\Program Files\TortoiseGit\TortoiseGit.dll
Erreur "Class not registered" (0x80040154)¶
Cause : le CLSID n'existe pas dans le registre ou la DLL est absente.
# Check if a CLSID is registered
$clsid = "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
$exists = Test-Path "HKLM:\SOFTWARE\Classes\CLSID\$clsid"
if ($exists) {
$dll = (Get-ItemProperty "HKLM:\SOFTWARE\Classes\CLSID\$clsid\InprocServer32" -ErrorAction SilentlyContinue).'(default)'
$fileExists = Test-Path $dll
Write-Host "CLSID registered: True"
Write-Host "DLL path: $dll"
Write-Host "DLL file exists: $fileExists"
} else {
Write-Host "CLSID not registered"
}
CLSID registered: True
DLL path: C:\Windows\System32\shell32.dll
DLL file exists: True
Outils de diagnostic¶
| Outil | Usage |
|---|---|
| ShellExView (NirSoft) | Lister et desactiver les extensions Shell |
| OleView (SDK Windows) | Inspecter les objets COM enregistres |
| Process Monitor (Sysinternals) | Tracer les acces registre COM en temps reel |
regsvr32 /i | Tester l'enregistrement d'une DLL COM |
dcomcnfg.exe | Configurer les permissions DCOM |
En resume
COM est le ciment invisible de Windows, et le registre en est le repertoire central. Chaque objet COM (identifie par un CLSID) a sa fiche dans HKCR\CLSID, avec ses DLL, ses ProgID, ses modeles de threading. Les extensions Shell (menus contextuels, apercu, miniatures) sont des objets COM enregistres sous les types de fichiers. Les associations de fichiers suivent une chaine extension > ProgID > commande. DCOM etend COM au reseau via les AppID et les permissions. La maitrise de ces cles permet de personnaliser, diagnostiquer et reparer le comportement de l'Explorateur et des applications Windows.