UAC / elevation en cours d'execution

Le
Thierry
Bonjour,

J'ai un prog qui a besoin ponctuellement des droits "admin" au sens UAC que
ponctuellemt pour installer des services. Comment prendre ces droits en
cours d'execution (fenetre "ce programme va modifier etc" ?
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Claude BELLAMY
Le #22754531
"Thierry" discussion :

Bonjour,

J'ai un prog qui a besoin ponctuellement des droits "admin" au sens UAC
que
ponctuellemt pour installer des services. Comment prendre ces droits en
cours d'execution (fenetre "ce programme va modifier etc" ?



Il n'est pas possible de changer ponctuellement le niveau de privilèges
requis au cours de l'exécution d'un même processus.
Je sais, c'est une carence de UAC qui embête tout le monde !

Si on veut forcer l'élévation de privilèges (au niveau "admin" en général),
il n'y a pas d'autre solution (dans le cas où processus ne réclame pas
lui-même ce niveau grâce à un fichier ".manifest") que de RELANCER le
processus via un appel à la fonction
ShellExecuteEx
(de l'API shell32.dll)
http://msdn.microsoft.com/en-us/library/bb762154(VS.85).aspx

Cette fonction admet en paramètre une structure SHELLEXECUTEINFO
http://msdn.microsoft.com/en-us/library/bb759784(v=VS.85).aspx

Parmi les membres de cette structure on notera :
LPCTSTR lpFile;
chemin du fichier exécutable (ou document)
LPCTSTR lpParameters;
paramètres éventuellement transmis
LPCTSTR lpVerb;
la commande désirée
Jusqu'à XP, on avait le choix entre
"edit"
"explore"
"find"
"open" (cas le plus fréquent)
"print"
"properties"
A partir de Vista, avec l'apparition de UAC, s'ajoute la commande
"runas"
qui est donc celle à utiliser dans le cas précis pour forcer l'élévation
de privilèges.



Voici un script VBS qui fait la même chose :
(il admet en paramètre l'exécutable ou le document suivi de paramètres
éventuels)
Fichier "elevate.vbs"
----------- couper ici -----------
Set args = Wscript.Arguments
nbargs=args.count
If nbargs=0 Then Wscript.quit
Appli=args(0)
Params=""
For i= 1 To nbargs-1
Params=Params+" "+args(i)
Next
Set Shell=Wscript.CreateObject("Shell.Application")
Shell.ShellExecute Appli,Params,"","runas"
----------- couper ici -----------


PS:
Il existe aussi la fonction
SHCreateProcessAsUserW
http://msdn.microsoft.com/en-us/library/bb762138(VS.85).aspx
qui joue le même rôle que "ShellExecuteEx" mais avec implicitement le verbe
"runas"

Le problème est qu'elle n'existe pas sous XP et précédents, donc si on veut
une application portable sous toutes les versions de Windows, on ne peut pas
l'utiliser (à moins de faire des tests supplémentaires). C'est pourquoi je
lui préfère ShellExecuteEx.



PPS : ATTENTION aux erreurs (de frappe, j'espère!) dans le MSDN !!!

p.ex. on lit, à propos de SHCreateProcessAsUserW :
"...SHCreateProcessAsUserW is not supported under Windows XP. "
et 4 lignes plus bas :
"Minimum supported client : Windows 2000 Professional, Windows XP" !!!

et en ce qui concerne ShellExecuteEx (qui fonctionne très bien sous Windows
2000) :
"Minimum supported client : Windows XP "




--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr
Thierry
Le #22757741
"Jean-Claude BELLAMY" news:4cd17c19$0$7704$:

J'ai un prog qui a besoin ponctuellement des droits "admin" au sens
UAC que
ponctuellemt pour installer des services. Comment prendre ces droits
en cours d'execution (fenetre "ce programme va modifier etc" ?



Il n'est pas possible de changer ponctuellement le niveau de
privilèges requis au cours de l'exécution d'un même processus.
Je sais, c'est une carence de UAC qui embête tout le monde !



... Ils font vraiment chier...
Il va falloir que je deporte du code dans un exe a part ou utiliser sc pour
gerer les services... genial pour la gestion d'erreur.
Publicité
Poster une réponse
Anonyme