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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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