using System.Collections; using System.ComponentModel; using System.Configuration.Install; using System.IO; using System.Security.Principal; using System.ServiceProcess; namespace PRSServices; public class PRSInstaller : Installer { private readonly ServiceProcessInstaller _proc; private readonly ServiceInstaller _svc; public PRSInstaller() { _proc = new ServiceProcessInstaller(); _svc = new ServiceInstaller { StartType = ServiceStartMode.Automatic }; Installers.Add(_svc); Installers.Add(_proc); } protected override void OnBeforeInstall(IDictionary savedState) { var username = Context.Parameters["/username"]; if (string.IsNullOrWhiteSpace(username)) { _proc.Account = ServiceAccount.LocalSystem; _proc.Username = WindowsIdentity.GetCurrent().Name; } else { _proc.Account = ServiceAccount.User; _proc.Username = username; _proc.Password = Context.Parameters["/password"] ?? ""; } _svc.ServiceName = Context.Parameters["/name"]; _svc.DisplayName = Context.Parameters["/displayName"]; _svc.Description = Context.Parameters["/description"]; // Change to .exe because .NET creates and runs .dll Context.Parameters["assemblypath"] = "\"" + Path.ChangeExtension(Context.Parameters["assemblypath"], "exe") + "\" /service=" + _svc.ServiceName; base.OnBeforeInstall(savedState); } protected override void OnBeforeUninstall(IDictionary savedState) { _svc.ServiceName = Context.Parameters["/name"]; // Change to .exe because .NET creates and runs .dll Context.Parameters["assemblypath"] = "\"" + Path.ChangeExtension(Context.Parameters["assemblypath"], "exe") + "\" /service=" + _svc.ServiceName; base.OnBeforeUninstall(savedState); } }