public override void Refresh(ObservableCollection <DataObject> objects) { using (var manager = new RefreshManager <ServiceDataObject>(objects)) { using (NativeSCManager scm = new NativeSCManager(MachineName)) { foreach (ENUM_SERVICE_STATUS_PROCESS essp in scm.Refresh(ServicesType)) { using (NativeService ns = new NativeService(scm, essp.ServiceName)) { ServiceDataObject sdo = null; if (manager.Contains(essp.ServiceName, out sdo)) { sdo.UpdateFrom(essp); } else { objects.Add(new ServiceDataObject(ns, essp)); } } } } } }
public bool Uninstall(NativeSCManager scm) { try { using (NativeService ns = new NativeService(scm, InternalID, ACCESS_MASK.SERVICE_CHANGE_CONFIG | ACCESS_MASK.SERVICE_QUERY_STATUS | ACCESS_MASK.DELETE)) { return(NativeServiceFunctions.DeleteService(ns.Handle)); } } catch (Exception e) { Log.Error("DeleteService", e); return(false); } }
public ServiceDataObject(NativeService service, ENUM_SERVICE_STATUS_PROCESS essp) : base(essp.ServiceName) { DisplayName = essp.DisplayName; CurrentState = essp.CurrentState; ControlsAccepted = essp.ControlsAccepted; Win32ExitCode = essp.Win32ExitCode.ToString(); ServiceSpecificExitCode = essp.ServiceSpecificExitCode.ToString(); CheckPoint = essp.CheckPoint.ToString(); WaitHint = essp.WaitHint.ToString(); ServiceFlags = essp.ServiceFlags.ToString(); ServiceType = essp.ServiceType; if (essp.ProcessID != 0) { PID = essp.ProcessID.ToString(); } else { PID = ""; } QUERY_SERVICE_CONFIG config = service.ServiceConfig; if (essp.CurrentState == SC_RUNTIME_STATUS.SERVICE_RUNNING) { IsRunning = true; } if (config != null) { if (config.StartType == SC_START_TYPE.SERVICE_DISABLED) { IsDisabled = true; } StartType = config.StartType; BinaryPathName = config.BinaryPathName; LoadOrderGroup = config.LoadOrderGroup; ErrorControl = ServicesLocalisation.Localized(config.ErrorControl); TagId = config.TagId.ToString(); User = config.ServiceStartName; } ToolTip = Description = service.Description; ToolTipCaption = DisplayName; ConstructionIsFinished = true; }
public ServiceDataObject(NativeService service, ENUM_SERVICE_STATUS_PROCESS essp) : base(essp.ServiceName) { DisplayName = essp.DisplayName; CurrentState = essp.CurrentState; ControlsAccepted = essp.ControlsAccepted; Win32ExitCode = essp.Win32ExitCode.ToString(); ServiceSpecificExitCode = essp.ServiceSpecificExitCode.ToString(); CheckPoint = essp.CheckPoint.ToString(); WaitHint = essp.WaitHint.ToString(); ServiceFlags = essp.ServiceFlags.ToString(); ServiceType = essp.ServiceType; if (essp.ProcessID != 0) PID = essp.ProcessID.ToString(); else PID = ""; QUERY_SERVICE_CONFIG config = service.ServiceConfig; if (essp.CurrentState == SC_RUNTIME_STATUS.SERVICE_RUNNING) { IsRunning = true; } if (config != null) { if (config.StartType == SC_START_TYPE.SERVICE_DISABLED) { IsDisabled = true; } StartType = config.StartType; BinaryPathName = config.BinaryPathName; LoadOrderGroup = config.LoadOrderGroup; ErrorControl = ServicesLocalisation.Localized(config.ErrorControl); TagId = config.TagId.ToString(); User = config.ServiceStartName; } ToolTip = Description = service.Description; ToolTipCaption = DisplayName; ConstructionIsFinished = true; }
public bool ApplyStartupChanges(NativeSCManager scm, SC_START_TYPE startupType) { bool success = true; if (startupType != StartType) { Log.InfoFormat("{0}: Change SC_START_TYPE from {1} to {2}", InternalID, StartType, startupType); using (NativeService ns = new NativeService(scm, InternalID, ACCESS_MASK.SERVICE_CHANGE_CONFIG | ACCESS_MASK.SERVICE_QUERY_STATUS)) { success = NativeServiceFunctions.ChangeServiceConfig(ns.Handle, StartType: startupType); if (success) { StartType = startupType; } } } return(success); }
public void ApplyChanges( NativeSCManager scm, SC_START_TYPE startupType, string displayName, string binaryPathName, string description) { using (NativeService ns = new NativeService(scm, InternalID, ACCESS_MASK.SERVICE_CHANGE_CONFIG | ACCESS_MASK.SERVICE_QUERY_STATUS)) { bool success = NativeServiceFunctions.ChangeServiceConfig(ns.Handle, StartType: startupType, DisplayName: displayName, BinaryPathName: binaryPathName); if (success) { StartType = startupType; if (displayName != null) { SetStringProperty("DisplayName", displayName); } if (binaryPathName != null) { SetStringProperty("BinaryPathName", binaryPathName); NotifyPropertyChanged("InstallLocation"); } if ((description != null) && !description.Equals(Description)) { ns.Description = description; SetStringProperty("Description", description); } } } }
public override void Refresh(ObservableCollection<DataObject> objects) { using(var manager = new RefreshManager<ServiceDataObject>(objects)) { using (NativeSCManager scm = new NativeSCManager(MachineName)) { foreach (ENUM_SERVICE_STATUS_PROCESS essp in scm.Refresh(ServicesType)) { using (NativeService ns = new NativeService(scm, essp.ServiceName)) { ServiceDataObject sdo = null; if (manager.Contains(essp.ServiceName, out sdo)) { sdo.UpdateFrom(essp); } else { objects.Add(new ServiceDataObject(ns, essp)); } } } } } }
public override void DoWork() { ACCESS_MASK ServiceAccessMask = SSR.GetServiceAccessMask() | ACCESS_MASK.STANDARD_RIGHTS_READ | ACCESS_MASK.SERVICE_QUERY_STATUS; ServicesDataController sdc = MainWindow.CurrentController as ServicesDataController; using (NativeSCManager scm = new NativeSCManager(sdc.MachineName)) { int serviceIndex = 0; foreach (ServiceDataObject so in Services) { ++serviceIndex; try { SetOutputText(string.Format("Service {0}/{1}: {2} is initially in state {3}", serviceIndex, Services.Count, so.DisplayName, ServicesLocalisation.Localized(so.CurrentState))); if (so.CurrentState == SC_RUNTIME_STATUS.SERVICE_STOPPED) { ServiceAccessMask &= ~(ACCESS_MASK.SERVICE_STOP); } using (NativeService ns = new NativeService(scm, so.InternalID, ServiceAccessMask)) { bool requestedStatusChange = false; Log.InfoFormat("BEGIN backgroundWorker1_Process for {0}", ns.Description); using (ServiceStatus ss = new ServiceStatus(ns)) { for (int i = 0; i < 100; ++i) { if (Worker.CancellationPending) { break; } if (!ss.Refresh()) { break; } SetOutputText(string.Format("Service {0}/{1}: {2} is now in state {3}", serviceIndex, Services.Count, so.DisplayName, ServicesLocalisation.Localized(ss.Status.CurrentState))); if (SSR.HasSuccess(ss.Status.CurrentState)) { Log.Info("Reached target status, done..."); break; // TODO: reached 100% of this service' status reqs. } // if we haven't asked the service to change its status yet, do so now. if (!requestedStatusChange) { requestedStatusChange = true; Log.InfoFormat("Ask {0} to issue its status request on {1}", SSR, ss); if (!SSR.Request(ss)) { break; } } else if (SSR.HasFailed(ss.Status.CurrentState)) { Log.Error("ERROR, target state is one of the failed ones :("); break; } Thread.Sleep(500); } so.UpdateFrom(ss.Status); Log.Info("END backgroundWorker1_Process"); } } } catch (Exception ex) { Log.Error("Exception caught in PerformServiceStateRequest", ex); } if (Worker.CancellationPending) { break; } } } }
public bool Uninstall(NativeSCManager scm) { try { using (NativeService ns = new NativeService(scm, InternalID, ACCESS_MASK.SERVICE_CHANGE_CONFIG | ACCESS_MASK.SERVICE_QUERY_STATUS | ACCESS_MASK.DELETE)) { return NativeServiceFunctions.DeleteService(ns.Handle); } } catch(Exception e) { Log.Error("DeleteService", e); return false; } }
public bool ApplyStartupChanges(NativeSCManager scm, SC_START_TYPE startupType) { bool success = true; if (startupType != StartType) { Log.InfoFormat("{0}: Change SC_START_TYPE from {1} to {2}", InternalID, StartType, startupType); using (NativeService ns = new NativeService(scm, InternalID, ACCESS_MASK.SERVICE_CHANGE_CONFIG | ACCESS_MASK.SERVICE_QUERY_STATUS)) { success = NativeServiceFunctions.ChangeServiceConfig(ns.Handle, StartType: startupType); if( success ) { StartType = startupType; } } } return success; }
public void ApplyChanges( NativeSCManager scm, SC_START_TYPE startupType, string displayName, string binaryPathName, string description) { using (NativeService ns = new NativeService(scm, InternalID, ACCESS_MASK.SERVICE_CHANGE_CONFIG | ACCESS_MASK.SERVICE_QUERY_STATUS)) { bool success = NativeServiceFunctions.ChangeServiceConfig(ns.Handle, StartType: startupType, DisplayName: displayName, BinaryPathName: binaryPathName); if (success) { StartType = startupType; if( displayName != null ) { SetStringProperty("DisplayName", displayName); } if( binaryPathName != null ) { SetStringProperty("BinaryPathName", binaryPathName); NotifyPropertyChanged("InstallLocation"); } if ((description != null) && !description.Equals(Description)) { ns.Description = description; SetStringProperty("Description", description); } } } }
public override void DoWork() { ACCESS_MASK ServiceAccessMask = SSR.GetServiceAccessMask() | ACCESS_MASK.STANDARD_RIGHTS_READ | ACCESS_MASK.SERVICE_QUERY_STATUS; ServicesDataController sdc = MainWindow.CurrentController as ServicesDataController; using (NativeSCManager scm = new NativeSCManager(sdc.MachineName)) { int serviceIndex = 0; foreach (ServiceDataObject so in Services) { ++serviceIndex; try { SetOutputText(string.Format("Service {0}/{1}: {2} is initially in state {3}", serviceIndex, Services.Count, so.DisplayName, ServicesLocalisation.Localized(so.CurrentState))); if( so.CurrentState == SC_RUNTIME_STATUS.SERVICE_STOPPED ) { ServiceAccessMask &= ~(ACCESS_MASK.SERVICE_STOP); } using (NativeService ns = new NativeService(scm, so.InternalID, ServiceAccessMask)) { bool requestedStatusChange = false; Log.InfoFormat("BEGIN backgroundWorker1_Process for {0}", ns.Description); using (ServiceStatus ss = new ServiceStatus(ns)) { for (int i = 0; i < 100; ++i) { if (Worker.CancellationPending) break; if (!ss.Refresh()) break; SetOutputText(string.Format("Service {0}/{1}: {2} is now in state {3}", serviceIndex, Services.Count, so.DisplayName, ServicesLocalisation.Localized(ss.Status.CurrentState))); if (SSR.HasSuccess(ss.Status.CurrentState)) { Log.Info("Reached target status, done..."); break; // TODO: reached 100% of this service' status reqs. } // if we haven't asked the service to change its status yet, do so now. if (!requestedStatusChange) { requestedStatusChange = true; Log.InfoFormat("Ask {0} to issue its status request on {1}", SSR, ss); if (!SSR.Request(ss)) break; } else if (SSR.HasFailed(ss.Status.CurrentState)) { Log.Error("ERROR, target state is one of the failed ones :("); break; } Thread.Sleep(500); } so.UpdateFrom(ss.Status); Log.Info("END backgroundWorker1_Process"); } } } catch (Exception ex) { Log.Error("Exception caught in PerformServiceStateRequest", ex); } if (Worker.CancellationPending) break; } } }
public ServiceStatus(NativeService service) { Service = service; Memory = Marshal.AllocHGlobal(Marshal.SizeOf(Status)); }