/// <summary> /// 卸载服务 /// </summary> /// <param name="serviceName">服务名</param> public static void Uninstall(string serviceName) { IntPtr scmHandle = IntPtr.Zero; IntPtr service = IntPtr.Zero; try { service = OpenService(serviceName, out scmHandle); StopService(service); //停止服务。里面会递归停止从属服务 if (!Win32Class.DeleteService(service) && Marshal.GetLastWin32Error() != 0x430) //忽略已标记为删除的服务。ERROR_SERVICE_MARKED_FOR_DELETE { throw new ApplicationException("删除服务失败!"); } } catch (ServiceNotExistException) { } //忽略服务不存在的情况 finally { if (service != IntPtr.Zero) { Win32Class.CloseServiceHandle(service); Win32Class.CloseServiceHandle(scmHandle);//放if里面是因为如果服务打开失败,在OpenService里就已释放SCM } } }
/// <summary> /// 停止服务 /// </summary> private static void StopService(IntPtr service) { ServiceState currState = GetServiceStatus(service); if (currState == ServiceState.Stopped) { return; } if (currState != ServiceState.StopPending) { //递归停止从属服务 string[] childSvs = EnumDependentServices(service, EnumServiceState.Active); if (childSvs.Length != 0) { IntPtr scm = OpenSCManager(); try { foreach (string childSv in childSvs) { StopService(Win32Class.OpenService(scm, childSv, Win32Class.SERVICE_STOP)); } } finally { Win32Class.CloseServiceHandle(scm); } } Win32Class.SERVICE_STATUS status = new Win32Class.SERVICE_STATUS(); Win32Class.ControlService(service, Win32Class.SERVICE_CONTROL_STOP, ref status); //发送停止指令 } if (!WaitForStatus(service, ServiceState.Stopped, new TimeSpan(0, 0, 30))) { throw new ApplicationException("停止服务失败!"); } }
/// <summary> /// 安装服务 /// </summary> /// <param name="serviceName">服务名</param> /// <param name="displayName">友好名称</param> /// <param name="binaryFilePath">映像文件路径,可带参数</param> /// <param name="description">服务描述</param> /// <param name="startType">启动类型</param> /// <param name="account">启动账户</param> /// <param name="dependencies">依赖服务</param> public static void Install(string serviceName, string displayName, string binaryFilePath, string description, ServiceStartType startType, ServiceAccount account = ServiceAccount.LocalSystem, string[] dependencies = null) { IntPtr scm = OpenSCManager(); IntPtr service = IntPtr.Zero; try { service = Win32Class.CreateService(scm, serviceName, displayName, Win32Class.SERVICE_ALL_ACCESS, Win32Class.SERVICE_WIN32_OWN_PROCESS, startType, Win32Class.SERVICE_ERROR_NORMAL, binaryFilePath, null, IntPtr.Zero, ProcessDependencies(dependencies), GetServiceAccountName(account), null); if (service == IntPtr.Zero) { if (Marshal.GetLastWin32Error() == 0x431)//ERROR_SERVICE_EXISTS { throw new ApplicationException("服务已存在!"); } throw new ApplicationException("服务安装失败!"); } //设置服务描述 Win32Class.SERVICE_DESCRIPTION sd = new Win32Class.SERVICE_DESCRIPTION(); try { sd.description = Marshal.StringToHGlobalUni(description); Win32Class.ChangeServiceConfig2(service, 1, ref sd); } finally { Marshal.FreeHGlobal(sd.description); //释放 } } finally { if (service != IntPtr.Zero) { Win32Class.CloseServiceHandle(service); } Win32Class.CloseServiceHandle(scm); } }
private static bool ExistService(string serviceName) { IntPtr scmHandle = IntPtr.Zero; IntPtr handle = IntPtr.Zero; try { handle = OpenService(serviceName, out scmHandle); if (handle == IntPtr.Zero) { int errCode = Marshal.GetLastWin32Error(); if (errCode == 0x424) { return(false); } } } catch (ServiceNotExistException e) { return(false); } finally { Win32Class.CloseServiceHandle(scmHandle); //关闭SCM Win32Class.CloseServiceHandle(handle); //关闭服务 } return(true); }
/// <summary> /// 打开服务 /// </summary> /// <param name="serviceName">服务名称</param> /// <param name="scmHandle">服务管理器句柄。供调用者释放</param> private static IntPtr OpenService(string serviceName, out IntPtr scmHandle) { scmHandle = OpenSCManager(); IntPtr service = Win32Class.OpenService(scmHandle, serviceName, Win32Class.SERVICE_ALL_ACCESS); if (service == IntPtr.Zero) { int errCode = Marshal.GetLastWin32Error(); Win32Class.CloseServiceHandle(scmHandle); //关闭SCM if (errCode == 0x424) //ERROR_SERVICE_DOES_NOT_EXIST { throw new ServiceNotExistException(); } throw new Win32Exception(); } return(service); }