public void ChangeConfig(TimeSpan failureResetPeriod, List <SC_ACTION> actions) { SERVICE_FAILURE_ACTIONS sfa = new SERVICE_FAILURE_ACTIONS(); sfa.dwResetPeriod = failureResetPeriod.Seconds; sfa.lpRebootMsg = ""; // delete message sfa.lpCommand = ""; // delete the command to run int len = Marshal.SizeOf(typeof(SC_ACTION)); sfa.cActions = actions.Count; sfa.lpsaActions = Marshal.AllocHGlobal(len * actions.Count); try { for (int i = 0; i < actions.Count; i++) { Marshal.StructureToPtr(actions[i], new IntPtr(sfa.lpsaActions.ToInt64() + i * len), false); } if (!Advapi32.ChangeServiceConfig2(Handle, SERVICE_CONFIG_INFOLEVEL.SERVICE_CONFIG_FAILURE_ACTIONS, ref sfa)) { throw new Exception("Failed to change the failure actions", new Win32Exception()); } } finally { Marshal.FreeHGlobal(sfa.lpsaActions); } }
public void ChangeConfig(TimeSpan failureResetPeriod, List<SC_ACTION> actions) { SERVICE_FAILURE_ACTIONS sfa = new SERVICE_FAILURE_ACTIONS(); sfa.dwResetPeriod = failureResetPeriod.Seconds; sfa.lpRebootMsg = ""; // delete message sfa.lpCommand = ""; // delete the command to run int len = Marshal.SizeOf(typeof(SC_ACTION)); sfa.cActions = actions.Count; sfa.lpsaActions = Marshal.AllocHGlobal(len * actions.Count); try { for (int i = 0; i < actions.Count; i++) { Marshal.StructureToPtr(actions[i], new IntPtr(sfa.lpsaActions.ToInt64() + i * len), false); } if (!Advapi32.ChangeServiceConfig2(Handle, SERVICE_CONFIG_INFOLEVEL.SERVICE_CONFIG_FAILURE_ACTIONS, ref sfa)) throw new Exception("Failed to change the failure actions", new Win32Exception()); } finally { Marshal.FreeHGlobal(sfa.lpsaActions); } }
internal static extern bool ChangeServiceConfig2(IntPtr hService, SERVICE_CONFIG_INFOLEVEL dwInfoLevel, ref SERVICE_FAILURE_ACTIONS sfa);