protected override void OnStart(string[] args) { base.OnStart(args); try { //Get the service name _serviceName = GetServiceName(); //Get data from registry _serviceDefinition = RegistryManagement.LoadServiceStartInfosFromRegistry(_serviceName); //-------------------------------------------------------------------- //Setup NLOG for the service if (_serviceDefinition.UseEventLog) { SetupEventLogService(); } //Request additional time RequestAdditionalTime(_serviceDefinition.ProcessTimeoutTime + 1000); //Create a new DmProcess instance with reg data _dmProcess = new DmProcess(_serviceDefinition); _dmProcess.MaxRestartsReached += DmProcessOnMaxRestartsReached; _dmProcess.UpdateProcessPid += DmProcessOnUpdateProcessPid; //Check if the service should start in a user session or in the service session string sessionUsername = RegistryManagement.ReadAndClearSessionUsername(_serviceName); if (string.IsNullOrWhiteSpace(sessionUsername)) { Logger.Info("Starting the process in service session..."); _dmProcess.StartProcess(null); } else { Logger.Info("Starting the process in user session..."); _dmProcess.StartProcess(sessionUsername); } } catch (Exception ex) { Logger.Error(ex, ex.Message); Stop(); } }
private void EditDaemon() { if (ListViewDaemons.SelectedItem == null) { return; } var serviceListViewItem = (ServiceListViewItem)ListViewDaemons.SelectedItem; //Stop service first using (var serviceController = new ServiceController(serviceListViewItem.ServiceName)) { if (serviceController.Status != ServiceControllerStatus.Stopped) { MessageBoxResult result = MessageBox.Show(_resManager.GetString("you_must_stop_the_service_first"), _resManager.GetString("information"), MessageBoxButton.YesNo, MessageBoxImage.Information); if (result == MessageBoxResult.Yes) { StopService(serviceListViewItem); try { serviceController.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10)); } catch (TimeoutException ex) { //TODO: Better message MessageBox.Show("Cannot stop the service:\n" + ex.Message, _resManager.GetString("error"), MessageBoxButton.OK, MessageBoxImage.Error); return; } } else { return; } } } try { //Open service edit window with the data from registry var serviceEditWindow = new ServiceEditWindow(RegistryManagement.LoadServiceStartInfosFromRegistry(serviceListViewItem.ServiceName)); //stops until windows has been closed bool?dialogResult = serviceEditWindow.ShowDialog(); //Check result if (dialogResult.HasValue && dialogResult.Value) { DmServiceDefinition serviceDefinition = serviceEditWindow.GetServiceStartInfo(); if (string.Equals(serviceDefinition.ServiceName, serviceListViewItem.ServiceName)) { //Update serviceListViewItem _processCollection[_processCollection.IndexOf(serviceListViewItem)] = ServiceListViewItem.CreateFromServiceDefinition(serviceDefinition); } else { //Create new daemon (Import as happend with a diffrent service name => create new service with that name) _processCollection.Add(ServiceListViewItem.CreateFromServiceDefinition(serviceDefinition)); } } } catch (Exception ex) { MessageBox.Show(_resManager.GetString("cannot_load_data_from_registry") + "\n" + ex.Message, _resManager.GetString("error"), MessageBoxButton.OK, MessageBoxImage.Error); } }
private static int RunEditReturnExitCode(EditOptions opts) { //Check Admin right if (!DaemonMasterUtils.IsElevated()) { Console.WriteLine("You must start the program with admin rights."); return(1); } //------------------------ DmServiceDefinition serviceDefinition; try { if (string.IsNullOrWhiteSpace(opts.ServiceName)) { Console.WriteLine("The given service name is invalid."); return(-1); } string realServiceName = opts.ServiceName; if (!RegistryManagement.IsDaemonMasterService(realServiceName)) { realServiceName = "DaemonMaster_" + realServiceName; //Check for the name of the old system TODO: remove later if (!RegistryManagement.IsDaemonMasterService(realServiceName)) { Console.WriteLine("Cannot found a DaemonMaster service with the given name."); return(-1); } } //Load data from registry serviceDefinition = RegistryManagement.LoadServiceStartInfosFromRegistry(realServiceName); } catch (Exception) { Console.WriteLine("Cannot found a service with the given service name."); //"\n" + e.Message + "\n StackTrace: " + e.StackTrace); return(1); } try { CheckAndSetCommonArguments(ref serviceDefinition, opts); //Edit service using (ServiceControlManager scm = ServiceControlManager.Connect(Advapi32.ServiceControlManagerAccessRights.Connect)) { using (ServiceHandle service = scm.OpenService(serviceDefinition.ServiceName, Advapi32.ServiceAccessRights.AllAccess)) { if (service.QueryServiceStatus().currentState != Advapi32.ServiceCurrentState.Stopped) { Console.WriteLine("Service is not stopped, please stop it first."); return(1); } service.ChangeConfig(serviceDefinition); } } //Save arguments in registry RegistryManagement.SaveInRegistry(serviceDefinition); Console.WriteLine("Successful!"); return(0); } catch (Exception ex) { Console.WriteLine(ex.Message); return(1); } }