C#操作注册服务卸载服务启动服务停止服务.. .
using Microsoft.Win32; using System; using System.Collections; using System.Collections.Generic; using System.Configuration.Install; using System.Linq; using System.Reflection; using System.ServiceProcess; using System.Text; namespace TextWindowsServers { /// <summary> /// 注册服务 /// </summary> public class RegisteredServer { /// <summary> /// 它用于保存执行提交、回滚或卸载操作所需的信息。 /// </summary> IDictionary stateSaver = new Hashtable(); private static RegisteredServer _instance = null; private static readonly object SynObject = new object(); public static RegisteredServer Instance { get { // Syn operation. lock (SynObject) { return _instance ?? (_instance = new RegisteredServer()); } } } /// <summary> /// 注册服务 /// </summary> /// <param name="path"></param> /// <param name="name"></param> public void Registered(string path) { try { string name = GetServiceName(path.Trim());//通过服务路径获取服务名称 if (IsExistedService(name))//服务是否存在 { if (ServiceIsRunning(name))//服务是否运行 { if (!StopService(name))//停止服务 throw new Exception("停止服务出现异常"); } UnInstallService(path, name);//卸载服务 } InstallService(stateSaver, path, name);//安装服务 ChangeServiceStartType(2, name);//改变服务类型 ServiceStart(name); //运行服务 } catch (Exception ex) { //Log.Error(ex); } } /// <summary> /// 获取Windows服务的名称 /// </summary> /// <param name="serviceFileName">文件路径</param> /// <returns>服务名称</returns> private string GetServiceName(string serviceFileName) { try { Assembly assembly = Assembly.LoadFrom(serviceFileName); Type[] types = assembly.GetTypes(); foreach (Type myType in types) { if (myType.IsClass && myType.BaseType == typeof(System.Configuration.Install.Installer)) { FieldInfo[] fieldInfos = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Default | BindingFlags.Instance | BindingFlags.Static); foreach (FieldInfo myFieldInfo in fieldInfos) { if (myFieldInfo.FieldType == typeof(System.ServiceProcess.ServiceInstaller)) { ServiceInstaller serviceInstaller = (ServiceInstaller)myFieldInfo.GetValue(Activator.CreateInstance(myType)); return serviceInstaller.ServiceName; } } } } return ""; } catch (Exception ex) { throw ex; } } /// <summary> /// 判断服务是否存在 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> private bool IsExistedService(string serviceName) { ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController s in services) { if (s.ServiceName == serviceName) { return true; } } return false; } /// <summary> /// 验证服务是否启动 /// </summary> /// <returns></returns> private bool ServiceIsRunning(string serviceName) { ServiceController service = new ServiceController(serviceName); if (service.Status == ServiceControllerStatus.Running) { return true; } else { return false; } } /// <summary> /// 停止服务 /// </summary> /// <param name="serviseName"></param> /// <returns></returns> private bool StopService(string serviseName) { try { ServiceController service = new ServiceController(serviseName); if (service.Status == ServiceControllerStatus.Stopped) { return true; } else { TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 10); service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); } } catch { return false; } return true; } /// <summary> /// 卸载服务 /// </summary> /// <param name="filepath"></param> private void UnInstallService(string filepath, string serviceName) { try { if (IsExistedService(serviceName)) { //UnInstall Service AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller(); myAssemblyInstaller.UseNewContext = true; myAssemblyInstaller.Path = filepath; myAssemblyInstaller.Uninstall(null); myAssemblyInstaller.Dispose(); } } catch (Exception ex) { throw new Exception("unInstallServiceError/n" + ex.Message); } } /// <summary> /// 安装服务 /// </summary> /// <param name="stateSaver"></param> /// <param name="filepath"></param> private void InstallService(IDictionary stateSaver, string filepath, string serviceName) { try { System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName); if (!IsExistedService(serviceName)) { //Install Service AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller(); myAssemblyInstaller.UseNewContext = true; myAssemblyInstaller.Path = filepath; myAssemblyInstaller.Install(stateSaver); myAssemblyInstaller.Commit(stateSaver); myAssemblyInstaller.Dispose(); //--Start Service service.Start(); } else { if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running && service.Status != System.ServiceProcess.ServiceControllerStatus.StartPending) { service.Start(); } } } catch (Exception ex) { throw new Exception("installServiceError/n" + ex.Message); } } /// <summary> /// 启动服务 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> private static bool ServiceStart(string serviceName) { try { ServiceController service = new ServiceController(serviceName); if (service.Status == ServiceControllerStatus.Running) { return true; } else { TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 10); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } } catch { return false; } return true; } /// <summary> /// 设置服务启动类型 /// 2为自动 3为手动 4 为禁用 /// </summary> /// <param name="startType"></param> /// <param name="serviceName"></param> /// <returns></returns> private static bool ChangeServiceStartType(int startType, string serviceName) { try { RegistryKey regist = Registry.LocalMachine; RegistryKey sysReg = regist.OpenSubKey("SYSTEM"); RegistryKey currentControlSet = sysReg.OpenSubKey("CurrentControlSet"); RegistryKey services = currentControlSet.OpenSubKey("Services"); RegistryKey servicesName = services.OpenSubKey(serviceName, true); servicesName.SetValue("Start", startType); } catch (Exception ex) { return false; } return true; } } }

浙公网安备 33010602011771号