[EXCEL/VBA] Masquer fenêtre DOS

Masquer fenêtre DOS [EXCEL/VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 28-06-2011 à 13:04:07    

Bonjour, je cherche désespérément comment masquer une fenêtre DOS pendant l'exécution de ma macro..
 

Code :
  1. Function Get_DNS_Name(ligne)
  2.     'On créer un Shell qui va lancer la commande nslookup :
  3.     Set objShell = CreateObject("WScript.Shell" )
  4.     Set objExec = objShell.Exec("nslookup " & Cells(ligne, 2).Value)
  5.    
  6.     'On garde seulement la partie qui nous intéresse, c'est à dire le nom d'hôte distant :
  7.     Cells(ligne, 3).Value = Split(Mid(objExec.StdOut.ReadAll, 65), ".xxx" )
  8.    
  9.     'On nettoie tout :
  10.     Set objExec = Nothing
  11.     Set objShell = Nothing
  12.  
  13. End Function


 
La fenêtre s'ouvre et se referme immédiatement en exécutant bien la fonction mais j'ai environ 500 lignes et donc c'est assez désagréable comme effet de clignotement..
 
Merci de votre aide !

Reply

Marsh Posté le 28-06-2011 à 13:04:07   

Reply

Marsh Posté le 28-06-2011 à 14:36:32    

Directement comme ca, pas possible.
Avec un Run oui, avec Exec non.
 
De mémoire, mais je ne garantis pas :
Tu vas dans le menu Démarrer, Accessoires
Click droit sur "Invite de commandes"
Dans l'onglet Raccourci, tu dois pouvoir dire de lancer les fenetres DOS en mode caché/réduit etc.


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 28-06-2011 à 14:43:22    

Merci de ta réponse ! La solution que tu me propose fonctionne effectivement mais je devrais réaliser la manip sur chaque pc et ce script va beaucoup se balader..
 
Saurais tu comment transformer mon code mais avec un Run et donc avec la possibilité de cacher ma fenêtre ?

Reply

Marsh Posté le 28-06-2011 à 14:54:38    

Pourquoi passes tu par des trucs vieux comme le monde ?
Lancer une commande nslookup pour recuperer le nom de la machine...
 
J'ai regardé ton fichier Excel, de diou comme tu te fais chier la vie !
Regarde du coté de WMI !
 
Regarde sur ce post que j'ai créé, comme je recupere :
IP
Carte reseau
Driver et version
http://forum.hardware.fr/hfr/Progr [...] m#t2085505
 

  • Donc par exemple, si tu veux le nom de la machine distante, à la ligne 18 de mon code tu rajoutes :
Code :
  1. Cells(ligne, 3).Value  = IPConfig.DNSHostName(Min)


  • Les DNS en colonne 4 et 5 :
Code :
  1. SrvDNS = IPConfig.DNSServerSearchOrder
  2.             Min = LBound(SrvDNS )
  3.             Max = UBound(SrvDNS )
  4.             CpteDNS = Max - Min + 1
  5.             If CpteDNS = 1 Then
  6.                 Cells(Ligne, 4) = SrvDNS (Min)
  7.             Else
  8.                 Cells(Ligne, 4) = SrvDNS (Min)
  9.                 Cells(Ligne, 5) = SrvDNS (Min)
  10.                
  11.             End If


  • Que sais-je encore... Le masque de sous reseau en colonne 6, la passerelle en colonne7, la macadresse en colonne8, savoir si le DHCP est activé ou pas en colonne9
Code :
  1. Cells(Ligne, 6) = IPConfig.IPSubnet(Min)
  2.             Cells(Ligne, 7) = IPConfig.DefaultIPGateway(Min)
  3.             Cells(Ligne, 8) = IPConfig.MACAddress(Min)
  4.             Cells(Ligne, 9) = IPConfig.DHCPEnabled


 
Etc.
 
Regarde mon code que j'ai donné sur l'autre topic et adapte ce que je viens de te donner.


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 28-06-2011 à 14:55:37    

Pourquoi sur chaque PC ??? De ce que j'ai vu de ton fichier Excel, tu devrais pouvoir le lancer de n'importe ou sur le reseau et recuperer les infos des ordis disants


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 28-06-2011 à 14:56:41    

D'accord merci je regarde tout ça et je te tien au courant ! :)
 
Edit : La manip de réduire la fenêtre DOS en allant dans accessoire je voulais dire.. Je devrais faire cela sur chaque PC or le fichier va aller sur beaucoup de PC et oui il marche sur n'importe quel ordi du réseau ^^


Message édité par SaW3r le 28-06-2011 à 14:58:05
Reply

Marsh Posté le 28-06-2011 à 14:59:57    

Et comme je suis super sympa... :whistle:
 
Voila pour ton code :

Code :
  1. Function Get_DNS_Name(ligne)
  2. On Error Resume Next
  3.  
  4. StrComputer = Cells(ligne, 2).Value
  5. UserName = "DOMAINE\Administrator"
  6. Password = "MotDepasse"
  7.  
  8. '***** Récupération du nom de la machine
  9. 'Ordinateur distant
  10.    Set SWBemlocator = CreateObject("WbemScripting.SWbemLocator" )
  11.    Set objWMIService = SWBemlocator.ConnectServer(StrComputer, "root\CIMV2", UserName, Password)
  12.    Set IPConfigSet = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE", , 48)
  13. 'Si ordinateur local, on doit utiliser une autre méthode n'incluant pas les users/mdp
  14.    If Err.Number <> 0 Then
  15.        Set IPConfigSet = GetObject("winmgmts:{impersonationLevel=impersonate}!//" & StrComputer).ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=TRUE" )
  16.    End If
  17.  
  18. 'On récupère en colonne3 le nom de la machine distante
  19.    For Each IPConfig In IPConfigSet
  20.        If IPConfig.IPAddress(Min) = StrComputer Then Cells(ligne, 3).Value = IPConfig.DNSHostName(Min)
  21.    Next
  22.  
  23. End Function


Message édité par SuppotDeSaTante le 28-06-2011 à 15:03:43

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 28-06-2011 à 15:06:56    

Waaah merci ! Mais je ne comprends pas, dès que je lance ton code excel plante immédiatement.. :s

Reply

Marsh Posté le 28-06-2011 à 15:10:05    

Ah bah faut peut etre adapter hein...
Forcément, le domaine, l'administrateur du domaine, et le mot de passe de l'admin ne sont pas les memes... (ligne 5 et 6)
 
Ca plante où ?


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 28-06-2011 à 15:14:51    

Et bien je l'ai adapté juste comme ceci :
 

Code :
  1. Sub Get_DNS_Name()
  2. For ligne = 2 To 10
  3. On Error Resume Next
  4. StrComputer = Cells(ligne, 1).Value 'Les IPs sont ici enfaite
  5. UserName = "addim.local\monlogin"
  6. Password = "monpass"
  7. '***** Récupération du nom de la machine
  8. 'Ordinateur distant
  9.     Set SWBemlocator = CreateObject("WbemScripting.SWbemLocator" )
  10.     Set objWMIService = SWBemlocator.ConnectServer(StrComputer, "root\CIMV2", UserName, Password)
  11.     Set IPConfigSet = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE", , 48)
  12. 'Si ordinateur local, on doit utiliser une autre méthode n'incluant pas les users/mdp
  13.     If Err.Number <> 0 Then
  14.         Set IPConfigSet = GetObject("winmgmts:{impersonationLevel=impersonate}!//" & StrComputer).ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=TRUE" )
  15.     End If
  16.     For Each IPConfig In IPConfigSet
  17.         If IPConfig.IPAddress(Min) = StrComputer Then Cells(ligne, 3).Value = IPConfig.DNSHostName(Min)
  18.     Next
  19. Next
  20. End Sub


 
En pas à pas détaillé il plante pas mais il devient lent à ces 2 lignes :
 

Code :
  1. Set IPConfigSet = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE", , 48)


 
ou
 

Code :
  1. Set IPConfigSet = GetObject("winmgmts:{impersonationLevel=impersonate}!//" & StrComputer).ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=TRUE" )

Reply

Marsh Posté le 28-06-2011 à 15:14:51   

Reply

Marsh Posté le 28-06-2011 à 15:20:52    

Normal qu'il devienne lent, il se connecte a la machine pour recuperer toutes les propriétés et méthodes de la classe NetworkAdapterConfiguration...
 
D'ailleurs, un peu de lecture : http://msdn.microsoft.com/en-us/li [...] s.85).aspx


Message édité par SuppotDeSaTante le 28-06-2011 à 15:21:33

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 28-06-2011 à 15:21:44    

Oui mais je ne suis pas admin local ni du réseau.. C'est surement cela nan ?

Reply

Marsh Posté le 28-06-2011 à 15:24:21    

Ah bah je vois pas comment tu vas pouvoir recuperer les DNS de postes distants par exemple...
 
Meme si tu n'es pas admin, si en Cells(ligne, 1) c'est ton ip de ta machine locale, ca devrait te retourner le nom de ta machine à toi.
 
Executer un script sur le reseau sans avoir de droits admin... Mouai...


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 28-06-2011 à 15:29:07    

Bon enfaite ça fonctionne en local seulement mais des que je m'attaque à un poste distant c'est mort.. Via le nslookup c'est possible en tout cas.. C'est bien dommage ton script est bien plus rapide !
 
Je vais essayer de faire avec un Run..
 
EDIT :
 
J'arrive bien à lancer avec un Run en caché mais.. je n'arrive pas à récupérer le résultat.. Sauf dans un fichier texte..  
 

Code :
  1. Set oshell = CreateObject("WScript.Shell" )
  2. oshell.Run "ping -n 1 -w 20 172.26.2.xxx > toto.txt", 0, True


Message édité par SaW3r le 28-06-2011 à 15:48:53
Reply

Marsh Posté le 28-06-2011 à 16:08:41    

Code :
  1. Sub toto()
  2. Set oshell = CreateObject("WScript.Shell" )
  3. oshell.Run "cmd /c ping -n 1 -w 20 172.26.2.xxx>toto.txt", 0, True
  4. Set objet_fso = CreateObject("Scripting.FileSystemObject" )
  5. Set objTextFile = objet_fso.OpenTextFile("toto.txt", 1)
  6. Do While objTextFile.AtEndOfStream <> True
  7.     strText = strText & objTextFile.ReadLine
  8.    
  9. Loop
  10. End Sub


 
Pourquoi tu ping ?
Utilises plutot nbtstat - a 172.26.2.xxx comme ca tu as le domaine, le nom de la machine, l'ip et la mac adress d'un seul coup...


Message édité par SuppotDeSaTante le 28-06-2011 à 16:09:39

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 28-06-2011 à 16:21:06    

Lorsque je tente d'utiliser cette commande il me dit :
 
"Impossible d'accéder au pilote NetBT--NetBT peut ne pas être chargé"
 
Un programme à démarrer je suppose ?
 
J'ai avancé sur le Run.. Voila :
 

Code :
  1. For lngRow = 2 To 10
  2.    
  3.     Dim err As Long
  4.    
  5.     Set oShell = CreateObject("WScript.Shell" )
  6.     err = oShell.Run("ping -n 1 -w 20 " & Cells(lngRow, 1).Value, 0, True)
  7.    
  8.     If err = 1 Then 'répond pas
  9.     For i = 1 To 2
  10.     Cells(lngRow, i).Font.Color = RGB(255, 0, 0) 'rouge
  11.     Next
  12.     Else 'répond
  13.     For i = 1 To 2
  14.     Cells(lngRow, i).Font.Color = RGB(0, 255, 0) 'vert
  15.     Next
  16.     End If
  17.    
  18. Next


 
On ne voit plus rien..

Message cité 1 fois
Message édité par SaW3r le 28-06-2011 à 16:23:20
Reply

Marsh Posté le 28-06-2011 à 16:56:56    

SaW3r a écrit :

Lorsque je tente d'utiliser cette commande il me dit :
 
"Impossible d'accéder au pilote NetBT--NetBT peut ne pas être chargé"
 
Un programme à démarrer je suppose ?
 


 
Problème de droit


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 30-06-2011 à 10:06:20    

Effectivement maintenant que j'ai les droits sur la machine je peux réaliser cette commande mais elle ne répond que très rarement.. Voire jamais.. Donc inutile malheureusement..
 
Mais tant pis, mon problème est résolus, la fenêtre s'affiche désormais en arrière plan comme je le voulais. Je laisse le code ça pourrait en aider certains on sait jamais :
 

Code :
  1. Function Get_DNS_Name(ligne, IP)
  2.  
  3.     'On créer un script qui va inscrire le résultat de la commande nslookup dans un fichier texte :
  4.     Set oShell = CreateObject("WScript.Shell" )
  5.     oShell.Run "cmd /c nslookup " & IP & ">dns.txt", 0, True 'Plus d'infos ici : http://msdn.microsoft.com/en-us/li [...] s.85).aspx
  6.     Set oShell = Nothing 'On nettoie
  7.    
  8.     'On ouvre et lit notre fichier texte créé précedemment :
  9.     Set FSO = CreateObject("Scripting.FileSystemObject" )
  10.     Set txtStr = FSO.OpenTextFile("dns.txt", 1)
  11.    
  12.     'On ignore les 2 premières lignes :
  13.     txtStr.SkipLine
  14.     txtStr.SkipLine
  15.     'On garde simplement le nom de l'hôte :
  16.     dns = Split((Mid(txtStr.Read(100), 12)), ".xxxx" ) 'remplacer xxxx par votre domaine
  17.    
  18.     'On l'écrit :
  19.     Cells(ligne, 3) = dns
  20.     'On ferme le fichier, on nettoie tout et on efface le fichier :
  21.     txtStr.Close
  22.     Set FSO = Nothing
  23.     Set txtStr = Nothing
  24.     Kill "dns.txt"
  25.    
  26.    
  27. End Function

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed