Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1325
  • Last Modified:

Multiple Installer for Windows Service written in .Net

Dear Experts,

I have a windows service that is written in vb.net/.net 4.0. This is how I use the windows service.

1. I install seven instances of the same service on multiple servers. Each service reads an application settings value called process id (one value from 1 through 7). When the service processes data, it reads data belonging to that specific process id.  That way I can run seven instances of the same service independently without any instance stepping any other instance.

2. The system administrators at my company want seven different installer (.msi) files, one for each windows service. So I have seven copies of the same windows service project. Each service has its own service installer and service process installer. Also, each windows service project has its own setup project. So I set the configuration value (process id) and service name for each windows service and execute a build for each service.

As you can see, this is not the most efficient way of implementing this. So I looked at this solution:
http://www.codeproject.com/Articles/21320/Multiple-Instance-NET-Windows-Service

While I was able to implement this fairly easily, I cannot use installUtil (system administrators do not want to use it). I still want to build multiple installer (.msi) files but not have to keep multiple copies of code. Also, the seven services are installed across three servers and so I cannot package all seven services in one .msi file.

Is there a way I could keep one copy of the service and generate seven (or more instances controlled by a script or configuration file) different .msi files, one for each instance of the service?

My ideal solution will be to have some kind of a script that will accept number of services as a parameter and then generate one .msi file for each instance of the service. I am leaning towards PowerShell but don't know how difficult it will be in PowerShell. Also, I'd like to keep just one copy of the windows service code.

Sorry my question's description is a bit long but I wanted to make sure I document all the facts.

Thanks for your help.
0
shekhar_shashi
Asked:
shekhar_shashi
2 Solutions
 
SriVaddadiCommented:
I don't think you would need multiple msi packages. You could prompt for the service name (which should be unique in order to install multiple service instances) through the installer and write it to the config file in your installer code.

You program always reads the service name from the configuration file as shown in the link you posted.
0
 
HaiFaiCommented:
Hi

How about if you make main entry and add installer to service it self ?
so that you could just share exe file and use it with parameters like
service.exe /install /4
so it will install 4 services
something like this what i use

 Try
            If args.Length > 0 Then
                Select Case args(0)
                    Case Is = "/u", "/uninstall", "-u"
                        System.Configuration.Install.ManagedInstallerClass.InstallHelper(New String() {"/u", Assembly.GetExecutingAssembly().Location})
                        MsgBox("Service uninstalled sucessfully!", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "Self Installing Service")
                    Case "/i", "/install", "-i"
                        System.Configuration.Install.ManagedInstallerClass.InstallHelper(New String() {Assembly.GetExecutingAssembly().Location})
                        MsgBox("Service installed sucessfully! Please start it from the Services control panel.", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "Self Installing Service")
                    Case "/h", "/options", "/o", "/help", "-h"
                        MsgBox("parameters " & vbCrLf & "service.exe /i or /install will install serverce" & vbCrLf & "service.exe /u or /uninstall will uninstall service")
                        ' My.Forms.ApplicationOptionsForm.ShowDialog()
                    Case Else
                        MsgBox("Just because I don't care doesn't mean I don't understand. :Homer Simpson")
                End Select
            Else
                Dim ServicesToRun() As System.ServiceProcess.ServiceBase
                ServicesToRun = New System.ServiceProcess.ServiceBase() {New email_exporter_service}
                System.ServiceProcess.ServiceBase.Run(ServicesToRun)
            End If
        Catch ex As Exception
            MsgBox("An error occured: " & vbCrLf & vbCrLf & ex.ToString, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Self Installing Service")
        End Try

Open in new window

0

Featured Post

Who's Defending Your Organization from Threats?

Protecting against advanced threats requires an IT dream team – a well-oiled machine of people and solutions working together to defend your organization. Download our resource kit today to learn more about the tools you need to build you IT Dream Team!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now