web-dev-qa-db-fra.com

Demande de privilèges d'administrateur au moment de l'exécution

Est-il possible d'obtenir une application C++ exécutée sous Windows pour demander des privilèges d'administrateur au système d'exploitation au moment de l'exécution?

Je sais que cela peut être fait au moment de la compilation, mais ne semble pas trouver où que ce soit au moment de l'exécution.

Merci de votre aide!

EDIT: que faire si je veux que l'instance actuelle ait des privilèges élevés? Par exemple, je peux avoir des données stockées en mémoire que je souhaite conserver.

48
JonaGik

Pas tout à fait, mais vous pouvez faire le contraire - vous pouvez supprimer les privilèges si vous les avez déjà. Ainsi, vous pouvez démarrer votre programme en tant qu'administrateur, en utilisant l'une des méthodes répertoriées par Kate Gregory . Ensuite, supprimez vos privilèges inutiles; voir Suppression des privilèges en C++ sur Windows pour savoir comment faire.

8
Adam Rosenfield

Si vous souhaitez que l'application soit toujours élevée, vous pouvez lui donner un manifeste, soit en en créant un (pas en le compilant techniquement), soit en plaçant un manifeste externe dans le même dossier que l'exe. Si vous voulez décider, en tant que personne, de l'exécuter en hauteur, vous cliquez avec le bouton droit sur l'exe ou le raccourci et choisissez Exécuter en tant qu'administrateur. Si vous le lancez à partir du code, alors comme commentaires @vcsjones, vous utilisez le verbe runas lorsque vous lancez ce processus. Par exemple:

ShellExecute( NULL, 
    "runas",  
    "c:\\windows\\notepad.exe",  
    " c:\\temp\\report.txt",     
    NULL,                        // default dir 
    SW_SHOWNORMAL  
); 
36
Kate Gregory

Vous ne pouvez élever un processus que lors de sa création. Lorsqu'un processus s'exécute déjà, il n'y a aucun moyen de modifier son jeton de sécurité: il s'exécute avec ou sans élévation.

Si votre application doit effectuer une tâche administrative et s'exécute généralement sans élévation, vous devez créer un autre .exe qui demandera l'élévation avec son manifeste. Pour démarrer un processus élevé, vous devez utiliser la fonction ShellExecute ou ShellExecuteEx. À partir de votre processus principal, vous aurez besoin d'un moyen de passer les commandes à ce nouveau processus qui s'exécutera en mode élevé.


Pour plus d'informations sur l'UAC, lisez la série Conception d'applications UAC pour Windows Vista .

8
Alexey Ivanov

Votre processus (et vos threads) ont un jeton qui leur est attribué. Ce jeton a déjà configuré tous vos groupes. Sous UAC, le groupe Administrateur est désactivé. UAC supprimera ce groupe désactivé afin que vous vous retrouviez avec un jeton administrateur complet.

Pour y parvenir, vous devez avoir le privilège TCB. En d'autres termes, pour élever un processus à l'exécution, vous aurez besoin de l'aide d'un processus exécuté sous le compte SYSTEM, et Microsoft n'en fournit pas, ni une API pour contrôler l'implémentation actuelle de l'UAC. Sinon, cela irait à l'encontre du but.

Par souci d'exhaustivité, il existe une liste blanche de processus qui peuvent effectuer certaines opérations élevées sans invite. En bref, votre exécutable a besoin de:

  • À signer par Microsoft
  • Pour effectuer des opérations prédéfinies, comme avec IFileOperation

La meilleure explication que j'ai trouvée est ce hack . Il a été corrigé depuis lors, mais il éclaire le tout.

2
ixe013

Ajoutez un fichier manifeste dans votre EXE comme décrit ici.

http://msdn.Microsoft.com/en-us/library/bb756929.aspx

2
selbie