PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → Bonne utilisation de la fonction CreateProcessWithLogonW
Bonne utilisation de la fonction CreateProcessWithLogonW
Iniciado por Adrien Bonnel, 04,nov. 2013 23:07 - 7 respuestas
Publicado el 04,noviembre 2013 - 23:07
Bonjour,
Pour les besoins d'une application qui succédera à une série de scripts Batch qui se lancent lorsqu'un utlisateur se connecte à un poste du domaine de mon établissement, j'ai besoin d'utiliser cette fonction pour pouvoir exécuter une partie du code en tant qu'administrateur.
J'ai beau utiliser la fonction API ou AppelDll32, dès lors que j'exécute le code en mode test ou compilé, l'application se plante direct ...
Quelqu'un a-t-il rencontré le même type de problème ?
Merci par avance.
Cordialement,
Publicado el 05,noviembre 2013 - 13:05
Bonjour Adrien

oui... ca s'appelle un bug... et c'est en général du à une erreur dans
le code... que tu ne nous montre pas :-(

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Plus d'information sur http://fabriceharari.com


On 11/4/2013 5:07 PM, Adrien Bonnel wrote:
Bonjour,
Pour les besoins d'une application qui succédera à une série de scripts
Batch qui se lancent lorsqu'un utlisateur se connecte à un poste du
domaine de mon établissement, j'ai besoin d'utiliser cette fonction pour
pouvoir exécuter une partie du code en tant qu'administrateur.
J'ai beau utiliser la fonction API ou AppelDll32, dès lors que j'exécute
le code en mode test ou compilé, l'application se plante direct ...
Quelqu'un a-t-il rencontré le même type de problème ?
Merci par avance.
Cordialement,
Publicado el 05,noviembre 2013 - 15:14
Bonjour Fabrice,
Boulet que je suis, d'autant que j'impose aux membres de phpBB-fr.com (dont je suis un des administrateurs) de le faire :p.

Voici le code que je tente pour le moment d'exécuter :

wUsername est une chaîne UNICODE = AnsiVersUnicode("winadmin")
wDomain est une chaîne UNICODE = AnsiVersUnicode("lpartois.fr")
wPassword est une chaîne UNICODE = AnsiVersUnicode("2szlm24aVG")
wLogon est un entier = 0
wSoftware est une chaîne UNICODE = AnsiVersUnicode(ComplèteRep(fRepExe()) + ProjetInfo(piNomProjet) + ".exe")

SI AppelDLL32("advapi32.dll", "CreateProcessWithLogonW", &wUsername, &wDomain, &wPassword, wLogon, &wSoftware) = Vrai ALORS
Info("c'est good !")
SINON
Erreur("c'est pas good :-(")
FIN

FinProgramme()

Et voici le dump du message d'erreur :

Erreur à la ligne 7 du traitement Initialisation de Kirby.
Vous avez appelé la fonction AppelDLL32.
La fonction 'CreateProcessWithLogonW' de la DLL 'advapi32.dll' a provoqué une erreur d'exécution.

----- Informations techniques -----

Projet : Kirby

Appel WL :
Traitement de 'Initialisation de Kirby', ligne 7, thread 0
Fonction 'AppelDLL32', syntaxe 0

Que s'est-il passé ?
La fonction 'CreateProcessWithLogonW' de la DLL 'advapi32.dll' a provoqué une erreur d'exécution.

Code erreur : 2805
Niveau : erreur fatale (EL_FATAL)

Dump de l'erreur du module 'wd180vm.dll' (18.0.150.7).
Identifiant des informations détaillées (.err) : 2805
Informations de débogage :

Détails techniques :

Module : wd180vm.dll
Version du module : 18.0.150.7
VI : 01F180063c
Adresse de base : 25E60000
Erreur système : Access violation (GPF)
EIP = 25EC20DE
OS : Windows 2008 R2 Service Pack 1(6.1.7601)
Registres :

EIP = 25EC20DE EBP = 0018F2E8
EAX = 00000000 EBX = 00000057
ECX = 02A00C40 EDX = 260CC6C8
ESI = FFFFFFFF EDI = 00000000

Pile des appels :

[wd180vm.dll (25E60000), 18.0.150.7, 01F180063c]25EA0CA0 : Execution() + 136254 bytes
[wd180vm.dll (25E60000), 18.0.150.7, 01F180063c]25EA0CA0 : Execution() + 132840 bytes
[???]009139C8
[???]0018F4D4
[wd180vm.dll (25E60000), 18.0.150.7, 01F180063c]25E825F0 : DeclareProxy() + 121264 bytes
[wd180vm.dll (25E60000), 18.0.150.7, 01F180063c]25E825F0 : DeclareProxy() + 122432 bytes
[wd180vm.dll (25E60000), 18.0.150.7, 01F180063c]25E825F0 : DeclareProxy() + 100304 bytes
[wd180vm.dll (25E60000), 18.0.150.7, 01F180063c]26074270 : pQueryProxy() + 2638 bytes
[wd180vm.dll (25E60000), 18.0.150.7, 01F180063c]25E825F0 : DeclareProxy() + 104992 bytes
[wd180vm.dll (25E60000), 18.0.150.7, 01F180063c]25E825F0 : DeclareProxy() + 104768 bytes
[wd180vm.dll (25E60000), 18.0.150.7, 01F180063c]25E825F0 : DeclareProxy() + 104448 bytes
[wd180vm.dll (25E60000), 18.0.150.7, 01F180063c]25E825F0 : DeclareProxy() + 104768 bytes
[wdtst.exe (00000000), 18.0.2.0, 01F180036f]????

Fonction (0,18)
Informations supplémentaires :
EIT_PILEWL :
Initialisation de Kirby (), ligne 7
EIT_DATEHEURE : 05/11/2013 15:03:47

Assistance

- Vérifiez les paramètres passés
- Vérifiez que le type des paramètres passés correspond bien à ceux attendus
- Vérifiez que les valeurs nulles sont bien tolérées par la fonction appelée
- Vérifiez les appels précédents à d'autres fonctions de cette DLL (ils ont pu la mettre dans un état instable)
- Si le problème persiste, contactez le fournisseur de la DLL où se trouve la fonction.
Miembro registrado
505 mensajes
Popularité : +18 (18 votes)
Publicado el 06,noviembre 2013 - 21:53
Bonjour Adrien,

Adrien Bonnel a écrit :

SI AppelDLL32("advapi32.dll", "CreateProcessWithLogonW", &wUsername, &wDomain, &wPassword, wLogon, &wSoftware) = Vrai ALORS



Si tu regardes sur MSDN, tu verras que cette fonction de l'API Windows a de nombreux paramètres qui ne sont pas renseignés dans ton code.
Donc ça ne peut pas fonctionner.

Voici le prototype en langage C pour la fonction CreateProcessWithLogonW:
BOOL WINAPI CreateProcessWithLogonW(
_In_ LPCWSTR lpUsername,
_In_opt_ LPCWSTR lpDomain,
_In_ LPCWSTR lpPassword,
_In_ DWORD dwLogonFlags,
_In_opt_ LPCWSTR lpApplicationName,
_Inout_opt_ LPWSTR lpCommandLine,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCWSTR lpCurrentDirectory,
_In_ LPSTARTUPINFOW lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInfo
);


http://msdn.microsoft.com/en-us/library/windows/desktop/ms682431%28v=vs.85%29.aspx

Il y a pas mal de travail pour faire fonctionner cette usine à gaz de schiste... :D

Bon courage !

--
Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/…
Miembro registrado
182 mensajes
Popularité : +10 (10 votes)
Publicado el 27,noviembre 2013 - 07:46
Bonjour,
Désolé de n'avoir pu vous depuis le temps, j'ai eu pas mal de boulot au lycée.
Il me semble justement que j'avais renseigné les autres paramètres nécessaires, plusieurs étant d'ailleurs optionnels.
Je teste à nouveau ce soir et je te tiens au courant dans la foulée :).
Miembro registrado
148 mensajes
Popularité : +3 (3 votes)
Publicado el 27,noviembre 2013 - 08:25
et le mot de passe en pâture sur un forum? normal?
Miembro registrado
182 mensajes
Popularité : +10 (10 votes)
Publicado el 27,noviembre 2013 - 09:13
Mot de passe fictif :).
Publicado el 15,enero 2019 - 15:23
J'ai du appeler cette API aujourd'hui, voilà mon code :

sCheminAppliALancerUnicode est une chaîne UNICODE = AnsiVersUnicode(sCheminAppliALancer)

bufLogin est un Buffer = AnsiVersUnicode(sLogin)
bufDomaine est un Buffer = AnsiVersUnicode(sDomaine)
bufMotDePasse est un Buffer = AnsiVersUnicode(sMotDePasse)
wLogon est un entier = 0
sLigneDecommandeUnicode est une chaîne UNICODE = """"+sCheminAppliALancerUnicode+""" "+AnsiVersUnicode(sLigneDecommande)
nCreationFlag est un entier

pi est une PROCESS_INFORMATION //Voir déclaration de la structure après ce code

nRes est un entier = API("advapi32.dll", "CreateProcessWithLogonW", ...
&bufLogin,... // LPCWSTR lpUsername,
&bufDomaine,... // LPCWSTR lpDomain,
&bufMotDePasse,... // LPCWSTR lpPassword,
wLogon,... // DWORD dwLogonFlags,
Null,... // LPCWSTR lpApplicationName,
sLigneDecommandeUnicode,... // LPWSTR lpCommandLine,
nCreationFlag,... // DWORD dwCreationFlags,
Null,... // LPVOID lpEnvironment,
Null,... // LPCWSTR lpCurrentDirectory,
Null,... // LPSTARTUPINFOW lpStartupInfo,
&pi) // LPPROCESS_INFORMATION lpProcessInformation

//L'API renvoie Faux
SI nRes = 0 ALORS
sErreur = "Erreur lors de l'appel à l'API : "+ErreurInfo()
SINON
nPID est un entier = pi.dwProcessId
// Suite du code ...
FIN

---- Déclaration de la structure

PROCESS_INFORMATION est une Structure
hProcess est un entier
hThread est un entier
dwProcessId est un entier sans signe sur 4 octets
dwThreadId est un entier sans signe sur 4 octets
FIN