Dienst, macht keinen Mux

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Dienst, macht keinen Mux

    Hallo,
    habe mir einen kleinen Windows Dienst geschrieben, nix besonderes... der leider keinen Mux von sich gibts

    ERstmal der Aufbau:
    - Mit VB 2010 einen Dienst erstellt
    - Automatisch erstellte Datei "Service1" gleich belassen nicht umbenannt
    - Projectinstaller.vb hinzugefügt
    - eine Klasse angelegt "ServicePgm"
    Unter My Projekt habe ich unter Startobjekt Service1 stehen...

    Code: Service1:
    (Timer auf das Element gelegt und eingestellt auf 200 - nur zum testen)

    VB.NET-Quellcode

    1. Imports System.Net.Mail
    2. Public Class Service1
    3. Protected Overrides Sub OnStart(ByVal args() As String)
    4. ' Code zum Starten des Dienstes hier einfügen. Diese Methode sollte Vorgänge
    5. ' ausführen, damit der Dienst gestartet werden kann.
    6. Timer1.Start()
    7. End Sub
    8. Protected Overrides Sub OnStop()
    9. ' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen.
    10. Timer1.Stop()
    11. End Sub
    12. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    13. Dim Start As New ServicePgm
    14. Start.IPServiceRun()
    15. End Sub
    16. End Class


    Code ServicePgm:

    VB.NET-Quellcode

    1. Imports System.Net.Mail
    2. Public Class ServicePgm
    3. Friend Sub IPServiceRun()
    4. Dim IPtest As String = ReturnWANIP()
    5. If IPtest <> My.Settings.vorhandeneIP Then
    6. My.Settings.vorhandeneIP = IPtest
    7. mailversand(IPtest)
    8. End If
    9. End Sub
    10. Private Sub mailversand(ByVal neueIP As String)
    11. Dim appname As String = My.Application.Info.Title
    12. Dim objEventLog As New EventLog()
    13. Try
    14. Dim SmtpServer As New SmtpClient()
    15. Dim mail As New MailMessage()
    16. mail = New MailMessage()
    17. mail.From = New MailAddress("xxx@xxx-xxx.de") 'Same email addres as used above
    18. mail.To.Add("xxx@xxx-xxx.de") 'to e.g. blah@blah.com
    19. mail.Subject = "WAN IP Änderung!" 'This is the subject
    20. mail.Body = "Neue IP: " & neueIP 'This is the message"
    21. SmtpServer.Credentials = New Net.NetworkCredential("info@xxx-xxx.de", "PASSWORT") 'gmail email address and its password
    22. SmtpServer.UseDefaultCredentials = True
    23. SmtpServer.Host = "xxx.xxx-xxx.de" 'Host is gmail
    24. SmtpServer.Send(mail)
    25. WriteToEventLog("MS IPservice hat festgestellt, dass eine neue IP vorhanden ist - Meldung: " & neueIP)
    26. Catch ex As Exception
    27. MsgBox(ex.ToString)
    28. WriteToEventLog("MS IPservice hat einen Fehler - Meldung: " & ex.Message)
    29. End Try
    30. End Sub
    31. Function ReturnWANIP()
    32. Dim web As New Net.WebClient
    33. Try
    34. Dim WANip As String = web.DownloadString("http://ip.mcandy007.de")
    35. Return WANip
    36. Catch ex As Exception
    37. Return 0
    38. End Try
    39. End Function
    40. Public Sub WriteToEventLog(ByVal Fehler As String)
    41. Dim sSource As String
    42. Dim sLog As String
    43. Dim sEvent As String
    44. sSource = "EventLog-Beispiel"
    45. sLog = "Application" ' oder "System" oder "Security" oder
    46. ' selbstdefiniertes Ereignisprotokoll
    47. sEvent = Fehler
    48. If Not EventLog.SourceExists(sSource) Then
    49. EventLog.CreateEventSource(sSource, sLog)
    50. End If
    51. End Sub
    52. End Class


    Installiert habe ich mit installutil blablabla - funktioniert, wird eingetragen und ich kann ihn auch starten - aber -
    er macht keinen Mux und er schreibt auch nix nichts in Ereignisanteige/Anwendung rein... sollte er aber, dass einzigste was er schreibt ist, dass er den Dienst installiert hat (automatisch durch windows wird das ja angelegt) und er schreib Dienst gestaret... das wars... mehr macht er nicht...

    was habe ich da falsch gemacht ??

    Könntet Ihr mir da weiterhelfen ?

    Gruß
    lris


    EDIT:

    Unter My Projekt habe ich noch ein Feld für My.Settings angelegt...
    Ich kann dir nur emphelen MessageBoxen an verschieden positionen
    zu setzen dann weisst du wo er nicht weitermacht


    VB.NET-Quellcode

    1. Friend Sub IPServiceRun()
    2. MsgBox("IPServiceRun() ist gestartet")
    3. Dim IPtest As String = ReturnWANIP()
    4. If IPtest <> My.Settings.vorhandeneIP Then
    5. My.Settings.vorhandeneIP = IPtest
    6. mailversand(IPtest)
    7. End If
    8. End Sub
    nein, den teimer kann mann auf bei diesnten auflegen...

    Fehler ist Netzwerkpfad nicht gefunden -
    Der Dienst kann nicht gestartet werden. System.IO.IOException: Der Netzwerkpfad wurde nicht gefunden. bei Microsoft.Win32.RegistryKey.Win32ErrorStatic(Int32 errorCode, String str) bei Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(RegistryHive hKey, String machineName, RegistryView view) bei System.Diagnostics.EventLogInternal.GetEventLogRegKey(String machine, Boolean writable) bei System.Diagnostics.EventLogInternal.FindSourceRegistration(String source, String machineName, Boolean readOnly, Boolean wantToCreate) bei System.Diagnostics.EventLogInternal.SourceExists(String source, String machineName, Boolean wantToCreate) bei System.Diagnostics.EventLogInternal.VerifyAndCreateSource(String sourceName, String currentMachineName) bei System.Diagnostics.EventLogInternal.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData) bei System.Diagnostics.EventLog.WriteEntry(String message) bei IPService.Service1.mailversand(String _Titel, String _Body) bei IPService.Service1..



    Service1:

    VB.NET-Quellcode

    1. Imports System.Net.Mail
    2. Public Class Service1
    3. Protected Overrides Sub OnStart(ByVal args() As String)
    4. ' Code zum Starten des Dienstes hier einfügen. Diese Methode sollte Vorgänge
    5. ' ausführen, damit der Dienst gestartet werden kann.
    6. mailversand("IPService-Meldung", "Der Dienst IPService wurde um " & Date.Now & " neu gestartet.")
    7. EventLog1.WriteEntry("Der Dienst IPService wurde um " & Date.Now & " neu gestartet.")
    8. Timer1.Start()
    9. End Sub
    10. Protected Overrides Sub OnStop()
    11. ' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen.
    12. Timer1.Stop()
    13. End Sub
    14. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    15. Dim IPtest As String = ReturnWANIP()
    16. If IPtest <> "y" Then
    17. My.Settings.vorhandeneIP = IPtest
    18. mailversand("WAN IP Änderung!", "Neue IP: " & IPtest)
    19. End If
    20. End Sub
    21. Private Sub mailversand(ByVal _Titel As String, ByVal _Body As String)
    22. Dim appname As String = My.Application.Info.Title
    23. Dim objEventLog As New EventLog()
    24. Dim EventLog1 As New EventLog("Application", "myserver", "newsource")
    25. Try
    26. Dim SmtpServer As New SmtpClient()
    27. Dim mail As New MailMessage()
    28. mail = New MailMessage()
    29. mail.From = New MailAddress("xxxxxxxxxxxxxxx") 'Same email addres as used above
    30. mail.To.Add("xxxxxxxxxxxxxxx") 'to e.g. blah@blah.com
    31. mail.Subject = _Titel '
    32. mail.Body = _Body
    33. SmtpServer.Credentials = New Net.NetworkCredential("xxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxx") 'gmail email address and its password
    34. SmtpServer.UseDefaultCredentials = True
    35. SmtpServer.Host = "xxxxxxxxxxxxxxx"
    36. SmtpServer.Send(mail)
    37. Catch ex As Exception
    38. EventLog1.WriteEntry("Fehler beim Versenden der Mail von IPService " & ex.Message)
    39. End Try
    40. End Sub
    41. Private Function ReturnWANIP()
    42. Dim web As New Net.WebClient
    43. Try
    44. Dim WANip As String = web.DownloadString("http://ip.mcandy007.de")
    45. Return WANip
    46. Catch ex As Exception
    47. Return 0
    48. End Try
    49. End Function
    50. End Class


    habe das gefühl das der timer nichtläuft....

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „lris08“ ()

    ...
    also nun habe ich das teil zum laufen gebracht, habe das eventlog richtig eingestellt und Code sollte nun passen

    nun klappt nur eines noch nicht und zwar die authentifizierung beim Mailserver (SBS 2011).

    Fehlermeldung im Log:
    IPService-Meldung: Fehler beim Versenden der Mail von IPService. Für den SMTP-Server ist eine sichere Verbindung erforderlich, oder der Client wurde nicht authentifiziert. Die Serverantwort war: 5.7.1 Client was not authenticated

    das komische daran ist aber, wenn ich eine "normale" Windows Form erstelle und den gleichen code verwende, werden Emails versendet... als Dienst hat er das das problem mit dem authentifizierung...

    Hat da jemand eine Idee wie ich das bei einem Dienst lösen könnte???

    Und irgendwie habe ich den verdacht das der Timer unter einem Dienst auch nicht läuft...
    Den Timer kann man ja bei VB2010 auf das Service1 legen - wie in einer Form auch...
    Aufmerksam wurde ich, da die Fehlermeldung dass keine authentifikation möglich war nur einmal nach dem start des dienstes kommt... sollte ja eigentlich dnn alle paar min kommen, das keine mails versendet werdenkönnen... oder ?


    Wäre echt dankbar...

    hier der code Service1:

    VB.NET-Quellcode

    1. Imports System.Net.Mail
    2. Public Class Service1
    3. Protected Overrides Sub OnStart(ByVal args() As String)
    4. ' Code zum Starten des Dienstes hier einfügen. Diese Methode sollte Vorgänge
    5. ' ausführen, damit der Dienst gestartet werden kann.
    6. EventLog1.WriteEntry("IPService-Meldung: Der Dienst IPService wurde um " & Date.Now & " neu gestartet.")
    7. mailversand("IPService-Meldung", "Der Dienst IPService wurde um " & Date.Now & " neu gestartet.")
    8. Timer1.Start()
    9. End Sub
    10. Protected Overrides Sub OnStop()
    11. ' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen.
    12. Timer1.Stop()
    13. End Sub
    14. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    15. Dim IPtest As String = ReturnWANIP()
    16. If IPtest <> "y" Then ' nur zum test........
    17. My.Settings.vorhandeneIP = IPtest
    18. mailversand("WAN IP Änderung!", "Neue IP: " & IPtest)
    19. End If
    20. End Sub
    21. Private Sub mailversand(ByVal _Titel As String, ByVal _Body As String)
    22. Dim appname As String = My.Application.Info.Title
    23. Dim objEventLog As New EventLog()
    24. Try
    25. Dim SmtpServer As New SmtpClient()
    26. Dim mail As New MailMessage()
    27. mail = New MailMessage()
    28. mail.From = New MailAddress("xxxxxxxxxxxxxxx") 'Same email addres as used above
    29. mail.To.Add("xxxxxxxxxxxxx") 'to e.g. blah@blah.com
    30. mail.Subject = _Titel '
    31. mail.Body = _Body
    32. SmtpServer.UseDefaultCredentials = True
    33. SmtpServer.Credentials = New Net.NetworkCredential("xxxxxxxxxxxxx", "xxxxxxxxxxx") 'gmail email address and its password
    34. SmtpServer.Host = "xxxxxxxxxxxxxx"
    35. SmtpServer.Send(mail)
    36. EventLog1.WriteEntry("IPService-Meldung: Mail versendet.")
    37. Catch ex As Exception
    38. EventLog1.WriteEntry("IPService-Meldung: Fehler beim Versenden der Mail von IPService. " & vbCrLf & ex.Message)
    39. End Try
    40. End Sub
    41. Public Function ReturnWANIP()
    42. Dim web As New Net.WebClient
    43. Try
    44. Dim WANip As String = web.DownloadString("http://ip.mcandy007.de")
    45. Return WANip
    46. Catch ex As Exception
    47. Return 0
    48. End Try
    49. End Function
    50. End Class
    Wenn ich sowas schon sehe -.-

    VERGISS DEN TIMER! Streiche ihn aus deinem Gehirn, wirf ihn aus dem Fenster, Fahr mit dem Auto drüber und schieß ihn dann ins große weite Weltall.

    Dann liest du die Dokumentation über Dienste:
    msdn.microsoft.com/de-de/library/d56de412%28v=vs.80%29.aspx
    msdn.microsoft.com/de-de/library/9k985bc9%28v=vs.80%29.aspx
    msdn.microsoft.com/de-de/library/y817hyb6%28v=vs.80%29.aspx
    msdn.microsoft.com/de-de/library/yzk7ksy2%28v=vs.80%29.aspx
    msdn.microsoft.com/de-de/libra…onstart%28v=vs.80%29.aspx

    ...und startest einen Thread in OnStart(), dessen Workermethode deine Arbeit erledigt. Hier noch ein paar allgemeine Infos:
    - OnStart() darf maximal 30 Sekunden laufen
    - Dienste haben keine Verbindung zum angemeldeten Benutzer
    - Dienste haben keine Verbindung zum Desktop
    - Dienste haben keine Grafikausgabe (keine Form, keine Messagebox oder sonst irgendwas, was man sehen kann)
    - Dienste haben Systemprivilegien. <-- Weißt du wirklich genau, was du tust? [ ] Ja [x] Nein

    Und: Wirf unbedingt das über den Haufen, was du mit dem Timer gefrickelt hast (auch wenns funktioniert). Es ist Bullshit. Kurzer Abriss:

    VB.NET-Quellcode

    1. OnStart()
    2. - Thread.Start(worker)
    3. OnStop()
    4. - Set exit Flag
    5. worker()
    6. LOOP
    7. - Check exit Flag
    8. - Do work
    9. - Sleep (x)

    Was gerne vergessen wird: Synchronisiere deine Threads!
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()