89 lines
3.0 KiB
C#
89 lines
3.0 KiB
C#
using System.IO;
|
|
using System.Runtime.Versioning;
|
|
using static PInvoke.AdvApi32;
|
|
|
|
namespace FastGithub.DomainResolve
|
|
{
|
|
public static class ServiceInstallUtil
|
|
{
|
|
/// <summary>
|
|
/// 安装并启动服务
|
|
/// </summary>
|
|
/// <param name="serviceName"></param>
|
|
/// <param name="binaryPath"></param>
|
|
/// <param name="startType"></param>
|
|
/// <returns></returns>
|
|
[SupportedOSPlatform("windows")]
|
|
public static bool InstallAndStartService(string serviceName, string binaryPath, ServiceStartType startType = ServiceStartType.SERVICE_AUTO_START)
|
|
{
|
|
using var hSCManager = OpenSCManager(null, null, ServiceManagerAccess.SC_MANAGER_ALL_ACCESS);
|
|
if (hSCManager.IsInvalid == true)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
var hService = OpenService(hSCManager, serviceName, ServiceAccess.SERVICE_ALL_ACCESS);
|
|
if (hService.IsInvalid == true)
|
|
{
|
|
hService = CreateService(
|
|
hSCManager,
|
|
serviceName,
|
|
serviceName,
|
|
ServiceAccess.SERVICE_ALL_ACCESS,
|
|
ServiceType.SERVICE_WIN32_OWN_PROCESS,
|
|
startType,
|
|
ServiceErrorControl.SERVICE_ERROR_NORMAL,
|
|
Path.GetFullPath(binaryPath),
|
|
lpLoadOrderGroup: null,
|
|
lpdwTagId: 0,
|
|
lpDependencies: null,
|
|
lpServiceStartName: null,
|
|
lpPassword: null);
|
|
}
|
|
|
|
if (hService.IsInvalid == true)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
using (hService)
|
|
{
|
|
return StartService(hService, 0, null);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 停止并删除服务
|
|
/// </summary>
|
|
/// <param name="serviceName"></param>
|
|
/// <returns></returns>
|
|
[SupportedOSPlatform("windows")]
|
|
public static bool StopAndDeleteService(string serviceName)
|
|
{
|
|
using var hSCManager = OpenSCManager(null, null, ServiceManagerAccess.SC_MANAGER_ALL_ACCESS);
|
|
if (hSCManager.IsInvalid == true)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
using var hService = OpenService(hSCManager, serviceName, ServiceAccess.SERVICE_ALL_ACCESS);
|
|
if (hService.IsInvalid == true)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
var status = new SERVICE_STATUS();
|
|
if (QueryServiceStatus(hService, ref status) == true)
|
|
{
|
|
if (status.dwCurrentState != ServiceState.SERVICE_STOP_PENDING &&
|
|
status.dwCurrentState != ServiceState.SERVICE_STOPPED)
|
|
{
|
|
ControlService(hService, ServiceControl.SERVICE_CONTROL_STOP, ref status);
|
|
}
|
|
}
|
|
|
|
return DeleteService(hService);
|
|
}
|
|
}
|
|
}
|