private void RemoveDaemon(ServiceListViewItem serviceListViewItem) { MessageBoxResult result = MessageBox.Show(_resManager.GetString("msg_warning_delete"), _resManager.GetString("question"), MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) { return; } try { using (ServiceControlManager scm = ServiceControlManager.Connect(Advapi32.ServiceControlManagerAccessRights.Connect)) { using (ServiceHandle serviceHandle = scm.OpenService(serviceListViewItem.ServiceName, Advapi32.ServiceAccessRights.AllAccess)) { serviceHandle.DeleteService(); } } _processCollection.Remove(_processCollection.Single(i => i.ServiceName == serviceListViewItem.ServiceName)); //MessageBox.Show(_resManager.GetString("the_service_deletion_was_successful"), // _resManager.GetString("success"), MessageBoxButton.OK, MessageBoxImage.Information); } catch (ServiceNotStoppedException) { result = MessageBox.Show(_resManager.GetString("you_must_stop_the_service_first"), _resManager.GetString("information"), MessageBoxButton.YesNo, MessageBoxImage.Information); if (result == MessageBoxResult.Yes) { StopService(serviceListViewItem); } } catch (Exception ex) { MessageBox.Show(_resManager.GetString("the_service_deletion_was_unsuccessful") + "\n" + ex.Message, _resManager.GetString("error"), MessageBoxButton.OK, MessageBoxImage.Error); } }
public static ActionResult DeleteAllServices(Session session) { string appFolder = session.CustomActionData["APPDIR"]; if (string.IsNullOrWhiteSpace(appFolder) || !Directory.Exists(appFolder)) { session.Log("AppFolder is null or invalid."); return(ActionResult.Failure); } session.Log("Beginning the uninstall of all services."); try { using (ServiceControlManager controlManager = ServiceControlManager.Connect(Advapi32.ServiceControlManagerAccessRights.Connect)) { //Get all services for this installation List <string> serviceNameList = new List <string>(); using (RegistryKey mainKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\", RegistryKeyPermissionCheck.ReadSubTree)) { if (mainKey == null) { return(ActionResult.Failure); } foreach (string serviceName in mainKey.GetSubKeyNames()) { using (RegistryKey key = mainKey.OpenSubKey(serviceName, RegistryKeyPermissionCheck.ReadSubTree)) { //If the key invalid, skip this service if (key == null) { continue; } //Get the exe path of the service to determine later if its a service from DaemonMaster string serviceExePath = Convert.ToString(key.GetValue("ImagePath") ?? string.Empty); if (string.IsNullOrWhiteSpace(serviceExePath) || !DaemonMasterUtils.ComparePaths(serviceExePath, appFolder + ServiceControlManager.DmServiceFileName)) //Not possible to use ServiceControlManager.DmServiceExe because the AppDomain changed here => so that we need to rebuilt the path. { continue; } serviceNameList.Add(serviceName); } } } foreach (string serviceName in serviceNameList) { using (ServiceHandle service = controlManager.OpenService(serviceName, Advapi32.ServiceAccessRights.AllAccess)) { session.Log("Try to delete " + serviceName); try { Advapi32.ServiceStatusProcess serviceStatus = service.QueryServiceStatus(); if (serviceStatus.currentState != Advapi32.ServiceCurrentState.Stopped) { session.Log("Try killing " + serviceName + " service."); service.ExecuteCommand((int)ServiceCommands.ServiceKillProcessAndStop); try { service.WaitForStatus(Advapi32.ServiceCurrentState.Stopped, TimeSpan.FromSeconds(5)); } catch (TimeoutException) { session.Log("Terminate " + serviceName + " service."); Process process = Process.GetProcessById((int)serviceStatus.processId); process.Kill(); } } service.DeleteService(); session.Log("Deleted " + serviceName + " service successful."); } catch (Exception e) { session.Log("Deletion of " + serviceName + " failed.\n" + e.Message + "\n" + e.StackTrace); //continue } } } } session.Log("Uninstall of all services was successful."); return(ActionResult.Success); } catch (Exception e) { session.Log(e.Message + "\n" + e.StackTrace); return(ActionResult.Failure); } }