DNS query en VBS - VB/VBA/VBS - Programmation
Marsh Posté le 19-08-2008 à 10:56:32
Bonjour,
Ca fait plaisir de voir quelqu'un qui s'intéresse au VBS.
Le problème de l'ouverture fugitif de la fenêtre DOS peut être contourné en utilisant run au lieu de exec. C'est expliqué dans l'article http://www.microsoft.com/technet/s [...] x?mfr=true qui dit
Citation : In many respects, this makes the Exec method a better choice than the Run method. However, the Run method is still useful in a number of situations: |
Marsh Posté le 19-08-2008 à 12:17:37
olivthill a écrit : Bonjour,
|
Salut,
Eh oui, y'a encore des barrés qui font du bon vieux script vbs...
J'ai déjà examiné l'option "Run method"... malheureusement elle implique de passer par un fichier plat (passé à l'intérieur de la commande cmd via le redirecteur ">" ) et je ne dois pas ecrire quoi que ce soit sur la machine...
J'ai imaginé rediriger le stream resultat (les lignes retournées par la commande nslookup) dans un variable système que je n'aurais plus qu'a lire
genre "nslookup ... > set /p lookupresult="quelles infos ?""
mais ça ne marche pas terrible ...
genre même pas du tout.
parce que déjà stoker UN resultat dans une variable en "DOS" c'est bien dur, mais alors un stream ! ! !
Donc voilà ... point mort
Si tu as d'autres idées, même farfelues, je prend...
Marsh Posté le 19-08-2008 à 12:28:19
Je ne suis pas trés calé en vbs et surtout je ne vois pas à quoi ressemble un stream mais je fais une analogie avec le fait de ne pas pouvoir passer que des variables uni-dimesionnelles entre html et javascript.
Dans ce cas là, on peut utiliser la serialization, un exemple en vb ici : http://www.vb-helper.com/tut5.htm
Marsh Posté le 19-08-2008 à 09:02:07
Salut,
J'ai besoin de faire des requêtes de type "SRV" au DNS dans un vbscript...
Pour l'instant je fonctionne comme ceci :
Function GetSRVList(str_Request)
dim dic_Result
dim str_line, str_key, str_value
Set dic_Result = CreateObject("Scripting.Dictionary" )
dic_Result.RemoveAll
Set obj_WMIService = GetObject("winmgmts:\\.\root\cimv2" )
str_commandline = "cmd /c nslookup -querytype=SRV " & str_service & "." & str_domain
set obj_MSShellExec = obj_MSShell.Exec(str_commandline)
While Not obj_MSShellExec.StdOut.AtEndOfStream
str_Line = lcase(obj_MSShellExec.StdOut.ReadLine)
If InStr(1, str_Line, "svr hostname" ) > 0 Then
str_key = GetRight(str_Line, " = " )
str_value = GetRight(str_Line, " = " )
dic_Result.Add str_key, str_value
End If
Wend
For each str_server in dic_Result.Keys
AddSRVList str_server
wmi_PingQuery = "Select * From Win32_PingStatus Where Address = '" & str_server & "'"
Set objPing = obj_WMIService.ExecQuery(wmi_PingQuery)
For Each objStatus in objPing
If IsNull(objStatus.StatusCode) Or objStatus.Statuscode<>0 Then
dic_Result.Item(str_server) = "Computer is Unreachable!"
Else
dic_Result.Item(str_server) = objStatus.ProtocolAddress
End If
Next
Next
Set GetSRVList = dic_Result
End Function
La fonction marche parfaitement, on lui passe en paramètre le nom du service (_ldap._tcp.dc._msdcs.roudoudou.lan par exemple), elle retourne un dictionnaire contenant les noms des serveurs et leurs adresses.
Sauf que ... c'est môôôôôôôche
L'appel à wscript.shell.execute (pour appeler nslookup et en lire le résultat) fait apparaitre une vilaine fenetre noire, très peu de temps mais quand même ... on la voit, et c'est très laid.
Donc je cherche une méthode plus subtile d'interoger le DNS...
Je n'ai rien trouvé en WMI qui fasse ça (sauf si l'on est directement sur le serveur DNS : <<GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\MicrosoftDNS" )>> ne marche pas sur un poste client).
Je suppose que la fonction est disponible dans dnsapi.dll ou windns.dll, mais je n'ai pas la moindre idée de comment faire pour intéroger ces bestiolles là ...
Une idée ?
---------------
Mieux vaut fermer sa gueule et passer pour un con, plutot que de l'ouvrir, et montrer qu'on l'est...