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

VBScript Discussion :

Récupérer les infos DNS de machines distantes par VBS


Sujet :

VBScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut Récupérer les infos DNS de machines distantes par VBS
    Bonjour à tous,

    Je sollicite votre aide pour un script que je n'arrive pas à développer (faut dire que mes compétences sont plus que maigres)
    Objectif : récupérer sous forme d'un fichier csv (séparateur virgule), des infos relatives aux DNS de plusieurs machines distantes
    Format fichier cible : NomOrdi,Adresse IP,DHCP(Y/N),DNS1,DNS2,DNS3,SuffixDNS1, SuffixDNS2,SuffixDNS3,SuffixDNS4,...SuffixDNSn,

    Explications :
    Dans un fichier externe (machinelist.txt), il y a une liste de machine avec leur nom FQDN sur lesquelles je souhaite récupérer ces infos
    Il y a donc une boucle itérative et pour chaque machine, un certain nombre de requêtes WMI
    Même s'il y a plus de 3 serveurs DNS qui sont paramétrés, je ne veux récupérer que les 3 premiers, par contre, je veux récupérer la totalité de tous les suffixes DNS (raison pour laquelle je les mets à la fin de chaque ligne de mon fichier csv)

    J'ai donc un script qui fonctionne en partie, mais j'ai beaucoup de soucis (il y a plus de colonnes que ce que je souhaite mais c'est pas grave, c'est parce que je l'ai récupéré d'un autre endroit)

    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
    On Error resume next
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set InputFile = fso.OpenTextFile("MachineList.Txt")
    Do While Not (InputFile.atEndOfStream)
    	strComputer = InputFile.ReadLine
     
    	Set objWMIService = GetObject("winmgmts:" & "!\\" & strComputer & "\root\cimv2")
    	Set colAdapters = objWMIService.ExecQuery _
    	("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled = True")
    	For Each objAdapter in colAdapters
    		strIP = strIP & "Host name: ;" & objAdapter.DNSHostName & vbtab
    		strIP = strIP & "DNS domain: ;" & objAdapter.DNSDomain & vbtab
    		'strIP = strIP & "DNS suffix search list: " & objAdapter.DNSDomainSuffixSearchOrder & vbtab
    		strIP = strIP & "Description: ;" & objAdapter.Description & vbtab
    		strIP = strIP & "Physical address: ;" & objAdapter.MACAddress & vbtab
    		strIP = strIP & "DHCP enabled: ;" & objAdapter.DHCPEnabled & vbtab
    		If Not IsNull(objAdapter.IPAddress) Then
    			For i = LBound(objAdapter.IPAddress) To UBound(objAdapter.IPAddress)
    				strIP = strIP & "IP address: ;" & Join(objAdapter.IpAddress) & vbtab
    			Next
    		End If
    		If Not IsNull(objAdapter.IPSubnet) Then
    			For i = LBound(objAdapter.IPSubnet) To UBound(objAdapter.IPSubnet)
    				strIP = strIP & "Subnet: ;" & objAdapter.IPSubnet(i) & vbtab
    			Next
    		End If
    		If Not IsNull(objAdapter.DefaultIPGateway) Then
    			For i = LBound(objAdapter.DefaultIPGateway) To UBound(objAdapter.DefaultIPGateway)
    				strIP = strIP & "Default gateway: ;" & objAdapter.DefaultIPGateway(i) & vbtab
    			Next
    		End If
    		strIP = strIP & "DHCP server: ;" & objAdapter.DHCPServer & vbtab
    		If Not IsNull(objAdapter.DNSServerSearchOrder) Then
    			For i = LBound(objAdapter.DNSServerSearchOrder) To UBound(objAdapter.DNSServerSearchOrder)
    				strIP = strIP & "DNS server: ;" & objAdapter.DNSServerSearchOrder(i) & vbtab
    			Next	
    		End If
    		'strIP = strIP & "Primary WINS server: " & objAdapter.WINSPrimaryServer & vbtab
    		'strIP = strIP & "Secondary WINS server: " & objAdapter.WINSSecondaryServer & vbtab
    		strIP = strIP & "Lease obtained: ;" & objAdapter.DHCPLeaseObtained & vbtab
    		strIP = strIP & "Lease expires: ;" & objAdapter.DHCPLeaseExpires & vbtab
    		strIP = strIP & vbcrlf 
    	Next
    Loop
    Set oFS = CreateObject("Scripting.FileSystemObject")
    Set strLogFile = oFS.OpenTextFile("c:\" & output & "output.csv",8,True)
    strLogFile.WriteLine strIP
    strLogFile.Close 
    Wscript.echo done
    Plusieurs problèmes :
    - si l'ordinateur a plusieurs interfaces réseau, il me faut plusieurs lignes ce qui n'est pas pris en compte par le script je crois (pas pu tester pour le moment)
    - de mes essais, il semble que la méthode objAdapter.WINSPrimaryServer me renvoie systématiquement un blanc quand j'interroge un OS de type serveur, alors que je récupère bien l'IP avec un O.S. de type workstation
    - je ne sais pas encore comment récupérer la liste complète des suffixes DNS (séparé par une virgule)
    - si l'ordinateur ne peut être joint ou que les droits pour récupérer ces infos ne sont pas suffisant, il faudra que je puisse avoir au niveau de l'IP quelque chose du genre "ERROR" (alors que pour le moment, j'ai la même ligne qui sera répété)
    - de manière générale, je pense qu'il serait probablement mieux aussi d'écrire dans le fichier de sortie après chaque ligne et non pas de tout concaténer dans une gigantesque chaîne de caractères qui est flushée à la toute fin de programme

    Voilà, dîtes-moi ce que vous en pensez et si vous pouvez m'aider, ce serait top moumoute
    Par avance merci

  2. #2
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Personne ?

  3. #3
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 420
    Par défaut
    Il y a 2 choses que je n'arrive pas à comprendre si tu dis que le script fonctionne bien jusqu'à une certaine limite :
    - A la fin du script tu écris :Set strLogFile = oFS.OpenTextFile("c:\" & output & "output.csv",8,True) or output(sans guillemets) n'est défini nulle part donc pas de fichier csv créé sauf miracle et il n'y en a plus de notre temps.
    - La ligne 49 devrait être : Wscript.echo "done" avec guillemets pour done.

    Pour cette raison, j'ai toujours conseillé d'utiliser la clause Option Explicit permettant de résoudre pas mal d'incohérences.
    si l'ordinateur a plusieurs interfaces réseau...
    Normalement, le script doit retourner tout ce qui concerne un ordinateur donné car l'instruction For Each objAdapter in colAdapters concerne toute interface réseau présente sur un PC.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  4. #4
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Eh bien en tout cas, le fichier csv se créé sans soucis

    Les soucis que je rencontre sont expliqués dans le texte, je ne vois pas bien ce que je peux dire d'autre :

    - les IP des serveurs DNS dans le cas d'un O.S. de type server ne commencent pas à la bonne colonne
    - je ne sais pas comment récupérer la liste complète des suffix DNS dont j'ai vraiment besoin

    Je prends bonne note pour l'option Explicit en tout cas
    Merci

  5. #5
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 420
    Par défaut
    Eh bien en tout cas, le fichier csv se créé sans soucis
    Tout simplement parce que output est pris comme une chaîne vide d'ailleurs le fichier sera créé à la racine du lecteur C.
    J'ai apporté des modification au script, mais il ne faut pas oublier que quelques fonctionnalités de WMI sont disponibles pour certaines plateformes et pas pour d'autres: entre autres ce qui est disponible pour Vista, W7 ou W8 ne l'est pas forcément pour XP....
    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
    61
    62
    63
    Option Explicit
     Dim fso, InpuFile, strComputer, objWMIService, colAdapters, strIP, strLogFile, objAdapter, InputFile, i, Ret
     
    'On Error resume next
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set InputFile = fso.OpenTextFile("MachineList.Txt")
    Set strLogFile = fso.OpenTextFile("C:\Output.csv",8,True)
    Do While Not (InputFile.atEndOfStream)
        strComputer = InputFile.ReadLine
       Ret = ""
       strIP = "" 'Initialisation de la chaîne
        Set objWMIService = GetObject("winmgmts:" & "!\\" & strComputer & "\root\cimv2")
        Set colAdapters = objWMIService.ExecQuery _
        ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")
        For Each objAdapter in colAdapters
            strIP = strIP & "Host name: ;" & objAdapter.DNSHostName & ";" & vbtab ' <= un point-virgule(;) est nécessaire avant le vbtab
                                                                                  ' pour passer à la cellule suivante ainsi que dans les
                                                                                                         ' lignes suivantes
            strIP = strIP & "DNS domain: ;" & objAdapter.DNSDomain & ";" & vbtab
            If Not IsNull(objAdapter.DNSDomainSuffixSearchOrder) Then
              strIP = strIP & "DNS suffix search list: ;" & Join(objAdapter.DNSDomainSuffixSearchOrder) & ";" & vbtab ' Utilise Join(cette valeur dépend de l'OS)
            End If
            strIP = strIP & "Description: ;" & objAdapter.Description & ";" & vbtab
            strIP = strIP & "Physical address: ;" & objAdapter.MACAddress & ";" & vbtab
            strIP = strIP & "DHCP enabled: ;" & objAdapter.DHCPEnabled & ";" & vbtab
            If Not IsNull(objAdapter.IPAddress) Then
                'For i = LBound(objAdapter.IPAddress) To UBound(objAdapter.IPAddress)
                    Ret =  Join(objAdapter.IpAddress) '& ";" & vbtab
                'Next
                strIP = strIP & "IP address: ;" & Ret & ";" & vbtab
            End If
            If Not IsNull(objAdapter.IPSubnet) Then
                'For i = LBound(objAdapter.IPSubnet) To UBound(objAdapter.IPSubnet)
                    strIP = strIP & "Subnet: ;" & Join(objAdapter.IPSubnet) & ";" & vbtab
                'Next
            End If
            If Not IsNull(objAdapter.DefaultIPGateway) Then
                'For i = LBound(objAdapter.DefaultIPGateway) To UBound(objAdapter.DefaultIPGateway)
                    strIP = strIP & "Default gateway: ;" & Join(objAdapter.DefaultIPGateway) & ";" & vbtab
                'Next
            End If
            strIP = strIP & "DHCP server: ;" & objAdapter.DHCPServer & ";" & vbtab
            If Not IsNull(objAdapter.DNSServerSearchOrder) Then
        '        For i = LBound(objAdapter.DNSServerSearchOrder) To UBound(objAdapter.DNSServerSearchOrder)
                    strIP = strIP & "DNS server: ;" & objAdapter.DNSServerSearchOrder(i) & ";" & vbtab
        '        Next    
            End If
            strIP = strIP & "Primary WINS server: ;" & objAdapter.WINSPrimaryServer & ";" & vbtab      ' disponible sur certains OS Windows pas tous
            strIP = strIP & "Secondary WINS server: ;" & objAdapter.WINSSecondaryServer & ";" & vbtab  ' disponible sur certains OS Windows pas tous
            strIP = strIP & "Lease obtained: ;" & objAdapter.DHCPLeaseObtained & ";" & vbtab
            strIP = strIP & "Lease expires: ;" & objAdapter.DHCPLeaseExpires & ";" & vbtab
            'strIP = strIP & vbcrlf ' <== Pas besoin du retour à la ligne car on écrit le résultat directement
                                    '   dans le fichier ligne par ligne
            strLogFile.WriteLine strIP ' On écrit ligne par ligne le contenu de strIP
            strIp = "" ' réinitialisation à une chaîne vide après écriture dans le fichier
        Next
    Loop
    'Set fso = CreateObject("Scripting.FileSystemObject")
    'Set strLogFile = fso.OpenTextFile("c:\Output.csv",8,True)
    'strLogFile.WriteLine strIP
    strLogFile.Close 
    InputFile.Close
    Wscript.echo "Done"
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  6. #6
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Merci beaucoup, je teste ça dès la semaine prochaine à mon boulot

    Tite question subsidiaire, le remarque concernant le "Join" là, ça veut dire quoi ? (désolé hein je suis vraiment une buse en programmation)

Discussions similaires

  1. Récupérer les infos du panier du tutoriel par mail
    Par aurenge dans le forum Langage
    Réponses: 4
    Dernier message: 27/09/2011, 21h35
  2. Réponses: 5
    Dernier message: 26/12/2007, 12h51
  3. Delphi - récupérer les infos d'un utilisateur
    Par jlf dans le forum Débuter
    Réponses: 2
    Dernier message: 26/06/2004, 11h34
  4. Récupérer les infos sur un fichier audio
    Par Halleck dans le forum Windows
    Réponses: 13
    Dernier message: 17/04/2004, 18h39
  5. Réponses: 6
    Dernier message: 23/12/2003, 15h30

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