Solved

Script nslookup results to output file

Posted on 2007-03-22
3
3,701 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article will show, step by step, how to integrate R code into a R Sweave document
The Windows functions GetTickCount and timeGetTime retrieve the number of milliseconds since the system was started. However, the value is stored in a DWORD, which means that it wraps around to zero every 49.7 days. This article shows how to solve t…
Learn the basics of if, else, and elif statements in Python 2.7. Use "if" statements to test a specified condition.: The structure of an if statement is as follows: (CODE) Use "else" statements to allow the execution of an alternative, if the …
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

726 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