예제 #1
0
        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();
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
            }
        }