Pour résumer toutes les recherches et améliorer Andrew Richards j'ai pu me débarrasser des sous-menus ennuyeux en utilisant un seul et même menu. runas
pour l'invite de commande traditionnelle et la mise en œuvre d'une entrée élevée pour PowerShell à l'aide de Start-Process
de l'instance non élevée appelée par cmd.exe
:
[HKEY_CLASSES_ROOT\Directory\Background\shell\ps_uac_usr\command]
@="cmd /C powershell \"start powershell -a '-noexit -command Set-Location ''%V''' -v RunAs\""
-
v
Le drapeau indique Verbe réglé sur RunAs
déclenche l'élévation via l'invite UAC ;
-
a
signifie ArgumentList
qui passe noexit
option qui empêche la fermeture de la nouvelle fenêtre PS au démarrage et Set-Location
est explicite ;
-
%V
transmet le chemin initial pour la nouvelle invite de commande (lorsque le(s) fichier(s)/dossier(s) est(sont) sélectionné(s), il transmet l'emplacement de l'élément sur lequel le clic droit a été effectué, si rien n'est sélectionné, il est égal au répertoire de travail) ;
-
note, \
l'échappement des guillemets doubles dicté par la syntaxe du fichier reg en tant que ligne doit être considéré comme @="<command>"
donde <command>
est ce qui se retrouve réellement dans les données de valeur de clé ;
-
et la partie la plus critique est utilisation correcte de '
Il est nécessaire de spécifier que la première instance de PowerShell ne doit pas du tout analyser le contenu des citations et transmettre les arguments de manière littérale tout en préservant l'ensemble des éléments suivants '
pour que PowerShell final soit capable d'ignorer tout rogue &
( %V
La variable est développée par explorer.exe
avant toute exécution, donc nous n'avons pas à nous en soucier).
Rien de nouveau, mais c'est logique puisque cette implémentation préserve la compatibilité ascendante. Legacy cmd
démarrera même si l'exécutable PowerShell n'existe pas.
Combinaison de runas
clé de registre placée directement dans shell
est ce qui accorde les permissions. Et puisqu'il ne peut y avoir qu'une seule clé de ce type dans un système unique shell
d'où la limitation qui a forcé Andrew à utiliser non seulement des sous-menus, mais à les rendre distincts pour CMD/PS au lieu d'un seul sous-menu.
En utilisant une racine unique runas
clé pour l'élévation cmd.exe
explicitement et en créant d'autres entrées avec PowerShell, il est possible d'éviter les sous-menus ennuyeux.
Donc, ma coutume .reg
ressemble à ceci :
Windows Registry Editor Version 5.00
; CMD
[HKEY_CLASSES_ROOT\Directory\Background\shell\q_cmd_usr]
@="@shell32.dll,-8506"
"Extended"=""
"Icon"="cmd.exe"
[HKEY_CLASSES_ROOT\Directory\Background\shell\q_cmd_usr\command]
@="cmd.exe /s /k pushd \"%V\""
[HKEY_CLASSES_ROOT\Directory\shell\q_cmd_usr]
@="@shell32.dll,-8506"
"Extended"=""
"Icon"="cmd.exe"
[HKEY_CLASSES_ROOT\Directory\shell\q_cmd_usr\command]
@="cmd.exe /s /k pushd \"%V\""
[HKEY_CLASSES_ROOT\Drive\shell\q_cmd_usr]
@="@shell32.dll,-8506"
"Extended"=""
"Icon"="cmd.exe"
[HKEY_CLASSES_ROOT\Drive\shell\q_cmd_usr\command]
@="cmd.exe /s /k pushd \"%V\""
; CMD (Elevated)
[HKEY_CLASSES_ROOT\Directory\Background\shell\runas]
@="@shell32.dll,-8506"
;"Extended"=""
"Icon"="cmd.exe"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Directory\Background\shell\runas\command]
@="cmd.exe /s /k pushd \"%V\""
[HKEY_CLASSES_ROOT\Directory\shell\runas]
@="@shell32.dll,-8506"
"Extended"=""
"Icon"="cmd.exe"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Directory\shell\runas\command]
@="cmd.exe /s /k pushd \"%V\""
[HKEY_CLASSES_ROOT\Drive\shell\runas]
@="@shell32.dll,-8506"
"Extended"=""
"Icon"="cmd.exe"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Drive\shell\runas\command]
@="cmd.exe /s /k pushd \"%V\""
; PS (Elevated)
[HKEY_CLASSES_ROOT\Directory\Background\shell\ps_uac_usr]
@="@shell32.dll,-8508"
"Extended"=""
"Icon"="powershell.exe"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Directory\Background\shell\ps_uac_usr\command]
@="cmd /C powershell \"start powershell -a '-noexit -command Set-Location ''%V''' -v RunAs\""
[HKEY_CLASSES_ROOT\Directory\shell\ps_uac_usr]
@="@shell32.dll,-8508"
"Extended"=""
"Icon"="powershell.exe"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Directory\shell\ps_uac_usr\command]
@="cmd /C powershell \"start powershell -a '-noexit -command Set-Location ''%V''' -v RunAs\""
[HKEY_CLASSES_ROOT\Drive\shell\ps_uac_usr]
@="@shell32.dll,-8508"
"Extended"=""
"Icon"="powershell.exe"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Drive\shell\ps_uac_usr\command]
@="cmd /C powershell \"start powershell -a '-noexit -command Set-Location ''%V''' -v RunAs\""
Si possible, pour éviter de modifier le comportement des entrées existantes, il est beaucoup moins désordonné de créer simplement ses propres entrées au lieu de prendre possession des entrées du système dans le registre. Cela devrait expliquer pourquoi j'ai réutilisé l'entrée par défaut qui n'a pas d'icône et pourquoi la seule différence entre les entrées d'invite élevées est une petite icône de bouclier. Au lieu de câbler les légendes de texte à une langue spécifique, des lignes comme @="@shell32.dll,-8506"
permettent aux entrées de rester localisées.
Utilisation de ;
de commenter/ Décommenter "Extended"=""
ligne permettre de dégager/ cacher respectivement le menu de clic droit par défaut de ce formulaire d'entrée. Le menu caché est toujours accessible par Shift + Right Click
. Dans mon fichier de registre, l'entrée pour l'élévation de cmd est affichée par défaut, le reste est caché derrière Shift+RMB.
Directory\shell
Le chemin d'accès correspond à un clic droit sur n'importe quel dossier,
Drive\shell
aux lecteurs du système,
Directory\Background\shell
à la zone d'arrière-plan du répertoire de travail dans la fenêtre de l'explorateur.
D'après mes observations, les entrées du menu contextuel du clic droit sont triées par ordre alphanumérique, comme elles sont lues dans le registre. Cela devrait expliquer les noms des clés dans mon fichier reg, à part qu'ils ont intérêt à être assez uniques pour ne pas entrer en collision avec quoi que ce soit.