Windows-Dienst veröffentlicht --> nicht in der List

AllieAusNotebook

Grünschnabel
Hallöchen!
Ich muss etwas weiter ausholen: ich habe zuerst, um die Funktionalität zu testen, eine Windows-Application in Visual Studio 2005 angelegt und meinen Code getestet. Alles funktionierte wunderbar, also habe ich im VS 2005 gesagt, "Windows-Dienst" und die Onstart bzw. onstop Prozeduren gefüllt.

Dann habe ich gesagt "veröffentlichen". Im VS 2005 Ordner / Projects / PdfPrinter / PdfPrinter / bin / Debug gibt es dann eine

- exe-Datei
- Application-Datei
- exe.config-Datei
- exe.manifest-Datei
- pdb-Datei
- vshost.exe-Datei
- vshost.exe.manifest
- vshost.application
- vshost.exe.config

und einen .publish-Ordner. Ich habe nun zuerst auf die Exe-Datei geklickt und "Ausführen als" gesagt. In den Windowsprozessen erscheint dann der PdfPrinter, es geschieht aber nichts. Dann habe ich bei MSDN ein bisschen herumgesurft und installutil gefunden. Darüber habe ich dann versucht, das als Dienst zu installieren. Wenn ich das richtig verstanden habe, sollte er danach in der Diensteliste erscheinen. Dort ist er aber nicht. Er hat angeblich beim Ausführen von installutil.exe keine Installationsdateien gefunden.

Die InstallState-Datei wird entfernt, da keine Installer vorhanden sind.

Die Commitphase wurde erfolgreich abgeschlossen.

Die transaktive Installation ist abgeschlossen.

Nun, sowas habe ich noch nie gemacht und habe ehrlich gesagt Null Ahnung davon. Mein Try & Error hilft mir nicht weiter, genauso wenig wie die Dokumentationen, die ich dazu gefunden habe. Demnach habe ich alles richtig gemacht. Ich bin als SysAd eingeloggt, an den Berechtigungen kann es auch nicht liegen. Kann mir hier irgendwer weiterhelfen?

Danke,
Allie
 

AllieAusNotebook

Grünschnabel
Okay, zu meiner Schande muss ich gestehen, dass ich bis dato noch keine Installerklasse hatte.
Meine Installerdatei:
Code:
Imports System.ComponentModel
Imports System.Configuration.Install
Imports System.Diagnostics
Imports System.ServiceProcess.ServiceInstaller
Imports System
Imports System.Collections
Imports System.ServiceProcess


<RunInstaller(True)> Public Class ProjectInstaller

#Region " Component Designer generated code "

    Public Sub New()
        MyBase.New()

        Initializecomponent()
    End Sub


    Protected Overloads Sub Dispose( _
    ByVal disposing As Boolean)

        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        Me.ServiceProcessInstaller1.Dispose()

        'MyBase.Dispose(disposing)

    End Sub

    'Benötigt vom Component-Designer
    Private components As System.ComponentModel.IContainer

    Friend WithEvents ServiceProcessInstaller1 As _
    System.ServiceProcess.ServiceProcessInstaller

    Friend WithEvents ServiceInstaller1 As _
    System.ServiceProcess.ServiceInstaller

    Private Sub Initializecomponent()

        Me.ServiceProcessInstaller1 = _
        New System.ServiceProcess.ServiceProcessInstaller()

        Me.ServiceInstaller1 = _
        New System.ServiceProcess.ServiceInstaller()

        '
        'ServiceProcessInstaller1
        '
        Me.ServiceProcessInstaller1.Account = _
        System.ServiceProcess.ServiceAccount.LocalSystem
        Me.ServiceProcessInstaller1.Password = Nothing
        Me.ServiceProcessInstaller1.Username = Nothing
        '
        'ServiceInstaller1
        '
        Me.ServiceInstaller1.DisplayName = "PdfPrinter"
        Me.ServiceInstaller1.ServiceName = "PdfPrinter"
        '
        'ProjectInstaller
        '
        Me.ServiceProcessInstaller1.Installers.AddRange(New System.Configuration.Install.Installer() _
         {Me.ServiceProcessInstaller1, _
         Me.ServiceInstaller1})
        'Me.Installers.AddRange( _
        'New System.Configuration.Install.Installer() _
        ' {Me.ServiceProcessInstaller1, _
        'Me.ServiceInstaller1})

    End Sub

#End Region

End Class

Die Servicedatei:
Code:
Imports System.IO
Imports System.Threading

Public Class Service1

    Private simpleThread As Thread

    Protected Overrides Sub OnStart(ByVal args() As String)

        simpleThread = New Thread(New Threadstart(AddressOf WorkerSub))
        simpleThread.Start()

    End Sub

    Protected Overrides Sub OnStop()
        ' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen.
        simpleThread.Abort()
    End Sub

    Sub datei_drucken(ByVal filename As String)
        Dim schreiben As New ProcessStartInfo("cmd.exe")

        'wobei filename hier komplett mit Pfad übergeben werden muss, sonst gibt das nichts :o)
        '@TODO: Standarddrucker, Verzeichnisse, im Hintergrund öffnen
        schreiben.WorkingDirectory = "c:/Programme/Adobe/Reader 8.0/Reader/"
        schreiben.FileName = "AcroRd32.exe"
        schreiben.Arguments = "/p /h " & filename

        Process.Start(schreiben)
    End Sub

    Sub datei_verschieben(ByVal filename As String)

        Dim fpath = "c:\PDF\" & filename
        Dim zpath = "c:\PDF\done\" & filename

        File.Move(fpath, zpath)
    End Sub

    Private Sub WorkerSub()
        Dim actMinute As Integer
        actMinute = DateTime.Now.Minute

        While True

            If actMinute <> DateTime.Now.Minute Then

                Dim path As String = "C:/PDF/"
                Dim di As New DirectoryInfo(path)

                Dim fi As FileInfo() = di.GetFiles()
                Console.WriteLine("The following files exist in the current directory:")

                Dim fiTemp As FileInfo

                For Each fiTemp In fi
                    datei_drucken(path & fiTemp.Name)
                    datei_verschieben(fiTemp.Name)
                Next fiTemp

                actMinute = DateTime.Now.Minute
            End If
            Threading.Thread.Sleep(TimeSpan.FromMinutes(1.0))

        End While
    End Sub

End Class

Ich habe nun auch gelesen, dass ich ein Setupprojekt hinzufügen soll. Habe ich nun auch gemacht in meiner Projektmappe und alle Dateien dem Setup hinzugefügt. Trotzdem ist der Dienst nicht verfügbar in der Diensteliste und über installutil kommt genau das gleiche raus wie vorhin.

Gruß,
Allie
 

AllieAusNotebook

Grünschnabel
das Problem hat sich gelöst, es lag an der Installerklasse.

Ich habe (hoffentlich ein kleines) noch ein weiteres:

Ich rufe

AcroRd32.exe /p /h c:/pdf/meinedatei.pdf

auf über ein automatisiertes Konsolenfenster. Ohne Dienst mit diesem Befehl klappt auch der Ausdruck. Als Dienst jedoch klappt nur das anschließende Verschieben in den "done"-Ordner. Jetzt habe ich vermutet, dass das verschieben vielleicht zu schnell aufgerufen wird, während der noch den Acrobat Reader öffnet. Jetzt will er mir die PDF-Datei als XPS speichern. Oder manchmal meint er, ich hätte keinen Drucker installiert.

Warum habe ich als laufenden Dienst solche Problem damit? Ich habe auch die Alternative /t Druckername, Treiber, Port versucht, hierüber kommt auch nichts. Bin etwas ratlos *g*

Ciao,
Allie