Existe-t-il une commande permettant d'élever l'invite de commande sur place?


61

Sur les systèmes * nix, vous pouvez obtenir un shell root comme ceci:

$ su # or 'sudo -s'
#

La coque de racine est créée sur place dans le même terminal.

J'essaie de trouver quelque chose qui fait une élévation sur place similaire sur l'invite de commande Windows. En d'autres termes, il ne doit pas créer de nouvelle fenêtre ni afficher les invites du contrôle de compte d'utilisateur. Jusqu'à présent, j'ai pu créer une tâche planifiée qui contourne le contrôle de compte d'utilisateur, mais la fenêtre d'invite de commande élevée n'est pas générée à la place.

Existe-t-il une commande similaire pour Windows qui effectue une élévation sur place sans générer de nouvelle fenêtre?


31
notez que su / sudo -s démarre également un nouveau processus shell. Ce sont simplement les processus élevés qui sont connectés au même terminal, ils ont donc l’impression qu’il est élevé sur place.
Lie Ryan

"il ne doit pas créer de nouvelle fenêtre ni afficher les invites du contrôle de compte d'utilisateur" Dites-vous simplement que cela ne nécessite pas d'interaction graphique? Ou voulez - vous pas être invité à tous ? Par exemple, sudodemandera parfois un mot de passe, mais avec une interface texte. Je me demande un peu comment les serveurs Nano (qui, à mon avis, n'offrent même pas une interface graphique pour Remote Desktop) le gèrent.
jpmc26

2
@ jpmc26 L'interaction sur l'interface texte est correcte.
user2064000

@ jpmc26 Je me demande si le serveur Nano a même un UAC. Étant donné qu'il est optimisé pour les conteneurs, cela ne semble pas très utile. Il était également désactivé dans les versions Server Core, IIRC. Si vous l'avez activé accidentellement, vous avez toute une pile de problèmes :)
Luaan

2
@ user2064000 L'invite UAC est (du moins par défaut pour les fichiers binaires autres que Windows) lancée sur le Secure Desktop, et non sur le bureau actuel de l'utilisateur. En plus d'être légèrement ennuyeux, ceci est conçu pour empêcher d'autres processus d'interférer avec l'invite UAC. De plus, si une authentification est requise, elle devra se trouver sur Secure Desktop et certains administrateurs peuvent également exiger une séquence Ctrl-Alt-Suppr pour prouver que Windows utilise le mot de passe et non un autre processus empruntant l'identité de l'invite de mot de passe. Donc, taper un mot de passe dans la fenêtre cmd ne volerait probablement pas du point de vue de la sécurité Microsoft.
Calchas

Réponses:


65

TL; DR - La seule option est de générer un autre processus. (Une nouvelle cmd.exe.) Dans le cas d'une invite de commande, le démarrage d'une nouvelle instance avec un jeton d'accès doté d'autorisations plus élevées entraînera toujours la création d'une nouvelle fenêtre .


Il n'est pas possible d'accorder des autorisations supplémentaires à un processus déjà en cours d' exécution.

Lorsqu'un utilisateur disposant de droits d'administration se connecte à un ordinateur Windows avec le contrôle de compte d'utilisateur (UAC) activé, deux jetons d'accès distincts sont créés :

  1. Un avec un accès administrateur complet, et
  2. Un deuxième "jeton filtré" avec accès utilisateur standard

Au moment où un processus (par exemple CMD.EXE) est créé, l'un de ces deux jetons d'accès lui est attribué . Si le processus est exécuté en tant qu'administrateur "élevé", le jeton d'accès non filtré est utilisé. Si le processus ne dispose pas des droits d'administrateur, le jeton d'utilisateur standard filtré est utilisé.

Une fois qu'un processus a été créé, il n'est plus possible de remplacer son jeton d'accès . 1 Dans ce fil de discussion MSDN Application Security pour Windows Desktop , une affiche s'identifiant comme membre de l'équipe du noyau Windows indique:

Le noyau NT n'a jamais été conçu pour permettre la commutation de jetons une fois qu'un processus a commencé à s'exécuter. Cela est dû au fait que les descripteurs, etc. peuvent avoir été ouverts dans un ancien contexte de sécurité, que les opérations en vol peuvent utiliser des contextes de sécurité incohérents, etc. En tant que tel, il n’a généralement aucun sens de changer de jeton de processus une fois son exécution commencée. Cependant, cela n'a pas été appliqué jusqu'à Vista . [c'est moi qui souligne] (Source grâce à @Ben N )

Remarque: le contrôle de compte d'utilisateur a été introduit avec la publication de Windows Vista .

Cette réponse du super utilisateur cite deux sources supplémentaires confirmant la même chose:

Par conséquent, il est tout simplement impossible d'élever l'invite de commande ou tout autre processus en place. La seule option est de générer un autre processus avec un nouveau jeton d'accès (qui peut être une autre instance du processus d'origine si vous le souhaitez). Dans le cas de l'invite de commande, le démarrage d'une nouvelle instance avec un jeton d'accès doté d'autorisations plus élevées entraînera toujours la création d'une nouvelle fenêtre. Si les invites UAC sont activées sur le système, elles sont également déclenchées.


1 Vous pouvez ajuster les privilèges dans un jeton d'accès existant avec la fonction AdjustTokenPrivileges , mais selon MSDN :

La fonction AdjustTokenPrivileges ne peut pas ajouter de nouveaux privilèges au jeton d'accès. Il ne peut activer ou désactiver que les privilèges existants du jeton.


19

Bien que je sois un utilisateur enthousiaste de TCC-LE, il existe une solution qui ne nécessite aucun nouveau programme: -

  • Commencez en cmdtant qu'administrateur.
  • Cela devrait vous commencer %SystemRoot%\system32\- sinon, cdlà - bas.
  • copy cmd.exe cmdadmin.exe(ou n'importe quel nom que vous choisissez, tel que su.exe).
  • Maintenant, lancez Explorer et trouvez cmdadmin.exe.
  • Cliquez avec le bouton droit et sélectionnez Propriétés .
  • Dans l' onglet Compatibilité, sélectionnez Exécuter en tant qu'administrateur (ou définissez-le pour tous les utilisateurs).

Maintenant cmdadminest votre suou sudovous pouvez démarrer sans paramètres pour vous donner un shell avec des privilèges d' administrateur, ou vous pouvez l' exécuter avec /cpour exécuter une commande unique dans ce mode. En fonction de vos politiques, vous pouvez être invité ou non à une confirmation.

Notez que cela ouvrira toujours une nouvelle fenêtre (comme le fait la solution TCC start /elevated ...): pour une application graphique, cela est prévu, mais pour un programme en ligne de commande, vous souhaiterez peut-être utiliser à la /kplace de /c, pour vous permettre de voir le résultat. ; ou vous pouvez exécuter via un fichier de commandes ( sudo.cmdpeut-être?) qui se concatène & pauseà la fin de votre chaîne d'exécution.

Dans les deux cas, ce n'est pas tout à fait la même chose que suou sudo, mais c'est le plus proche que vous obtiendrez. En définissant manuellement la disposition des fenêtres, la nouvelle fenêtre peut être créée directement en-dessous et à côté de l’original.


C’est probablement ce qui se rapproche le plus du comportement du PO sudo, avec l’avertissement de devoir encore gérer une nouvelle fenêtre / un nouveau processus. Bien que ce ne soit probablement pas la meilleure idée du point de vue de la sécurité, la désactivation de toutes les invites du contrôle de compte d'utilisateur évite d'avoir à répondre à l'invite du contrôle de compte d'utilisateur lorsque le processus élevé est démarré.
Je dis: réintégrez Monica le

@ Twisty - Merci pour le commentaire. J'étais conscient des implications en termes de sécurité, mais elles ne sont pas pires que la prémisse initiale selon laquelle le compte autorise l' exécution en tant qu'administrateur . C’est à chacun de le mettre en œuvre de décider s’il souhaite un rappel constant chaque fois qu’il est invoqué.
AFH

2
Je ne mentionnais pas les implications en matière de sécurité pour votre bénéfice, mais plutôt pour les autres lecteurs. Cependant, je ne suis pas d'accord pour dire que la désactivation des invites UAC n'est pas pire que de fonctionner en tant qu'administrateur. Les invites UAC peuvent empêcher un utilisateur connecté en tant qu'administrateur d'accorder des droits d'administration non désirés à un processus. Sans les invites, l'utilisateur perd cette opportunité.
Je dis Réintégrer Monica

@ Twisty - Just so. Ma réponse venait de motifs similaires. Merci encore.
AFH

1
au lieu de copier le cmd.exe, créez un lien symbolique vers celui-ci. De cette façon, si Windows le met à jour et corrige des bugs de sécurité, vous n’exécutez pas une ancienne versionmklink cmdadmin.exe cmd.exe
Josef

11

Existe-t-il une commande permettant d'élever l'invite de commande sur place?

Il y a une manière assez peu pratique:

powershell -Command "Start-Process 'cmd.exe' -Verb runAs"

Il y avait de meilleures façons mais Microsoft les a fermées. Bien sûr, vous pouvez toujours vous retrousser les manches et écrire votre propre script équivalent sudoau code source que je viens de vous donner.

En d'autres termes, il ne doit pas créer de nouvelle fenêtre ni afficher les invites du contrôle de compte d'utilisateur.

Blasphème! Brûlez-le dans le bûcher! ;) Blague à part, non. Il n'y a pas. Ce serait un bug et une faille de sécurité. Microsoft a fait un effort explicite pour que les processus élevé et standard aient le moins en commun possible.

Les enfants intelligents qui envisagent deux arrière-plans (un standard et un surélevé) et une interface graphique pour les deux devraient se renseigner sur l' isolation de la session 0 .


2

Existe-t-il une commande similaire pour Windows qui effectue une élévation sur place sans générer de nouvelle fenêtre?

Aucune commande de ce type n’est intégrée. Bien que je n’aie pas prouvé cela, j’estime que, parce que j’ai vu plusieurs façons d’utiliser un logiciel / code supplémentaire pour résoudre ce problème.

En d'autres termes, il ne doit pas créer de nouvelle fenêtre ni afficher les invites du contrôle de compte d'utilisateur.

Oublie. Absolument oublie ça. Cela va à l’encontre de la conception de l’UAC. Si vous pouviez gérer cela, vous rompez un processus de sécurité fondamental. Attendez-vous à ce que votre solution soit corrigée par un correctif après que Microsoft ait eu connaissance des correctifs que vous auriez apportés, quel que soit le processus que vous pourriez effectuer pour contourner ce problème.

La solution pour éviter les invites UAC est de commencer par une altitude élevée. UAC ne devrait pas vous déranger si vous êtes suffisamment autorisé. Si vous commencez par une altitude plus basse (ce qui est souvent recommandé pour des raisons de sécurité), puis essayez de faire quelque chose exigeant une altitude plus élevée, attendez-vous à une interaction UAC.


Les invites UAC peuvent déjà être contournées avec une tâche planifiée. Je cherche quelque chose qui fait l'élévation sur place au lieu de créer une nouvelle fenêtre d'invite de commande.
user2064000

Si vous le faites, pouvez-vous réellement configurer la tâche planifiée sans satisfaire aux exigences de l'UAC? En ce qui concerne le frai, je dis que je ne m'y attendais pas, car j'ai remarqué que toutes les solutions d'élévation que j'ai vues jusqu'à présent impliquaient le lancement d'un nouveau processus. Je pense qu'il serait techniquement possible de procéder à une élévation technique sans démarrer un nouveau processus, car les programmes d'installation peuvent demander le contrôle de compte d'utilisateur après leur démarrage, mais je ne me souviens pas d'avoir vu de solutions facilement disponibles, facilement importables dans un fichier de traitement par lots.
TOOGAM

En effet; Les tâches planifiées détruisent complètement le contrôle de compte d'utilisateur. Une fois élevé, vous pouvez accéder à SYSTEM via des services, puis utiliser le jeton de remplacement sur le processus cmd.exe d'origine.
Josué

Il y a un script PowerToy quelque peu officiel qui fait le travail de base; vous pouvez taper elevate cmdpour ouvrir une nouvelle fenêtre d'invite de commande avec une invite UAC (le site propose également des commandes de menu contextuel!). Ou bien sûr, vous pouvez simplement appuyer sur Ctrl + Maj + Clic sur l'icône de la barre des tâches de n'importe quelle fenêtre d'invite de commande existante pour en faire autant - c'est ce que j'ai tendance à faire le plus souvent. (Ce que je sais, ce n'est pas ce que le PO a demandé, mais ce que le PO a demandé est bloqué par sa conception.)
Miral

2

Ce que vous voulez est impossible dans Windows, car ne supporte pas ce concept. Vous devez démarrer un nouveau processus avec des autorisations plus élevées .

J'utilise nircmd pour élever les processus de la ligne de commande. Votre commande seraitnircmdc elevate cmd


2

J'ai vu cette question et proposé une solution simple. Il s’agit d’un petit utilitaire appelé rsudoqui exécute des commandes en mode escalade à partir d’une fenêtre CMD normale.

Remarque: Une invite UAC va venir. Cacher cela n'est pas possible, c'est juste la façon dont le CCU a été conçu.

Usage:
  rsudo.exe "[command]"

Télécharger [Le téléchargement ne fonctionne pas, sera mis à jour bientôt]

Remarque: les commandes sont exécutées dans une nouvelle fenêtre. Si vous voulez voir le résultat, lancezrsudo.exe "pause && [command]"


Ça ne doit pas être ça rsudo.exe "[command] && pause"?

@fleet Non, un bug fait que pausenous courons d'abord
rahuldottech

Rahul, merci! Toute chance de code source? ;) (Ou peut-être que je cherchais juste au mauvais endroit sur votre site.)
cxw

@cwz bien sur! Je l'
éditerai

0

Celui-ci est bizarre.

Vous pouvez essayer de créer un ssh sur votre propre ordinateur, qui utiliserait le même terminal existant, mais serait en réalité tout à fait différent.

Cela fonctionnera, mais ce n'est probablement pas ce que vous voulez.

D'autres peuvent le trouver utile cependant.


-1

Essayez l’ invite de commande TCC / LE de la commande JPSOFT Take . Il est disponible en versions 32 et 64 bits et est gratuit, sauf si vous souhaitez davantage de fonctionnalités.

Allez sur https://jpsoft.com/ et cliquez sur Téléchargements et sélectionnez ce que vous voulez.

TCC / LE a un START / ELEVATED, qui démarre le programme avec des privilèges d’administrateur complets. (Windows Vista ou version ultérieure uniquement.)


1
Comment est-ce lié à la question?
user2064000

@ DavidGrainger, il s'avère que le commutateur / elevated ne me permet toujours pas de contourner le contrôle de compte d'utilisateur et d'effectuer l'élévation sur place (voir la question pour plus de détails). Est-ce que je manque quelque chose?
user2064000

Ceci est un remplacement pour l'invite de commande Windows. De plus, le démarrage élevé n’est pas différent du démarrage de l’invite de commande intégrée élevée.
Je dis: réintégrez Monica le

La seule façon peut-être de modifier les paramètres de l'UAC en "Ne jamais notifier" Lorsque la notification UAC apparaît, cliquez sur le lien "Afficher plus de détails", puis sélectionnez le lien "Afficher lorsque cette notification doit apparaître". Sélectionnez le paramètre qui fonctionne. Vous voudrez peut-être le modifier lorsque vous aurez terminé, afin que les actions indésirables soient capturés. Cela peut être accompli dans les paramètres Windows.
David Grainger

TCC / LE fait aussi beaucoup d'autres choses. Je l'ai essayé avec l'UAC réglé sur jamais et ensuite utilisé, "Démarrer / Elevé / PGM" C: \ Program Files \ IrfanView \ i_view64.exe "/ thumbs" pour ouvrir un programme Elevated.
David Grainger
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.