Benutzerdefinierte Funktion nslookup in Excel

  • Excel

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von protaylort.

    Benutzerdefinierte Funktion nslookup in Excel

    Liebe Community

    Ich habe eine benutzerdefinierte Funktion gefunden (jayteknews.blogspot.cz/2011/08…909216#c91333604348374641) und diese in Excel implementiert. Dies funktioniert wunderbar. Jedoch gibt das Script lediglich den A-Record der DNS-Einstellungen wieder.

    Ich möchte jedoch, dass das Script alle Mailserver, also MX-Einträge, ausgibt. Gemäss den nslookup-Eigenschaften (technet.microsoft.com/en-us/li…aa998082(v=exchg.65).aspx) würde dies ja mit "nslookup set q=MX" funktionieren. Leider verstehe ich VB zu wenig um diese Änderung funktionstüchtig anzuwenden.

    Das Resultat sollte dann folgendes sein: Jeder Mailserver in einem neuen Feld ausgegeben. Z.B. wenn als Domain vb-paradise.de eingegeben wird, sollte "cz-prg01a-dns01.chello.cz" ausgegeben werden. Wenn eine Domain mehrere Mailserver hat, sollten mehrere ausgegeben werden.

    Ich hoffe jemand kann mir damit helfen.

    Freundliche Grüsse
    Thomas
    Danke, dies habe ich so im Script schon eingesetzt, leider funktioniert das Script danach nicht mehr. Ausserdem gibt das Script momentan nur 1 Resultat, mit der MX-Abfrage sollten dann alle Mailserver ausgegeben werden. Dies kann mal ein Mailserver sein, mal 8, etcl..
    was für mich darauf hindeutet, dass du es falsch eingesetzt hast.

    Wir teilen diese Ansicht ;) Deshalb hoffe ich, jemand erfahreneres kann mir helfen!

    "Mein" Code:

    Quellcode

    1. Public Function NSLookup(lookupVal As String, Optional addressOpt As Integer) As String
    2. Const ADDRESS_LOOKUP = 1
    3. Const NAME_LOOKUP = 2
    4. Const AUTO_DETECT = 0
    5. 'Skip everything if the field is blank
    6. If lookupVal <> "" Then
    7. Dim oFSO As Object, oShell As Object, oTempFile As Object
    8. Dim sLine As String, sFilename As String
    9. Dim intFound As Integer
    10. Set oFSO = CreateObject("Scripting.FileSystemObject")
    11. Set oShell = CreateObject("Wscript.Shell")
    12. 'Handle the addresOpt operand
    13. 'Regular Expressions are used to complete a substring match for an IP Address
    14. 'If an IP Address is found, a DNS Name Lookup will be forced
    15. If addressOpt = AUTO_DETECT Then
    16. ipLookup = FindIP(lookupVal)
    17. If ipLookup = "" Then
    18. addressOpt = ADDRESS_LOOKUP
    19. Else
    20. addressOpt = NAME_LOOKUP
    21. lookupVal = ipLookup
    22. End If
    23. 'Do a regular expression substring match for an IP Address
    24. ElseIf addressOpt = NAME_LOOKUP Then
    25. lookupVal = FindIP(lookupVal)
    26. End If
    27. 'Run the nslookup command
    28. sFilename = oFSO.GetTempName
    29. oShell.Run "cmd /c nslookup set q=MX" & lookupVal & " > " & sFilename, 0, True
    30. Set oTempFile = oFSO.OpenTextFile(sFilename, 1)
    31. Do While oTempFile.AtEndOfStream <> True
    32. sLine = oTempFile.Readline
    33. cmdStr = cmdStr & Trim(sLine) & vbCrLf
    34. Loop
    35. oTempFile.Close
    36. oFSO.DeleteFile (sFilename)
    37. 'Process the result
    38. intFound = InStr(1, cmdStr, "Name:", vbTextCompare)
    39. If intFound = 0 Then
    40. NSLookup = "NotFound"
    41. Exit Function
    42. ElseIf intFound > 0 Then
    43. 'TODO: Cleanup with RegEx
    44. If addressOpt = ADDRESS_LOOKUP Then
    45. loc1 = InStr(intFound, cmdStr, "Address:", vbTextCompare) + InStr(intFound, cmdStr, "Addresses:", vbTextCompare)
    46. loc2 = InStr(loc1, cmdStr, vbCrLf, vbTextCompare)
    47. nameStr = Trim(Mid(cmdStr, loc1 + 8, loc2 - loc1 - 8))
    48. ElseIf addressOpt = NAME_LOOKUP Then
    49. loc1 = InStr(intFound, cmdStr, "Name:", vbTextCompare)
    50. loc2 = InStr(loc1, cmdStr, vbCrLf, vbTextCompare)
    51. nameStr = Trim(Mid(cmdStr, loc1 + 5, loc2 - loc1 - 5))
    52. End If
    53. End If
    54. NSLookup = nameStr
    55. Else
    56. NSLookup = "N/A"
    57. End If
    58. End Function
    59. Function FindIP(strTest As String) As String
    60. Dim RegEx As Object
    61. Dim valid As Boolean
    62. Dim Matches As Object
    63. Dim i As Integer
    64. Set RegEx = CreateObject("VBScript.RegExp")
    65. RegEx.Pattern = "\b(?:\d{1,3}\.){3}\d{1,3}\b"
    66. valid = RegEx.test(strTest)
    67. If valid Then
    68. Set Matches = RegEx.Execute(strTest)
    69. FindIP = Matches(0)
    70. Else
    71. FindIP = ""
    72. End If
    73. End Function
    Stell dir vor, den seh ich! ;)
    Mir war jedoch nicht bewusst, dass ich den Befehl für die Kommandozeile verwenden sollte, was doch im Nachhinein viel sinnvoller ist.

    Trotzdem: Dasselbe Resultat erscheint beim Einsatz von nslookup -q=MX.

    Hat es denn bei dir in Excel funktioniert?

    protaylort schrieb:

    Hat es denn bei dir in Excel funktioniert?
    Ich habe mir nicht die Mühe gemacht und den Riesen-VBA-Wust gedebuggt, um letztendlich einen CMD-Befehl abzusetzen.
    Aber in CMD funktioniert es hervorragend.

    Quellcode

    1. nslookup -q=MX google.com
    2. Server: UnKnown
    3. Address: 10.200.102.243
    4. Nicht autorisierende Antwort:
    5. google.com MX preference = 10, mail exchanger = aspmx.l.google.com
    6. google.com MX preference = 40, mail exchanger = alt3.aspmx.l.google.com
    7. google.com MX preference = 50, mail exchanger = alt4.aspmx.l.google.com
    8. google.com MX preference = 30, mail exchanger = alt2.aspmx.l.google.com
    9. google.com MX preference = 20, mail exchanger = alt1.aspmx.l.google.com


    protaylort schrieb:

    Dasselbe Resultat erscheint beim Einsatz von nslookup -q=MX
    Welches Resultat?

    Setz halt mal einen Breakpoint, bevor du den CMD-Befehl abschickst und schau nach, was er wirklich an oShell.Run als Parameter übergibt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich habe mir nicht die Mühe gemacht und den Riesen-VBA-Wust gedebuggt, um letztendlich einen CMD-Befehl abzusetzen.
    Aber in CMD funktioniert es hervorragend.

    Ach so, es klang so als hättest du. Es dauert weniger lang den Script kurz in Excel als Makro einzubauen als etwas vorzuschlagen das nicht funktioniert, und dann ein paar Male hin und her zu schreiben.
    Dies soll nicht heissen dass ich deine Kommentare nicht wertschätzte. Im Gegenteil, ich bin froh versuchte mir jemand zu helfen.
    Danke, ich habe den Kommandozeilen-Befehl auch schon verwendet. Mir ist bewusst wie dies funktioniert.

    Der Grund weshalb ich hier auf dem Forum bin ist, dass ich von VBA nicht viel verstehe. Ich hoffte, dass mit einer einfachen Abänderung, wie z.B. des Einfügens eines Arguments, mein Problem gelöst werden könnte. Falls nicht, muss ich dieses Projekt anders angehen.

    protaylort schrieb:

    Es dauert weniger lang den Script kurz in Excel als Makro einzubauen als etwas vorzuschlagen das nicht funktioniert
    Es dauert weniger lang, das Script neu zu schreiben, als ein umständliches umzubauen.

    Visual Basic-Quellcode

    1. Public Function NSLookupMX(Value As String) As String
    2. Dim FS As Object, File As Object, Filename As String
    3. Set FS = CreateObject("Scripting.FileSystemObject")
    4. Filename = FS.GetTempName
    5. CreateObject("Wscript.Shell").Run "CMD /c nslookup -q=MX " & Value & " | FINDSTR MX >" & Filename, 0, True
    6. Set File = FS.OpenTextFile(Filename, 1)
    7. Do While Not File.AtEndOfStream
    8. NSLookupMX = NSLookupMX & File.Readline & vbCrLf
    9. Loop
    10. File.Close
    11. FS.DeleteFile Filename
    12. End Function


    protaylort schrieb:

    Ich hoffte, dass mit einer einfachen Abänderung, wie z.B. des Einfügens eines Arguments, mein Problem gelöst werden könnte.
    Wenn man den Code versteht und/oder des Debuggens mächtig ist, ist das auch kein Problem.
    Aber in der Kombination

    protaylort schrieb:

    dass ich von VBA nicht viel verstehe
    wird's natürlich eng.
    Insbesondere sehe ich in diesem Fall keinen Grund, mir vorwurfsbehaftete oder zynische Kommentare anhören zu müssen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke für deinen Script. Dieser funktioniert sehr gut. Mein Ziel war es aber, als Ausgabe lediglich den Mailserver zu haben, ohne die URL vornedran, dann die MX Priorität, etc. Ich versuchte den relevanten Text rauszufiltern, aber es ist beinahe ein Ding der Unmöglichkeit, da keine Kommatrennung vorhanden ist, und zum Teil pro Domäne 5+ Mailserver mit dem ganzen Drumherum ausgegeben werden. Für mehrere Tausend Domains stürzt der Rechner auch fast ab bei der Massenausführung des Scripts.

    Ich möchte meine gute Laune und Stimmung behalten, und persönliche Diskussionen gar nicht weiterführen :) Dies ist ja ein VBA-Forum. Ich finde alles was sich nicht darum dreht, gehört garnicht hin.