Windev : Lancer un exécutable depuis un autre exécutable en élevant les privilèges avec ShellExecuteExA
Bonjour,
Voici un code permettant de lancer un exécutable ayant des droits d'administration depuis un exécutable ayant des droits limités.
Pour info, la détermination du niveau des droits autorisés pour un exécutable se fait par l'utilisation d'un manifeste, lors de la création de cet exécutable.
Plus d'infos sur les manifestes ici : https://doc.pcsoft.fr/fr-FR/?2025013.
La fonction Windev LanceAppliAssociée (à la différence de LanceAppli) permet bien de lancer un exécutable avec des droits potentiellement plus élevés que ceux de l'application courante à ceci près que je ne suis pas parvenu à passer des paramètres à l'exécutable lancé, ce qui est tout de même un peu dommage...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
LOCAL
sExecutable est une chaîne
sParametres est une chaîne
sExecutable = ComplèteRep(fRepExe())+"MonAppli.exe"
sParametres = [
"%1" "%2" "%3"
]
sParametres = ChaîneConstruit(sParametres,"Param1","Param2","Params3")
//Ceci fonctionne
LanceAppliAssociée(sExecutable)
//Ceci ne fonctionne pas... :(
LanceAppliAssociée(sExecutable+" "+sParametres) |
J'ai donc dû ruser un peu en passant directement par l'appel de la fonction ShellExecuteExA de l'api SHELL32 :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
SHELLEXECUTEINFOA est une Structure
cbSize est un entier //Type C : DWORD
fMask est un entier sans signe //Type C : ULONG
hwnd est un entier système //Type C : HWND
lpVerb est un entier système //Type C : LPCSTR
lpFile est un entier système //Type C : LPCSTR
lpParameters est un entier système //Type C : LPCSTR
lpDirectory est un entier système //Type C : LPCSTR
nShow est un entier //Type C : int
hInstApp est un entier système //Type C : HINSTANCE
lpIDList est un entier système //Type C : LPVOID
lpClass est un entier système //Type C : LPCSTR
hkeyClass est un entier système //Type C : HKEY
dwHotKey est un entier //Type C : DWORD
hIcon est un entier système //Type C : HANDLE
hProcess est un entier système //Type C : HANDLE
FIN
local
bRes est un booléen
sVerb est une chaîne
sVerb = "open"
stSHELLEXECUTEINFOA est une SHELLEXECUTEINFOA
stSHELLEXECUTEINFOA.cbSize = Dimension(stSHELLEXECUTEINFOA)
stSHELLEXECUTEINFOA.fMask = 0x00000040//SEE_MASK_NOCLOSEPROCESS
stSHELLEXECUTEINFOA.hwnd = Handle()
stSHELLEXECUTEINFOA.lpVerb = &sVerb
stSHELLEXECUTEINFOA.lpFile = &sExecutable
stSHELLEXECUTEINFOA.nShow = 5
stSHELLEXECUTEINFOA.lpParameters = &sParametres
stSHELLEXECUTEINFOA.lpDirectory = Null
//https://msdn.microsoft.com/en-us/library/windows/desktop/bb759784(v=vs.85).aspx
bRes = API("SHELL32","ShellExecuteExA",&stSHELLEXECUTEINFOA)
SI bRes = Vrai ALORS
lpExitCode est un entier système // Type C :LPDWORD
BOUCLE
//https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms683189(v=vs.85).aspx
bRes = API("KERNEL32","GetExitCodeProcess",stSHELLEXECUTEINFOA.hProcess,&lpExitCode)
SI bRes = Faux _OU_ lpExitCode <> 259 ALORS//259 = STILL_ACTIVE
SORTIR
FIN
Multitâche(-100)
FIN
FIN
Info("Appli fermée !") |
Et là, miracle, ça marche !
Bonne prog :ccool: