Page 1 sur 1

[R] Problème avec la Macro @error

Posté : mar. 07 août 2007 07:07
par benzo
Bonjour, :D

tout d'abord bravo pour le nouveau forum,c'est clair et aéré ce qui est appréciable.

Bon rentrons dans le vif du sujet.J'ai fait une interface Gui avec 3 imputbox qui récupèrent le nom de l'utilisateur ,le domaine et invite l'utilisateur à saisir mot de passe en crypté.

Code : Tout sélectionner

$datadomaine=regread("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","DefaultDomainName");
$data_user=regread("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","DefaultuserName")
GUICtrlCreateLabel("nom d'utilisateur ", 62, 15)
$user=GUICtrlCreateInput($data_user,205,  15, 100, 20)
guictrlcreatelabel("nom de domaine :",62,95)
GUICtrlCreateLabel("(ex gg.dom)",62,110)
$domaine=GUICtrlCreateInput($datadomaine,205,  97, 100, 20)
guictrlcreatelabel("Rentrer mot de passe :",62,175)
$mdp=GUICtrlCreateInput("",205,  174, 100, 20,0x21)

$MAPPER=guictrlcreateButton("Lancer",10,315,120,20)
guictrlsetonevent($MAPPER,"lancer")

func lancer()
    $resultuser=GUICtrlRead ($user)
    $resultdomaine=GUICtrlRead ($domaine)
    $resultmdp=GUICtrlRead ($mdp)
   
    runasset($resultuser,$resultdomaine,$resultmdp) 
    run (@ScriptDir &"\util\programme.exe")
   runasset()
endfunc
;la fonction lancer récupère les infos saisies dans les inputbox et exécute le prog avec les droits du compte utilisateur

 
Ce que j'aurais souhaiter faire :lol: c'est afficher un message en cas de mot de passe incorrect ou de champ vide.
Si je mets rien dans le champ "mot de passe" le prog quitte et message d'erreur autoit s'affiche "Échec d'ouverture de session : nom d'utilisateur inconnu ou mot de passe incorrect."

Je voudrais utiliser "if @error then msgbox(0,"","mot de passe incorrect)"
Si oui à quel endroit précis car j'ai tout essayé ca ne prend pas en compte cette condition :cry:
Sinon dois je procéder autrement ?
J'espère que j'ai été clair et soyez indulgents je débute...

Merci d'avance

Posté : mar. 07 août 2007 12:14
par ani
Bonjour benzo et soit le bienvenu, moi aussi j'aime bien le nouveau thème du site, merci au concepteur ;)

Pour les variables $datadomaine et $data_user, tu peux les remplacer par les macros suivantes :

pour datadomaine = @LogonDomain
pour data_user = @UserName

je ne pourrait répondre à la deuxième question (si @error alors)vu que je suis un super novice :(
mais je vais essayer, je sait pas comment tu va vérifier le mot de passe ?
Revenons à la conception, donc tu as deux possibilité, l'une en utilisant le GUICtrlSetOnEvent et la seconde en utilisant la boucle While

^premier^

Code : Tout sélectionner

#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1) ; ici on active le eventmode

$Forme_Gui = GUICreate("",400,400,-1,-1) 

$user_Label = GUICtrlCreateLabel("nom d'utilisateur pacific:", 62, 15) 
$user = GUICtrlCreateInput(@UserName,205,  15, 100, 20) 

$domaine_Label = GUICtrlCreateLabel("nom de domaine :" & @CRLF & " (ex i78g.dom pr St ger)",62,95)
$domaine=GUICtrlCreateInput(@LogonDomain,205,  97, 100, 20) 

$mdp_Label = GUICtrlCreateLabel("Rentrer mot de passe pacific:",62,175) 
$mdp=GUICtrlCreateInput("",205,  174, 100, 20,0x21) 

$MAPPER=GUICtrlCreateButton("Lancer",10,315,120,20) 
guictrlsetonevent($MAPPER,"lancer") 

GUISetState(@SW_SHOW)

while 1
sleep(100)
WEnd

func lancer() 
    $resultuser=GUICtrlRead ($user) 
    $resultdomaine=GUICtrlRead ($domaine) 
    $resultmdp=GUICtrlRead ($mdp)
    if $resultmdp = "" Then
    msgbox(0,"Erreur, échec d'ouverture de session", "Nom d'utilisateur inconnu ou mot de passe incorrect." )
    exit ; l'interface se close si rien n'est afficher 
    EndIf
    
   msgbox(0,"",$resultuser & @CRLF & $resultdomaine & @CRLF & $resultmdp)
   runasset($resultuser,$resultdomaine,$resultmdp) 
   run (@ScriptDir &"\util\programme.exe") 
   runasset() 
endfunc

^La seconde^

Code : Tout sélectionner

#include <GUIConstants.au3>

$Forme_Gui = GUICreate("",400,400,-1,-1) 

$user_Label = GUICtrlCreateLabel("nom d'utilisateur pacific:", 62, 15) 
$user = GUICtrlCreateInput(@UserName,205,  15, 100, 20) 

$domaine_Label = GUICtrlCreateLabel("nom de domaine :" & @CRLF & " (ex i78g.dom pr St ger)",62,95)
$domaine=GUICtrlCreateInput(@LogonDomain,205,  97, 100, 20) 

$mdp_Label = GUICtrlCreateLabel("Rentrer mot de passe pacific:",62,175) 
$mdp=GUICtrlCreateInput("",205,  174, 100, 20,0x21) 

$MAPPER=GUICtrlCreateButton("Lancer",10,315,120,20) 

GUISetState(@SW_SHOW)

while 1
    $msg = GUIGetMsg()
    Select
        case $msg = $MAPPER
            lancer()
        case $msg = $GUI_EVENT_CLOSE ; si on appuie sur esc(ape) ou la petite croix il ferme le programme
            Exit
    EndSelect
WEnd

func lancer() 
    $resultuser=GUICtrlRead ($user) 
    $resultdomaine=GUICtrlRead ($domaine) 
    $resultmdp=GUICtrlRead ($mdp)
    if $resultmdp = "" Then
    msgbox(0,"Erreur, échec d'ouverture de session", "Nom d'utilisateur inconnu ou mot de passe incorrect." )
    exit ; l'interface se close si rien n'est afficher 
    EndIf
    
    msgbox(0,"",$resultuser & @CRLF & $resultdomaine & @CRLF & $resultmdp)
    runasset($resultuser,$resultdomaine,$resultmdp) 
    run (@ScriptDir &"\util\programme.exe") 
    runasset() 
endfunc 
;la fonction lancé, récupère les infos saisies dans les inputbox et exécute le prog avec les droits du compte utilisateur


y aura surement une correction par les utilisateurs les plus doué :)
merci d'avance ;)

Posté : mar. 07 août 2007 17:37
par benzo
salut ani ,
merci de m'avoir répondu
je note les 2 macros @username et @LogonDomain bien pratiques :)

Pour la conception j'ai effectivement opter pr le "guictrlsetonevent",j'ai pas poster tout le code.

En fait oui je voudrais contrôler si le mot de passe est le bon et pas seulement si le champ est rempli ou pas "if $resultmdp=""".

Comme autoit déclenche une erreur et une sortie du prog si le mot de passe est mauvais je pensais à un 'if not @error ou if @error"?

Code : Tout sélectionner

if @error Then 
    msgbox(0,"Erreur, échec d'ouverture de session", "Nom d'utilisateur inconnu ou mot de passe incorrect." ) 
   ; l'interface se close si rien n'est afficher 
    else
   runasset($resultuser,$resultdomaine,$resultmdp)
    run (@ScriptDir &"\util\mapprinter.exe")
    runasset()
    EndIf 
    endfunc
 
si je rentre un faux mot de passe la fenêtre se close au lieu d'afficher la msgbox d'erreur
:?:

Posté : mar. 07 août 2007 17:59
par ani
j'avais un peu compris mais mon problème c'est le mot de passe, c'est celui de la machine (comme pour la boîte de dialogue lors du lancement de windows (winlogon)) ?

si il n'y a pas d'indice pour le mot de passe, on ne peut faire une vérification (fichier ini, base de donnée, registre windows) ??

Posté : mar. 07 août 2007 18:36
par sylvanie
Bonjour tout le monde !

suffit de basculer l'erreur fatal en mode silencieux,
voici un petit script similaire qui tente de lancer winmine.
avec AutoItSetOption("RunErrorsFatal",0), le run envoie 1 à @error en cas de mauvais mdp et alors on peut imaginer une procédure de ressaisie du mdp :

Code : Tout sélectionner

AutoItSetOption("RunErrorsFatal",0)
$mdp="portnawak"
While 1
    runasset(@UserName,@LogonDomain,$mdp) 
    run ("winmine.exe")
    If @error=1 Then
        $mdp=InputBox("Saisir le mdp","mdp de "&@UserName)
        if @error<>0 Then ExitLoop ; cancel ou un pb de sasie implique la sortie de la boucle
    Else
        ExitLoop
    EndIf
    runasset()
WEnd

runasset()

 
Autre conseil, passes par un autoitsetoption("OnExitFunc","My_Exit") afin de faire ceci à chaque sortie de programme :

Code : Tout sélectionner

func My_exit()
     $mdp="blablablabla"
endfunc
avec blablabla toujours de taille supérieure ou égale au vri mdp

pourquoi ? pour écraser la valeur du vrai mdp en RAM (en théorie) qui peut être en pratique dans le swap.
Si ce n'est pas fait, tu pourrais avoir une trace de ton mdp dans de lifchier swap ... (vieille faille d'implémentation qu'on connus des grandes pointures comme openssl et pgp ...)

Posté : mer. 08 août 2007 08:12
par benzo
super ! :D merci sylvanie j'ai fait comme ca et ca fonctionne:

Code : Tout sélectionner

func lancer()

   $resultuser=GUICtrlRead ($user)
    $resultdomaine=GUICtrlRead ($domaine)
    $resultmdp=GUICtrlRead ($mdp)
 AutoItSetOption("RunErrorsFatal",0) 

While 1 
   runasset(@UserName,@LogonDomain,$resultmdp) 
run (@ScriptDir &"\util\programme.exe")
   If @error=1 Then  
msgbox(0,"Erreur, échec d'ouverture de session","nom d'utilisateur ou mot de passe incorrect")
exitloop
    EndIf 
   runasset() 
WEnd
merci à tous les 2 ! :wink: