Solved

Script nslookup results to output file

Posted on 2007-03-22
3
3,668 Views
Last Modified: 2012-06-21
I am trying to edit a vbscript to input a txt file list of ipaddresses to nslookup and output the computernames into a file. My code is almost there but still not working right. It inputs the ipaddresses but returns the same ipaddresses not the computer names. It also creates a new file for each ipaddress. I would like the results to append all to one file. Any help is appreciated. Here is my code:

Const ForReading = 1
Const ForAppending = 2


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile ("listofIPAddresses.txt", ForReading)


Do Until objTextFile.AtEndOfStream


   strIPAddress = objTextFile.Readline
   If strIPAddress <> "" Then


     If IsConnectible(strIPAddress, "", "") Then
       

       strComputerName = NSlookup(strIPAddress)
       If strComputerName = "" Then
         strComputerName = strIPAddress
       End If


       Set objLogFile = objFSO.CreateTextFile _
           (strComputerName & ".csv", ForWriting, True)
      


             objLogFile.Write strComputerName
      'objLogFile.Write nslookupvalue
       objLogFile.Close


     Else
       ' here you might want to report somewhere else that the script was
       ' not able to connect to the computer
       WScript.Echo "Could not connect to IP address " & strIPAddress
     End If


   End If
Loop


objTextFile.Close
wscript.echo "files are done"


Function IsConnectible(sHost, iPings, iTO)
   ' Returns True or False based on the output from ping.exe
   '
   ' Author: Alex Angelopoulos/Torgeir Bakken
   ' Works an "all" WSH versions
   ' sHost is a hostname or IP
   ' iPings is number of ping attempts
   ' iTO is timeout in milliseconds
   ' if values are set to "", then defaults below used


   Const OpenAsASCII      =  0
   Const FailIfNotExist   =  0
   Const ForReading       =  1
   Dim oShell, oFSO, sTempFile, fFile


   If iPings = "" Then iPings = 2
   If iTO = "" Then iTO = 750


   Set oShell = CreateObject("WScript.Shell")
   Set oFSO = CreateObject("Scripting.FileSystemObject")


   sTempFile = oFSO.GetSpecialFolder(2).ShortPath & "\" & oFSO.GetTempName


   oShell.Run "%comspec% /c ping.exe -n " & iPings & " -w " & iTO _
      & " " & sHost & ">" & sTempFile, 0 , True


   Set fFile = oFSO.OpenTextFile(sTempFile, ForReading, _
                                     FailIfNotExist, OpenAsASCII)


   sResults = fFile.ReadAll
   fFile.Close
   oFSO.DeleteFile(sTempFile)
   IsConnectible = CBool(InStr(sResults, "TTL="))


End Function



Function NSlookup(sHost)
   ' Both IP address and DNS name is allowed
   ' Function will return the opposite


   Set oRE = New RegExp
   oRE.Pattern = "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"
   bInpIP = False
   If oRE.Test(sHost) Then
     bInpIP = True
   End If


   Set oShell = CreateObject("Wscript.Shell")
   Set oFS = CreateObject("Scripting.FileSystemObject")


   sTemp = oShell.ExpandEnvironmentStrings("%TEMP%")
   sTempFile = sTemp & "\" & oFS.GetTempName


   'Run NSLookup via Command Prompt
   'Dump results into a temp text file
   oShell.Run "%ComSpec% /c nslookup.exe " & sHost _
       & " >" & sTempFile, 0, True


   'Open the temp Text File and Read out the Data
   Set oTF = oFS.OpenTextFile(sTempFile)


   'Parse the text file
   Do While Not oTF.AtEndOfStream
     sLine = Trim(oTF.Readline)
     If LCase(Left(sLine, 5)) = "name:" Then
       sData = Trim(Mid(sLine, 6))
       If Not bInpIP Then
         'Next line will be IP address(es)
         'Line can be prefixed with "Address:" or "Addresses":
         aLine = Split(oTF.Readline, ":")
         sData = Trim(aLine(1))
       End If
       Exit Do
     End If
   Loop


   'Close it
   oTF.Close
   'Delete It
   oFS.DeleteFile sTempFile


   If Lcase(TypeName(sData)) = LCase("Empty") Then
     NSlookup = ""
   Else
     NSlookup = sData
   End If
End Function
0
Comment
Question by:snsuser
  • 2
3 Comments
 
LVL 67

Accepted Solution

by:
sirbounty earned 250 total points
ID: 18777339
Here's the only things I found - other than this, your script seems to work..

Your constants are not correct, modify them like this:
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8

The only other piece needed to make it an appendable file was this:

strOutput="C:\NS_Report.txt"
If objfso.FileExists(strOutput) Then
  Set objLogFile = objfso.OpenTextFile (strOutput, ForAppending)
Else
  Set objLogFile = objfso.CreateTextFile(strOutput, ForWriting, True)
End If
0
 

Author Comment

by:snsuser
ID: 18778824
I am just getting an empty NS_Report.txt output file. I dont think my function for nslookup is working either. Even with the original script I was only getting the ip address repeated again not the computer name?
I updated the script as commented but still having problems. The output file is blank.

Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile ("listofIPAddresses.txt", ForReading)


Do Until objTextFile.AtEndOfStream


   strIPAddress = objTextFile.Readline
   If strIPAddress <> "" Then


     If IsConnectible(strIPAddress, "", "") Then
       

       strComputerName = NSlookup(strIPAddress)
       If strComputerName = "" Then
         strComputerName = strIPAddress
       End If


       'Set objLogFile = objFSO.CreateTextFile _
           '(strComputerName & ".csv", ForWriting, True)
      
      'Set objLogFile = objFSO.CreateTextFile _
           '(nslookupvalue & ".csv", ForWriting, True)

       'Set objFSO = CreateObject("Scripting.FileSystemObject")
       'Set objLogFile = objFSO.CreateTextFile(nslookupvalue & ".csv", ForWriting, True)



             'objLogFile.Write strComputerName
      'objLogFile.Write nslookupvalue
       'objLogFile.Close

      strOutput="C:\NS_Report.txt"
If objfso.FileExists(strOutput) Then
  Set objLogFile = objfso.OpenTextFile (strOutput, ForAppending)
Else
  Set objLogFile = objfso.CreateTextFile(strOutput, ForWriting, True)
End If

     Else
       ' here you might want to report somewhere else that the script was
       ' not able to connect to the computer
       WScript.Echo "Could not connect to IP address " & strIPAddress
     End If


   End If
Loop


objTextFile.Close
wscript.echo "files are done"


Function IsConnectible(sHost, iPings, iTO)
   ' Returns True or False based on the output from ping.exe
   '
   ' Author: Alex Angelopoulos/Torgeir Bakken
   ' Works an "all" WSH versions
   ' sHost is a hostname or IP
   ' iPings is number of ping attempts
   ' iTO is timeout in milliseconds
   ' if values are set to "", then defaults below used


   Const OpenAsASCII      =  0
   Const FailIfNotExist   =  0
   Const ForReading       =  1
   Dim oShell, oFSO, sTempFile, fFile


   If iPings = "" Then iPings = 2
   If iTO = "" Then iTO = 750


   Set oShell = CreateObject("WScript.Shell")
   Set oFSO = CreateObject("Scripting.FileSystemObject")


   sTempFile = oFSO.GetSpecialFolder(2).ShortPath & "\" & oFSO.GetTempName


   oShell.Run "%comspec% /c ping.exe -n " & iPings & " -w " & iTO _
      & " " & sHost & ">" & sTempFile, 0 , True


   Set fFile = oFSO.OpenTextFile(sTempFile, ForReading, _
                                     FailIfNotExist, OpenAsASCII)


   sResults = fFile.ReadAll
   fFile.Close
   oFSO.DeleteFile(sTempFile)
   IsConnectible = CBool(InStr(sResults, "TTL="))


End Function



Function NSlookup(sHost)
   ' Both IP address and DNS name is allowed
   ' Function will return the opposite


   Set oRE = New RegExp
   oRE.Pattern = "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"
   bInpIP = False
   If oRE.Test(sHost) Then
     bInpIP = True
   End If


   Set oShell = CreateObject("Wscript.Shell")
   Set oFS = CreateObject("Scripting.FileSystemObject")


   sTemp = oShell.ExpandEnvironmentStrings("%TEMP%")
   sTempFile = sTemp & "\" & oFS.GetTempName


   'Run NSLookup via Command Prompt
   'Dump results into a temp text file
   oShell.Run "%ComSpec% /c nslookup.exe " & sHost _
       & " >" & sTempFile, 0, True


   'Open the temp Text File and Read out the Data
   Set oTF = oFS.OpenTextFile(sTempFile)


   'Parse the text file
   Do While Not oTF.AtEndOfStream
     sLine = Trim(oTF.Readline)
     If LCase(Left(sLine, 5)) = "name:" Then
       sData = Trim(Mid(sLine, 6))
       If Not bInpIP Then
         'Next line will be IP address(es)
         'Line can be prefixed with "Address:" or "Addresses":
         aLine = Split(oTF.Readline, ":")
         sData = Trim(aLine(1))
       End If
       Exit Do
     End If
   Loop


   'Close it
   oTF.Close
   'Delete It
   oFS.DeleteFile sTempFile


   If Lcase(TypeName(sData)) = LCase("Empty") Then
     NSlookup = ""
   Else
     NSlookup = sData
   End If


strOutput="C:\NS_Report.txt"
If objfso.FileExists(strOutput) Then
  Set objLogFile = objfso.OpenTextFile (strOutput, ForAppending)
Else
  Set objLogFile = objfso.CreateTextFile(strOutput, ForWriting, True)
End If

End Function
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 18779261
Looks like you've got this:
      strOutput="C:\NS_Report.txt"
If objfso.FileExists(strOutput) Then
  Set objLogFile = objfso.OpenTextFile (strOutput, ForAppending)
Else
  Set objLogFile = objfso.CreateTextFile(strOutput, ForWriting, True)
End If

in both the main code routine, as well as in the last function?

I just tried this again on my work PC and I got

server1.domain.com
????????? 'second one failed, for whatever reason...

I'm not sure why - but the first one did work.
I'm no good with regex's - so I wouldn't be of much help if that's where the problem is, but the code does seem to process correctly (well, except for the 2nd system I entered...need to check that out...)
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Suggested Solutions

If like me you are one who spends a lot of time working and scripting with cmd.exe, sometimes it is handy to be able to quickly view a calendar for a given month and year. This script will quickly do just that!  Save the code posted below to a .bat …
Over the years I have built up my own little library of code snippets that I refer to when programming or writing a script.  Many of these have come from the web or adaptations from snippets I find on the Web.  Periodically I add to them when I come…
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…

758 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now