Forcer un programme à s'exécuter * sans * privilèges d'administrateur ou UAC?


122

Existe-t-il un moyen de forcer un programme nécessitant normalement des privilèges d’administrateur (via UAC) à s’exécuter sans eux? (c.-à-d. aucune invite UAC ni aucun accès à l'échelle du système .)

Ajouté: Sans modifier l'exécutable lui-même.


Malgré la réponse de James, j'ai trouvé quelques façons qu'il peut presque être fait:

  1. En modifiant l'exécutable, je peux supprimer l' trustInfoentrée du manifeste (ou le manifeste entièrement afin de pouvoir en utiliser un externe), ce qui permet au programme de démarrer sans UAC. Malheureusement, cela modifie l'exécutable, donc il se ferme peu de temps après en raison d'un test de somme de contrôle interne.
  2. En utilisant Process Explorer, je peux le lancer en tant qu’utilisateur limité. Cependant, cela semble le limiter beaucoup plus que je ne le souhaiterais (il fonctionne comme IE en mode protégé et peut donc accéder à beaucoup moins que ce que mon utilisateur standard non élevé peut obtenir).

1
Vous spécifiez ne pas modifier l'exécutable, mais modifier le fichier .exe est l'une de vos tentatives?
cutrightjm

3
@ekaj J'ai seulement précisé qu'après avoir découvert que cela ne fonctionnerait pas;)
Andrew Russell

Pourriez-vous préciser le programme, même si vous ne l'utilisez plus? Cela pourrait aider les gens à savoir ce qu'il essaie d'accéder et qui nécessite des privilèges d'administrateur
cutrightjm le

@ekaj Malheureusement pas. Cependant, ce n'est pas particulièrement pertinent: le contrôle de compte d'utilisateur est déclenché par un programme demandant une élévation lors de la création du processus (la manière habituelle - comme dans ce cas-ci - est d'utiliser un manifeste). Une fois qu'un processus est démarré, il ne peut pas changer son statut d'élévation, quelles que soient les ressources restreintes auxquelles il tente d'accéder.
Andrew Russell

Si un programme n'a pas de manifeste et refuse de s'exécuter sans privilèges administrateur, cela est probablement dû à la détection du programme d'installation UAC. J'ai posté cette question et misha256 a une bonne solution. Je l'ai testé et je peux confirmer que cela fonctionne. superuser.com/questions/857616/… J'ai fait des recherches et j'ai découvert qu'il n'y avait aucune raison pour que la détection des installateurs existe. Notez que si les privilèges d'administrateur sont dus à une entrée de trustinfo dans un manifeste, cela ne fonctionnera évidemment pas.
user1258361

Réponses:


74
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker]
@="Run without privilege elevation"

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command]
@="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""

Enregistrez ce texte dans <name_of_file>.reget ajoutez-le au registre Windows. (Double-cliquez dessus devrait faire l'affaire.)

Ensuite, cliquez avec le bouton droit de la souris sur l'application que vous souhaitez exécuter sans privilèges administratifs et sélectionnez "Exécuter sans élévation de privilèges".

Dans certains cas - une petite quantité, 0,1% des programmes peuvent poser deux fois des questions sur l'invite UAC.


1
J'avais l'habitude d'utiliser l'application shim de Application Compatibility Toolkit, mais cela nécessitait également beaucoup de travail pour chaque exécutable et laissait des fichiers indésirables dans le registre pour chaque fichier. Cette méthode fonctionne et je l’aime beaucoup mieux.
Ben Voigt

2
Accepter cela car cela semble être la méthode la plus simple, et j'ai ( enfin! ) Pu le vérifier. Possède également la très belle propriété d’être trivialement utilisable en tant que ligne de commande unique (retirer l’extérieur "puis le transformer \"en ").
Andrew Russell

1
J'ai le même problème que @Derek, l'application semble constamment demander de nouveau pour le contrôle de compte d'utilisateur, je ne lui fais pas confiance avec un accès à l'échelle du système, mais j'ai besoin de ses fonctionnalités.
Gizmo

1
Vous pouvez ajouter ceci au registre uniquement pour l'utilisateur actuellement connecté en modifiant les clés comme suit: HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker et HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker \ command
GodEater

1
@ jpmc26 Je pense que /minc'est une erreur. La solution fonctionne exactement de la même manière sans cela. Vom doit avoir mélangé cmdet startcommutateurs. Il semble que cmd.execela ne se plaint pas des mauvais commutateurs. Essayez cmd /whatever, par exemple.
cdlvcdlv

53

Enregistrer dans nonadmin.bat:

cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %1"

Maintenant, vous pouvez glisser et déposer des programmes sur ceci pour les exécuter sans admin.

Cela ne nécessite pas de privilèges d'administrateur, contrairement à la modification de cette clé de registre. De plus, vous n'encombrerez pas le menu contextuel.

Basé sur la réponse de Vom


Mise à jour: devrait maintenant fonctionner avec les programmes dont le nom contient également des espaces.


Je l'ai essayé sur certains programmes nécessitant un accès sur mes lecteurs et il ne pouvait pas les détecter ou ne fonctionnait pas au départ: / (rufus rufus.akeo.ie par exemple)
keinabel

7
@keinabel C'est probablement parce qu'ils avaient besoin de l'administrateur pour fonctionner. Ce script est destiné aux programmes qui requièrent des privilèges d’administrateur sans réellement faire ce qui le requiert. L'accès brut aux lecteurs est une chose typique de l'administrateur.
Hjulle

2
Génial! A pu installer XAMPP en utilisant cette méthode.
Krishnaraj

Cela ne semble pas fonctionner pour moi pour les exécutables du répertoire "C: \ Program Files \ ...". Je reçois un Windows cannot find 'C:\Program'. Make sure you typed the name correctly, and then try again. J'ai essayé cette commande manuellement plusieurs fois avec de légères variations et sans succès. Des idées?
Jake Smith

1
J'ai eu le même problème avec l'emplacement du fichier étant dans un dossier avec des espaces. Résolution du problème en supprimant quelques guillemets: cmd / min / C "set __COMPAT_LAYER = RUNASINVOKER && start" "% 1"
ragnar le

35

J'espère que je ne serai pas trop en retard pour la fête, mais je cherchais une question similaire et sans voir de réponse ici, j'ai découvert que la RunAscommande intégrée de Windows , lorsqu'elle est exécutée en tant qu'administrateur, peut le faire avec /trustlevelswitch.

RUNAS /trustlevel:<TrustLevel> program

/showtrustlevels  displays the trust levels that can be used
                  as arguments to /trustlevel.
/trustlevel       <Level> should be one of levels enumerated
                  in /showtrustlevels.

Cela a fonctionné dans mon cas. Ironiquement, le démarrage explicite d’un programme sans élévation nécessite une invite de commande élevée . Allez comprendre. :) J'espère que ça t'aide.


Je peux confirmer que cela ne fonctionne pas. Je viens de le tester et j'ai une erreur: "ERREUR RUNAS: impossible à exécuter - (nom du programme ici). L'opération demandée nécessite une élévation".
user1258361

9
@ user1258361 vous devez exécuter cette commande à partir d'une invite élevée, comme je l'ai écrit en gras ...
Mxx

Il ne semble pas nécessiter une invite élevée sur Windows 7 ...
SamB

4
Testé avec une invite élevée, utilisé runas / trustlevel en ligne de commande: 0x20000 (programme), programme exécuté de toute façon en tant qu'administrateur. Pour référence, 0x20000 est l'utilisateur de base.
user1258361

2
nécessite une invite de commande élevée ... bien sûr que si. Sinon, vous ne possédez déjà plus de droits d'administrateur et tous les processus que vous démarrez ne les ont pas.
Twisty Impersonator

16

Si vous avez toujours une application à exécuter sans UAC, vous pouvez la cibler avec le registre (ajoutez le texte dans un fichier REG et importez-le dans le registre):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\example\\application.exe"="RunAsInvoker"

Contrairement à cette réponse , cette solution ne nécessite aucun autre clic ou changement d'interaction utilisateur.

Microsoft appelle ce processus en ajoutant le RunAsInvoker "Compatibility Shim" .


La réponse à une question différente, mais liée, a été l’inspiration de cette réponse.
Palswim

1
Merci beaucoup! C'était la seule chose qui fonctionnait pour moi! J'avais une application qui était appelée à partir du menu contextuel de Windows, et elle apparaissait toujours en tant qu'administrateur, bien qu'elle soit appelée correctement de partout ailleurs. Après ce correctif, l'application a commencé à être appelée correctement.
utilisateur

3

J'ai résolu ce problème aujourd'hui à l'aide de la boîte à outils de personnalisation d'applications MS.

J'ai suivi les instructions dans un article de Tech Republic .

Fondamentalement:

1) vous obtenez la boîte à outils de MS ici .

2) Cliquez sur Fix

3) Choisissez l’ option RunAsInvoker

4) Faites un clic droit sur le correctif et choisissez Installer


Votre réponse fait exactement le contraire de l'effet souhaité. La question initiale était de savoir comment forcer une application qui demande des privilèges élevés à s'exécuter sans élever. Votre réponse utilise toujours le contrôle de compte d'utilisateur, mais désactive simplement cette invite. C'est une mauvaise réponse à cette question.
Mxx

@ mxx en fait non. Si l'utilisateur actuel est limité (ou si vous avez activé le contrôle de compte d'utilisateur), le processus sera lancé avec des privilèges limités.
LogicDaemon

1
@LogicDaemon Si vous lisez réellement l'article, vous verrez qu'il explique que si vous suivez ces étapes, vous allez exécuter une application en tant qu'administrateur sans invite UAC . C'est l'opposé de ce que l'OP a demandé.
Mxx

@ mxx nope. Lisez sur technet ce que RunAsInvoker fait réellement. C'est en effet ce que topicstarter a demandé, bien que cela ne fonctionne que pour les anciennes applications.
LogicDaemon

Tant que l'explorateur, une cmd non-admin ou tout autre processus standard est le parent, RunAsInvoker s'exécutera avec les mêmes droits limités. (Explorer est restreint par défaut, sinon il ne vous demanderait jamais d'éliminer un fichier.) Il semble en fait fonctionner même avec de nouvelles applications. RunAsInvoker signifie qu'il hérite exactement du même jeton ACL.
SilverbackNet

3

S'il s'agit d'un exefichier d' installation (d'installation) nécessitant des privilèges d'administration, il existe une astuce pour l'exécuter sans accès élevé:

Si le nom du fichier contient des mots tels que setupou installwindows l'exécute avec un accès élevé, même s'il n'a pas besoin d'un accès élevé:

entrez la description de l'image ici

Si le fichier .exe contient un manifeste, ces heuristiques pour l'élévation ne s'appliquent pas.

Ceci est documenté dans la documentation UAC (User Account Control):

La détection du programme d'installation détecte les fichiers d'installation, ce qui permet d'empêcher l'exécution d'installations à l'insu de l'utilisateur et sans son consentement.

La détection de l'installateur ne concerne que:

  • Fichiers exécutables 32 bits.

  • Applications sans attribut de niveau d'exécution demandé.

  • Processus interactifs exécutés en tant qu'utilisateur standard avec UAC activé.

Avant la création d'un processus 32 bits, les attributs suivants sont vérifiés pour déterminer s'il s'agit d'un programme d'installation:

  • Le nom de fichier comprend des mots clés tels que "installer", "installer" ou "mettre à jour".

  • ...

Lisez le mode ici: https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works


2
Bien entendu, cela ne fonctionne que lorsque le manifeste de l'application ne spécifie pas explicitement qu'il doit être exécuté avec un niveau élevé.
Daniel B

3
@DanielB: en fait, cette astuce ne fonctionne que lorsqu'il n'y a pas de manifeste
AntoineL

1
Upvote. Bonne observation. Un lien vers les documents officiels serait également utile.
Denis Nikolaenko

@DenisNikolaenko Ty, source ajoutée :)
Shayan

1

Dans sa question, Andrew a déclaré que les solutions suivantes ne fonctionnaient pas vraiment:

En modifiant l'exécutable, je peux supprimer l'entrée trustInfo du manifeste (ou du manifeste, afin de pouvoir utiliser une entrée externe), ce qui permet au programme de démarrer sans UAC. Malheureusement, cela modifie l'exécutable, donc il se ferme peu de temps après en raison d'un test de somme de contrôle interne.

J'ai pu modifier et modifier un fichier externe .manifest pour le logiciel que j'utilisais

<ms_asmv2:requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

à

<ms_asmv2:requestedExecutionLevel level="asInvoker" uiAccess="false" />

Il s'avère que le logiciel que j'utilisais ne nécessitait pas vraiment de droits d'administrateur. J'ai donc pu l'exécuter sur un compte d'utilisateur standard sans mot de passe UAC ni administrateur. Merci!


Il serait peut-être plus facile de modifier l’exécutable, car le manifeste pourrait simplement être inclus dans le fichier. Notez que le préfixe d'espace de noms ms_asmv2:peut également être omis. En outre, il est possible que la modification de la taille du bloc XML incorporé puisse corrompre le fichier binaire. Par conséquent, "requireAdministrator" doit être remplacé par "asInvoker" et ajouté à la même longueur avec des espaces avant uiAccess.
Kdb

-2

J'ai résolu ce problème en modifiant les autorisations sur le dossier contenant le programme.

J'ai ajouté chaque utilisateur qui exécutera ce programme et leur ai donné des privilèges de "contrôle total". Cela a résolu le problème et j'ai laissé la case à cocher "Exécuter en tant qu'administrateur".

Je n'ai aucun problème de sécurité pour les utilisateurs qui exécuteront le programme.


-5

Non, si un programme nécessite le contrôle de compte d'utilisateur, il tente d'accéder à quelque chose en dehors de son bac à sable. Le programme ne fonctionnera pas correctement sans l'accès surélevé.

Si vous souhaitez simplement vous débarrasser de la notification, vous pouvez désactiver le contrôle de compte d'utilisateur.

Désactiver le contrôle de compte d'utilisateur sur Windows Vista: Démarrer, tapez "utilisateur". Cliquez sur "Comptes d'utilisateurs". Dans la fenêtre qui apparaît, cliquez sur "Paramètres de contrôle de compte d'utilisateur", puis désactivez UAC.

Désactiver le contrôle de compte d'utilisateur sous Windows 7: Démarrer, tapez "utilisateur". Cliquez sur "Paramètres de contrôle de compte d'utilisateur". Faites glisser la barre de choix jusqu'en bas de "Jamais notifier".


7
Désactiver le contrôle de compte d'utilisateur n'est pas ce que j'essaie de réaliser. De plus, votre description du fonctionnement de l'UAC n'est correcte que dans un sens général. Il est possible qu'un programme demande à l'UAC quand il n'en a pas strictement besoin. Et le contrôle de compte d'utilisateur se produit avant le démarrage du programme. Une fois son exécution lancée, si elle dépasse ses autorisations, elle obtiendra simplement des erreurs sans autorisation.
Andrew Russell

Sémantique mise à part, vous ne pouvez pas "désactiver" les notifications UAC pour un programme spécifique tout en limitant leur accès.
James Watt

James: En fait - vous semblez pouvoir le faire - j'ai mis à jour ma question.
Andrew Russell

Sans modifier le code du programme lui-même, je serais intéressé de connaître une solution qui fonctionne si vous en trouvez une.
James Watt
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.