TCPStartup und TCPListen als Service öffnet keine Port

  • Hallo zusammen,

    ich habe ein Scriptgeschrieben das als TCP Server einen Port öffnet, wenn ich es als Nutzer meines Rechners starte Funktioniert auch alles super so wie ich es will. Dann habe ich nach einer möglichkeit gesucht diesen Server als Dienst zu Installieren, und dies hier gefunden

    http://www.autoitscript.com/forum/index.php?s=068720af1a61546ee7b8367c5782d490&showtopic=80201&st=0

    ich habe den Dienst dann auch schon unter Verschiedenen Konten laufen lassen, nur öffnet er mir nie meinen Port.
    ich habe auch mal ein par logzeilen eingebaut die Schleifen die ich eingebaut habe im main() funtionieren auch tatsächlich.

    hat jemand von euche eine Idee warum das nicht funktioniert?

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Version=Beta
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; Example of using service UDF to make an exe possibly runeed as a service
    ; By Arcker
    ; 10/09/2008
    #include <GUIConstantsEx.au3>
    #include <Constants.au3>
    ;#include <incPrivateRPC.au3>
    #include<Service.au3>
    #include <File.au3>

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

    Dim $szIPADDRESS = IniRead("Server.ini", "Settings", "IP", "")
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $szIPADDRESS = ' & $szIPADDRESS & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    Dim $nPORT = IniRead("Server.ini", "Settings", "Port", "")
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $nPORT = ' & $nPORT & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    Dim $sComputerName = @ComputerName
    Dim $sServiceName = "PrivateRPCServer"
    Dim $sServiceUser, $sPassword

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

    If $cmdline[0] > 0 Then
    Switch $cmdline[1]
    Case "install", "-i", "/i"
    InstallService()
    Case "remove", "-u", "/u", "uninstall"
    RemoveService()
    Case Else
    ConsoleWrite(" - - - Help - - - " & @crlf)
    ConsoleWrite("params : " & @crlf)
    ConsoleWrite(" -i : install service" & @crlf)
    ConsoleWrite(" -u : remove service" & @crlf)
    ConsoleWrite(" - - - - - - - - " & @crlf)
    Exit
    ;start service.
    EndSwitch
    EndIf
    _Service_init($sServiceName)

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

    func main()
    while 1
    ;doing what you want here
    ;msgbox(0,"","ok")
    Local $MainSocket, $ConnectedSocket, $szIP_Accepted
    Local $recv, $slash, $values, $iniSectionCMD
    TCPStartup()
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)
    If $MainSocket = -1 Then Exit

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

    While 1
    _FileWriteLog("C:\log.txt","While loop") ; zum testen eingefügt
    $ConnectedSocket = -1
    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Sleep(500)
    _FileWriteLog("C:\log.txt","Do loop") ; zum testen eingefügt
    Until $ConnectedSocket <> -1

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

    $szIP_Accepted = SocketToIP($ConnectedSocket)
    ;Removed Code
    WEnd
    If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
    TCPShutdown()
    Sleep(1000)
    WEnd
    EndFunc

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

    Func InstallService()
    ConsoleWrite("Installing service, please wait" & @CRLF)
    _Service_Create("", $sServiceName, "Autoit Service Test", '"' & @ScriptFullPath & '"')
    If @error Then
    ConsoleWrite("Problem installing service, Error number is " & @error & @CRLF & " message : " & _WinAPI_GetLastErrorMessage())
    Else
    ConsoleWrite("Installation of service successful")
    EndIf
    Exit
    EndFunc ;==>InstallService
    Func RemoveService()
    _StopService("", $sServiceName)
    _DeleteService("", $sServiceName)
    if not @error then ConsoleWrite("service removed successfully" & @crlf)
    Exit
    EndFunc ;==>RemoveService

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

    Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

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

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
    "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
    $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
    If Not @error Then $aRet = $aRet[0]
    Else
    $aRet = 0
    EndIf

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

    $sockaddr = 0

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

    Return $aRet
    EndFunc ;==>SocketToIP

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

    EDIT:
    Fehler gefunden wenn das script als Dienst läuft ist das Arbeitsverzeichnis eine anderens und der Zugriff auf die Settings.ini war somit nicht mehr möglich durch eine absolute Phadangabe wurde das Probelm beseitigt.
    Dennoch danke für die Hilfeversuche.

    Somit ist aber auch Klar das mit dem Service.au3 UDF durchaus auch ein Netzwerkdienst möglich ist.

    • Offizieller Beitrag

    Was hällst du davon deine func main()im Script auch mal aufzurufen ? Ohne diese Func läuft nichts . Dann hast du 3 verschachtelte Schleifen in dieser Func , davon werden 2 nicht gebraucht. Die Variablendeklaration sollte außerhalb der Schleife stehen , genauso wie TCPStartup .

  • Hallo Raupi,

    Was hällst du davon deine func main()im Script auch mal aufzurufen ? Ohne diese Func läuft nichts . Dann hast du 3 verschachtelte Schleifen in dieser Func , davon werden 2 nicht gebraucht. Die Variablendeklaration sollte außerhalb der Schleife stehen , genauso wie TCPStartup .

    die Funktion main() wird von der Funktion _Service_init($sServiceName) aufgerufen, das ist auch richtig so.
    Die Schleifen werden zwar in dieser Testversion nicht benötigt aber da Steht ja auch ";Removed Code " an dieser Stelle ist in meinem Script noch Code der immer wieder ausgeführt werden soll wenn eine Socket connection aufgebaut wurde somit sind auch alle Schleifen durchaus sinnfoll. es Funktioniert ja auch soweit, die Logzeilen sind zum testen reingekommen und tatsächlich im log tauch auch was auf. nur der Port wird nicht geöffnet

    CU

  • Ich glaube, du musst den service als Netzwerkdienst erstellen, sonst hat er keinen Zugriff. das könnte beim installieren so funktionieren:

    [autoit]

    _Service_Create("", $sServiceName, "Autoit Service Test", '"' & @ScriptFullPath & '"',"AUTHORITY\NetworkService")

    [/autoit]
  • Hallo progandy,


    Ich glaube, du musst den service als Netzwerkdienst erstellen, sonst hat er keinen Zugriff. das könnte beim installieren so funktionieren:

    [autoit]

    _Service_Create("", $sServiceName, "Autoit Service Test", '"' & @ScriptFullPath & '"',"AUTHORITY\NetworkService")

    [/autoit]


    das habe ich schon versucht zwar nicht bei der Installation aber nachträglich auf NertworkService umgestellt und ich habe den Dienst auch schon als Admin User laufenlassen.

    Das brachte alles kein erfolg. Hast du noch eine Idee.