Portüberwachung mit Netstat funktioniert auf Server 2003 nicht

  • Hi Leute!

    Ich habe mir ein Programm zusammen gestellt, das auf einem TCP Port horcht und auf eine Verbindung wartet.
    Zweck des Programms soll sein, herauszufinden ob Anfragen an diesen Port gestellt werden.
    Bei mir ist das der Port 443, der für HTTPS Verbindungen verwendet wird.

    Meine Fragen:
    1.) Kennt jemand ein fertiges Programm, das mir diese Möglichkeit bietet? Es sollte allerdings keinen Sniffer wie Wireshark oder der gleichen sein. Es sollte auch mehrere Netzwerkadapter unterstützen.

    2.) Mein Programm funktioniert soweit recht gut. Problem ist nur, dass es manchmal vorkommt, dass beim ersten Verbindungsversuch keine IP Adresse ausgegeben wird. Sprich der Aufruf des Netstat Befehls kein Ergebnis bringt.

    3.) Und größtes Problem für mich. Das Script funktioniert unter Windows Server 2003 nicht. Unter WinXP funktoniert es, bis auf das unter Punkt 2 beschriebenen Problem.

    Spoiler anzeigen
    [autoit]


    #include <Constants.au3>
    #include <WinAPI.au3>
    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $ProcessID = _WinAPI_GetCurrentProcessID()
    ;HotKey für das Beenden vom Server
    HotKeySet("{ESC}","_Shutdown")
    Dim $ip[5]
    $ip[1] = @IPAddress1
    $ip[2] = @IPAddress2
    $ip[3] = @IPAddress3
    $ip[4] = @IPAddress4

    [/autoit] [autoit][/autoit] [autoit]

    $input = InputBox("Select IP","1 " & $ip[1] & @CR & "2 " & $ip[2] & @CR & "3 " & $ip[3] & @CR & "4 " & $ip[4], "1")
    If $input > 4 Or $input < 1 Then Exit
    ; Variablen
    $ServerIP = $ip[$input]
    $ServerPort = 443
    $ConnectedSocket = -1
    Dim $line2
    ;TCP starten
    TCPStartup()

    [/autoit] [autoit][/autoit] [autoit]

    ;MainSocket erstellen
    $MainSocket = TCPListen($ServerIP, $ServerPort )

    [/autoit] [autoit][/autoit] [autoit]

    ;Bei Fehlschlag Server beenden
    If $MainSocket = -1 Then Exit

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $ConnectedSocket = TCPAccept( $MainSocket)
    If $ConnectedSocket >= 0 Then
    $commandline = @ComSpec & ' /A /C netstat -a -n -o| find "' & $ServerIP & ":" & $ServerPort & '"'
    $id = Run($commandline, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    While 1
    $line = StdoutRead($id)
    If @error Then ExitLoop
    ;~ If $line <> "" Then
    If StringInStr($line, " " & $ProcessID) = True And StringInStr($line,"0.0.0.0") = False Then ;And StringInStr($line,"HERGESTELLT") = True
    $line2 = $line2 & $line
    EndIf
    ;~ EndIf
    Wend
    ;~ $line2 = StringRegExpReplace($line2, "[" & Chr(13) & "ABCDEFGHIJKLMNOPQRSTUVWXYZ]", "")
    ;~ $line2 = StringReplace($line2,Chr(13), "?")
    ;~ $line2 = StringReplace($line2,Chr(10), "?")
    $line2 = StringRegExpReplace($line2, "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]", "")
    $line2 = StringStripWS($line2,5)
    $line2 = StringTrimLeft($line2, StringInStr($line2,Chr(13),"",-2))
    TrayTip("Info",$line2, 5)
    $file = FileOpen(@ScriptDir & "\Connections.txt",9)
    ;~ FileWriteLine($file, _DateTimeFormat( _NowCalc(),2) & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & $line2 & @CRLF)
    FileWrite($file, _DateTimeFormat( _NowCalc(),2) & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & $line2 & @CRLF)
    FileClose($file)
    TCPCloseSocket($ConnectedSocket)
    $line2 = ""
    $line = ""
    $id = ""
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Shutdown()
    ShellExecute(@ScriptDir & "\Connections.txt")
    TCPCloseSocket($ConnectedSocket)
    TCPShutdown()
    Exit
    EndFunc

    [/autoit]

    If not :?: then ?( else :thumbup:

    Einmal editiert, zuletzt von Concara (2. Oktober 2009 um 12:22)

  • Vielleicht ist die Ip falsch eingegeben ich würde die eingabe abfragen ob sie eine von den möglichen ist

  • Probier es mal mit dieser Funktion. Hab sie für meien VNC-Logger geschrieben.

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>
    #Include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $aIP = _GetConnectionFromPort(443)

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($aIP)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GetConnectionFromPort($sPort = '5900')
    ; funkey 17.06.2009
    ; gibt IP oder Namen eines verbundenen PC's abhängig vom Port zurück
    ; Standard-Port ist 5900 für VNC, 3389 wäre für Remotedesktop ('mstsc.exe')
    Local $sErgebnis, $aPort
    Local $pid = Run(@ComSpec & " /c " & 'netstat -np TCP |findstr ":'&$sPort&'"', "", @SW_HIDE, $STDOUT_CHILD)
    Do
    $sErgebnis &= StdoutRead($pid)
    Until @error
    $aPort = StringSplit($sErgebnis, @CRLF, 3)
    For $i = UBound($aPort) - 1 To 0 Step -1
    If StringInStr($aPort[$i], 'HERGESTELLT') Then
    $aPort[$i] = StringRegExpReplace($aPort[$i], '(\s+)(\S+)(\s+)(\S+)(\s+)(\S+):(\S+)(\s+)(\S+)', '$6')
    Else
    _ArrayDelete($aPort, $i)
    EndIf
    Next
    If Not IsArray($aPort) Then Return SetError(1, 0, "")
    Return $aPort
    EndFunc

    [/autoit]
  • Hi!

    Danke für die Rückmeldungen!

    @simon: Ich hab nicht verstanden was du meinst!?
    funkey:
    Danke, deine Funktion funktioniert im Gegensatz zu dem was ich gebastelt habe immer. Zuminstest soweit ich das getestet habe.
    Mit deiner Funktion funktionierts auch auf Server 2003.
    ;( Warum das von mir nicht funktioniert weiß ich leider immer noch nicht ;(

    Hier das Script mit Funkey Funktion.

    Spoiler anzeigen
    [autoit]


    #Include <Array.au3>
    #include <Constants.au3>
    #include <WinAPI.au3>
    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $ProcessID = _WinAPI_GetCurrentProcessID()
    ;HotKey für das Beenden vom Server
    HotKeySet("{ESC}","_Shutdown")
    Dim $ip[5]
    $ip[1] = @IPAddress1
    $ip[2] = @IPAddress2
    $ip[3] = @IPAddress3
    $ip[4] = @IPAddress4

    [/autoit] [autoit][/autoit] [autoit]

    $input = InputBox("Select IP","1 " & $ip[1] & @CR & "2 " & $ip[2] & @CR & "3 " & $ip[3] & @CR & "4 " & $ip[4], "1")
    If $input > 4 Or $input < 1 Then Exit
    ; Variablen
    $ServerIP = $ip[$input]
    $ServerPort = 443
    $ConnectedSocket = -1
    Dim $line2
    ;TCP starten
    TCPStartup()

    [/autoit] [autoit][/autoit] [autoit]

    ;MainSocket erstellen
    $MainSocket = TCPListen($ServerIP, $ServerPort )

    [/autoit] [autoit][/autoit] [autoit]

    ;Bei Fehlschlag Server beenden
    If $MainSocket = -1 Then Exit

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $ConnectedSocket = TCPAccept( $MainSocket)
    If $ConnectedSocket >= 0 Then
    $aIP = _GetConnectionFromPort($ServerPort)
    TrayTip("Info",$aIP[0], 5)
    $file = FileOpen(@ScriptDir & "\Connections.txt",9)
    FileWrite($file, _DateTimeFormat( _NowCalc(),2) & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & $aIP[0] & @CRLF)
    FileClose($file)
    TCPCloseSocket($ConnectedSocket)
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Shutdown()
    ShellExecute(@ScriptDir & "\Connections.txt")
    TCPCloseSocket($ConnectedSocket)
    TCPShutdown()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetConnectionFromPort($sPort = '5900')
    ; funkey 17.06.2009
    ; gibt IP oder Namen eines verbundenen PC's abhängig vom Port zurück
    ; Standard-Port ist 5900 für VNC, 3389 wäre für Remotedesktop ('mstsc.exe')
    Local $sErgebnis, $aPort
    Local $pid = Run(@ComSpec & " /c " & 'netstat -np TCP |findstr ":'&$sPort&'"', "", @SW_HIDE, $STDOUT_CHILD)
    Do
    $sErgebnis &= StdoutRead($pid)
    Until @error
    $aPort = StringSplit($sErgebnis, @CRLF, 3)
    For $i = UBound($aPort) - 1 To 0 Step -1
    If StringInStr($aPort[$i], 'HERGESTELLT') Then
    $aPort[$i] = StringRegExpReplace($aPort[$i], '(\s+)(\S+)(\s+)(\S+)(\s+)(\S+):(\S+)(\s+)(\S+)', '$6')
    Else
    _ArrayDelete($aPort, $i)
    EndIf
    Next
    If Not IsArray($aPort) Then Return SetError(1, 0, "")
    Return $aPort
    EndFunc

    [/autoit]

    If not :?: then ?( else :thumbup: