IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Lancer un exe en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 36
    Points : 19
    Points
    19
    Par défaut Lancer un exe en VBA
    Bonjour,

    Je possède une form avec des boutons, et l'un des boutons doit ouvrir l'invite de commande, cependant je souhaite que cette dernière soit lancée avec un autre nom d'utilisateur (situé sur un autre domaine), j'ai trouvé une portion de code permettant d'ouvrir l'invite de commande mais cette dernière ouvre l'invite de commande avec les droits de la session actuellement ouverte.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shell ("C:\Windows\System32\cmd.exe")
    Si cela est possible, est-il également possible de pré-renseigner le nom de domaine et le login utilisateur (avec une variable d'environnement à la limite)?

    Cordialement.

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    mais cette dernière ouvre l'invite de commande avec les droits de la session actuellement ouverte.
    Encore heureux !
    Je ne vois là aucune raison de se plaindre de ce comportement, hein ...

    Soyons sérieux : chaque utilisateur est seul maître de SA machine et donc seul à décider de laisser ou non "passer" ceci ou cela.

    Ta ligne de code, par exemple, se heurterait sur Ma machine à un rejet pur et simple, sauf si JE décidais moi-même (et alors expressément et manuellement) de "laisser passer".
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Je ne me plains pas de ce qu'exécute la fonction car il est normal qu'elle ouvre l'exe avec les droits de la session ouverte.

    En revanche je souhaite savoir si il existe un dérivé de cette fonction qui propose plus d'arguments, permettant ainsi d'ouvrir un exe avec un compte sur un domaine différent.

    J'ai fouillé sur le net mais je n'ai pas trouvé de telles fonctions.

    Cordialement.

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Cela va beaucoup plus loin que tu le crois (et heureusement également). Et le fait d'être sur un compte administrateur ne suffit pas toujours. Il y a un distinguo (heureux) entre exécuter depuis un compte administrateur et exécuter "en tant qu'administrateur". Et exécuter "en tant qu'administrateur" ne peut (relire mon message précédent) qu'être une décision de l'utilisateur et non l'exécution d'une ligne de code !
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    Bonjour,

    intéresse toi à la commande RunAs. un Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shell ("runas user:<NomOrdinateurLocal>\Administrateur C:\Windows\System32\cmd.exe")
    Pour plus d'info vas voir ici

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour Phil
    Et qui (et qui seul) peut autoriser l'exécution d'une telle ligne de code ?
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Si le code n'est pas crypté, et je ne parle pas d'Excel bien évidement....!!!???###@@@

    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
    51
    52
    53
    54
    Public Declare Function LogonUser Lib "advapi32" Alias "LogonUserA" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, phToken As Long) As Long
    Declare Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
    Declare Function RevertToSelf Lib "advapi32.dll" () As Long
    Enum MConst
        LOGON32_LOGON_INTERACTIVE = 2
        LOGON32_PROVIDER_DEFAULT = 0
    End Enum
    Public lngTokenHandle, lngLogonType, lngLogonProvider As Long
    Public blnResult As Boolean
     
     
    Sub TEST()
     If AdminLogOn("Username", "Domain", "Password") Then
        Shell "C:\Windows\System32\calc.exe"
        Shell "C:\Windows\system32\notepad.exe"
     Logoff
     End If
    End Sub
     
     
    Public Function AdminLogOn(Username, Domain, Password) As Boolean
    blnResult = RevertToSelf()
    If LogonUser( _
    Username, _
    Domain, _
    Password, _
              LOGON32_LOGON_INTERACTIVE, _
             LOGON32_PROVIDER_DEFAULT, _
                lngTokenHandle) = 0 Then
        MsgBox "Impossible d'ouvrir la session : " & Username & ". "
        GoTo Fin
    End If
     
     
     
     
    If blnResult = False Then
        MsgBox "Impossible d'ouvrir LogonUser"
       GoTo Fin
    End If
     
     
    blnResult = ImpersonateLoggedOnUser(lngTokenHandle)
    AdminLogOn = True: Exit Function
     
     
    Fin:
    AdminLogOn = False
    End Function
    Public Sub Logoff()
    Dim blnResult As Boolean
    'MsgBox "Session fermée"
    blnResult = RevertToSelf()
    End Sub

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Bonjour Phil Free,

    Je viens de tester ta méthode et cela fonctionne nickel

    Ma commande se lance bien avec le compte que je lui spécifie.

    Par contre j'ai essayé de lancer sur le même principe l'éditeur de registre mais le résultat est légèrement différent, j'ai bien une fenêtre DOS qui s’ouvre pour me demander mon mot de passe, mais après rien ne se passe, l'éditeur ne s'ouvre pas.
    Je pense avoir une idée mais je ne suis pas sur de moi, quand je lance le runas, ce dernier se lance depuis C:\Windows\System32 (cf la capture d'écran).

    Nom : Sans titre.png
Affichages : 3866
Taille : 23,7 Ko

    Ce qui expliquerai que la cmd se soit bien lancée mais pas le regedit.

    Avez vous une idée pour contourner le problème?

  9. #9
    Invité
    Invité(e)
    Par défaut
    au poste #7 je te propose que tout soit encapsuler dans une nouvelle session Windows!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub TEST() If AdminLogOn("Username", "Domain", InputBox("test")) Then
        Shell "C:\Windows\System32\calc.exe"
        Shell "C:\Windows\system32\notepad.exe"
     Logoff
     End If
    End Sub

  10. #10
    Membre à l'essai
    Inscrit en
    Septembre 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Alors j'ai essayé votre méthode cependant j'ai l'erreur suivante :

    Nom : Capture.PNG
Affichages : 3884
Taille : 19,2 Ko

    J'ai cette erreur la ligne Public Declare Function LogonUser Lib "advapi32" Alias "LogonUserA" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, phToken As Long) As Long.

    A savoir que je code sur une userform et que j'ai mis tout votre code au tout début. une idée de ce qui bloque? ;(

    Cordialement.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    regarde les directive de compilations #if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #If win64 Then
        Declare PtrSafe  Function LogonUser Lib "advapi32" Alias "LogonUserA" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, phToken As Long) As Long
        Declare PtrSafe  ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
        Declare PtrSafe  RevertToSelf Lib "advapi32.dll" () As Long
    #Else
        Public Declare Function LogonUser Lib "advapi32" Alias "LogonUserA" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, phToken As Long) As Long
        Declare Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
        Declare Function RevertToSelf Lib "advapi32.dll" () As Long
    #End If

  12. #12
    Membre à l'essai
    Inscrit en
    Septembre 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    j'ai la même erreur pour la même ligne le else :/

    Désolé je suis pas très calé en code :/

  13. #13
    Invité
    Invité(e)
    Par défaut
    et si tu exécute la macro car là c'est normale, c'est pour cela que on utilise les directive de compilations!

  14. #14
    Membre à l'essai
    Inscrit en
    Septembre 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Justement,

    C'est au moment où je lance la macro qu'il me retourne cette erreur.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #If VBA7 Then
        Declare PtrSafe  Function LogonUser Lib "advapi32" Alias "LogonUserA" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, phToken As Long) As Long
        Declare PtrSafe  ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
        Declare PtrSafe  RevertToSelf Lib "advapi32.dll" () As Long
    #Else
        Public Declare Function LogonUser Lib "advapi32" Alias "LogonUserA" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, phToken As Long) As Long
        Declare Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
        Declare Function RevertToSelf Lib "advapi32.dll" () As Long
    #End If

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    en relisant ce post je me demande quel peut être l’intérêt d'ouvrir regedit en ligne de commande puisque en suite il faudra que l'utilisateur bidouille de lui même la base de registre. Ce qui est plutôt déconseille.

    Si ton besoin est de modifier la base de registre il est tout à fait possible de le faire directement en passant pas un objet WScript.Shell.

  17. #17
    Membre à l'essai
    Inscrit en
    Septembre 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    @dysorthographie
    La il me met l'erreur :

    Nom : Capture.PNG
Affichages : 3930
Taille : 27,5 Ko

    @Phil Free
    C'est dans le contexte mon travail, de base, l’ouverture du registre est bloqué, nous devons l'ouvrir avec un compte admin pour pouvoir le lancer (politique de sécurité). Sur ce point nous avons les comptes pour.

    Ta méthode fonctionne très bien pour l'invite de commande, en revanche, pour le registre elle ne fonctionne pas. J'ai bien une fenêtre dos qui s'ouvre et qui me demande le mot de passe, mais une fois que je valide mon mot de passe, rien ne se passe, comme si le mot de passe était incorrecte, j'ai donc essayé d'ouvrir un autre exe qui se situe dans le même dossier que regedit.exe (genre notepad.exe), et la ça fonctionne correctement. Je ne sais pas ce qui bloque l'ouverture du registre.

    J'ai même testé avec un autre exe qui se trouve dans program files :
    Shell ("C:\Program Files (x86)\XXX\XXX\XXXX.exe") => le programme se lance correctement mais sans droit admin du coup
    Shell ("runas /user:XXX\adm-" & nom_user & " C:\Program Files (x86)\XXX\XXX\XXXX.exe) => rien ne se passe, même pas d'invite pour rentrer le mot de passe, alors que quand je fais ouvrir en tant que après un clic, tout fonctionne correctement.

    J'ai du mal a comprendre pourquoi cela ne fonctionne pa ssu rle registre (au début je pensais à un problème d'emplacement mais au final non vu pour le notepad ça marche). Et pourquoi ma seconde commande ne fonctionne pas en admin alors qu'elle fonctionne dans le premier cas...

  18. #18
    Invité
    Invité(e)
    Par défaut
    voila le code en entier!
    exécutes sub teste en modifiant les paramètres AdminLogOn("Username", "Domain", "Password")
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #If VBA7 Then
        Declare PtrSafe  Function LogonUser Lib "advapi32" Alias "LogonUserA" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, phToken As Long) As Long
        Declare PtrSafe  ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
        Declare PtrSafe  RevertToSelf Lib "advapi32.dll" () As Long
    #Else
        Public Declare Function LogonUser Lib "advapi32" Alias "LogonUserA" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, phToken As Long) As Long
        Declare Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
        Declare Function RevertToSelf Lib "advapi32.dll" () As Long
    #End If
    Enum MConst
        LOGON32_LOGON_INTERACTIVE = 2
        LOGON32_PROVIDER_DEFAULT = 0
    End Enum
    Public lngTokenHandle, lngLogonType, lngLogonProvider As Long
    Public blnResult As Boolean
     
     
    Sub TEST()
     If AdminLogOn("Username", "Domain", "Password") Then
        Shell "C:\Windows\System32\calc.exe"
        Shell "C:\Windows\system32\notepad.exe"
     Logoff
     End If
    End Sub
     
     
    Public Function AdminLogOn(Username, Domain, Password) As Boolean
    blnResult = RevertToSelf()
    If LogonUser( _
    Username, _
    Domain, _
    Password, _
              LOGON32_LOGON_INTERACTIVE, _
             LOGON32_PROVIDER_DEFAULT, _
                lngTokenHandle) = 0 Then
        MsgBox "Impossible d'ouvrir la session : " & Username & ". "
        GoTo Fin
    End If
     
     
     
     
    If blnResult = False Then
        MsgBox "Impossible d'ouvrir LogonUser"
       GoTo Fin
    End If
     
     
    blnResult = ImpersonateLoggedOnUser(lngTokenHandle)
    AdminLogOn = True: Exit Function
     
     
    Fin:
    AdminLogOn = False
    End Function
    Public Sub Logoff()
    Dim blnResult As Boolean
    'MsgBox "Session fermée"
    blnResult = RevertToSelf()
    End Sub

  19. #19
    Membre à l'essai
    Inscrit en
    Septembre 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Il me met la même erreur, alors que j'ai repris un nouveau projet pour tester ;(

  20. #20
    Invité
    Invité(e)
    Par défaut
    désolé!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #If VBA7 Then 
        Declare PtrSafe Function LogonUser Lib "advapi32" Alias "LogonUserA" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, phToken As Long) As Long
        Declare PtrSafe Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
        Declare PtrSafe Function RevertToSelf Lib "advapi32.dll" () As Long
    #Else
        Public Declare Function LogonUser Lib "advapi32" Alias "LogonUserA" (ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, phToken As Long) As Long
        Declare Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
        Declare Function RevertToSelf Lib "advapi32.dll" () As Long
    #End If

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [FreePascal] Lancer un exe
    Par Ultraboss dans le forum Free Pascal
    Réponses: 4
    Dernier message: 02/11/2005, 19h03
  2. Réponses: 7
    Dernier message: 10/10/2005, 18h54
  3. [VS .NET] Comment lancer un .exe
    Par lastcheper dans le forum MFC
    Réponses: 2
    Dernier message: 31/08/2005, 15h38
  4. [Flash MX2004] Lancer un *.exe avec fscommand
    Par pioup dans le forum Flash
    Réponses: 7
    Dernier message: 30/07/2004, 16h28
  5. [Debutant(e)]Lancer un exe en ligne de commande
    Par MASSAKA dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 18/05/2004, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo