mirror of https://github.com/winsw/winsw
Add `refresh` command
parent
80323eaab8
commit
40b566d330
|
@ -189,6 +189,28 @@ namespace WinSW.Native
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <exception cref="CommandException" />
|
||||||
|
internal void ChangeConfig(
|
||||||
|
string displayName,
|
||||||
|
ServiceStartMode startMode)
|
||||||
|
{
|
||||||
|
if (!ChangeServiceConfig(
|
||||||
|
this.handle,
|
||||||
|
default,
|
||||||
|
startMode,
|
||||||
|
default,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
IntPtr.Zero,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
displayName))
|
||||||
|
{
|
||||||
|
Throw.Command.Win32Exception("Failed to change service config.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <exception cref="CommandException" />
|
/// <exception cref="CommandException" />
|
||||||
internal void Delete()
|
internal void Delete()
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,6 +8,20 @@ namespace WinSW.Native
|
||||||
{
|
{
|
||||||
internal static class ServiceApis
|
internal static class ServiceApis
|
||||||
{
|
{
|
||||||
|
[DllImport(Libraries.Advapi32, SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "ChangeServiceConfigW")]
|
||||||
|
internal static extern bool ChangeServiceConfig(
|
||||||
|
IntPtr serviceHandle,
|
||||||
|
ServiceType serviceType,
|
||||||
|
ServiceStartMode startType,
|
||||||
|
ServiceErrorControl errorControl,
|
||||||
|
string? binaryPath,
|
||||||
|
string? loadOrderGroup,
|
||||||
|
IntPtr tagId,
|
||||||
|
StringBuilder? dependencies, // TODO
|
||||||
|
string? serviceStartName,
|
||||||
|
string? password,
|
||||||
|
string displayName);
|
||||||
|
|
||||||
[DllImport(Libraries.Advapi32, SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "ChangeServiceConfig2W")]
|
[DllImport(Libraries.Advapi32, SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "ChangeServiceConfig2W")]
|
||||||
internal static extern bool ChangeServiceConfig2(IntPtr serviceHandle, ServiceConfigInfoLevels infoLevel, in SERVICE_DESCRIPTION info);
|
internal static extern bool ChangeServiceConfig2(IntPtr serviceHandle, ServiceConfigInfoLevels infoLevel, in SERVICE_DESCRIPTION info);
|
||||||
|
|
||||||
|
@ -30,7 +44,7 @@ namespace WinSW.Native
|
||||||
ServiceStartMode startType,
|
ServiceStartMode startType,
|
||||||
ServiceErrorControl errorControl,
|
ServiceErrorControl errorControl,
|
||||||
string binaryPath,
|
string binaryPath,
|
||||||
string? loaderOrderGroup,
|
string? loadOrderGroup,
|
||||||
IntPtr tagId,
|
IntPtr tagId,
|
||||||
StringBuilder? dependencies, // TODO
|
StringBuilder? dependencies, // TODO
|
||||||
string? serviceStartName,
|
string? serviceStartName,
|
||||||
|
|
|
@ -159,6 +159,10 @@ namespace WinSW
|
||||||
TestWait();
|
TestWait();
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case "refresh":
|
||||||
|
Refresh();
|
||||||
|
return;
|
||||||
|
|
||||||
case "help":
|
case "help":
|
||||||
case "--help":
|
case "--help":
|
||||||
case "-h":
|
case "-h":
|
||||||
|
@ -642,6 +646,48 @@ namespace WinSW
|
||||||
wsvc.RaiseOnStop();
|
wsvc.RaiseOnStop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Refresh()
|
||||||
|
{
|
||||||
|
if (!elevated)
|
||||||
|
{
|
||||||
|
Elevate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using ServiceManager scm = ServiceManager.Open();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using Service sc = scm.OpenService(descriptor.Id);
|
||||||
|
|
||||||
|
sc.ChangeConfig(descriptor.Caption, descriptor.StartMode);
|
||||||
|
|
||||||
|
sc.SetDescription(descriptor.Description);
|
||||||
|
|
||||||
|
SC_ACTION[] actions = descriptor.FailureActions;
|
||||||
|
if (actions.Length > 0)
|
||||||
|
{
|
||||||
|
sc.SetFailureActions(descriptor.ResetFailureAfter, actions);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isDelayedAutoStart = descriptor.StartMode == ServiceStartMode.Automatic && descriptor.DelayedAutoStart;
|
||||||
|
if (isDelayedAutoStart)
|
||||||
|
{
|
||||||
|
sc.SetDelayedAutoStart(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
string? securityDescriptor = descriptor.SecurityDescriptor;
|
||||||
|
if (securityDescriptor != null)
|
||||||
|
{
|
||||||
|
// throws ArgumentException
|
||||||
|
sc.SetSecurityDescriptor(new RawSecurityDescriptor(securityDescriptor));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (CommandException e) when (e.InnerException is Win32Exception inner && inner.NativeErrorCode == Errors.ERROR_SERVICE_DOES_NOT_EXIST)
|
||||||
|
{
|
||||||
|
ThrowNoSuchService(inner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// [DoesNotReturn]
|
// [DoesNotReturn]
|
||||||
void Elevate()
|
void Elevate()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue