zoukankan      html  css  js  c++  java
  • 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;
            }
    
        }
    }

    C#操作注册服务卸载服务启动服务停止服务.. .

  • 相关阅读:
    element 三级复选框
    element 复选框问题
    vue 的样式穿透(深度选择器) >>>
    随笔,用于直接复制粘贴
    element 弹窗无法重新赋值的问题
    @vue/cli 4.2.3版本的本地json读取和跨域配置(与旧版本vue不同)
    element表格及接口的对接
    axios的post请求即自动刷新
    Puppeteer 安装及失败原因
    Redis的安装
  • 原文地址:https://www.cnblogs.com/m7777/p/5262157.html
Copyright © 2011-2022 走看看