C#启用服务 关闭服务 安装服务 卸载服务 .(转载好文)

转自 http://www.cnblogs.com/tearer/archive/2011/12/12/2284433.html

一.C#运用ProcessStartInfo安装服务,卸载服务,启用服务,关闭服务的操作!

.C#运用ProcessStartInfo安装服务,卸载服务,启用服务,关闭服务的操作!   
/// <summary>  
.    /// 从CMD运行里面启用服务  
.    /// </summary>  
.    /// <param name="sender"></param>  
.    /// <param name="e"></param>  
.    protected void Button4_Click1(object sender, EventArgs e) 
.    { 
.         //开启服务  
.        ProcessStartInfo a = new ProcessStartInfo(@"c:/windows/system32/cmd.exe","/c  net start 服务名"); 
.        a.WindowStyle = ProcessWindowStyle.Hidden; 
.        Process process = Process.Start(a); 
.         
.         
.    } 
.    protected void Button5_Click1(object sender, EventArgs e) 
.    { 
.         //关闭服务  
.        ProcessStartInfo a = new ProcessStartInfo(@"c:/windows/system32/cmd.exe","/c  net stop 服务名"); 
.        a.WindowStyle = ProcessWindowStyle.Hidden; 
.        Process process = Process.Start(a); 
.         
.         
.    } 
.    protected void Button6_Click1(object sender, EventArgs e) 
.    { 
.          ProcessStartInfo a = new ProcessStartInfo(@"D://zhengxinle//xiangmu//NetView//NetView//Transmit.exe" ,"-install"); 
.        Console.Write("安装服务成功"); 
.        a.WindowStyle = ProcessWindowStyle.Hidden; 
.        Process process = Process.Start(a); 
.} 
.    protected void Button7_Click1(object sender, EventArgs e) 
.    { 
.          ProcessStartInfo a = new ProcessStartInfo(@"D://zhengxinle//xiangmu//NetView//NetView//Transmit.exe" ,"-remove"); 
.        Console.Write("卸载服务成功"); 
.        a.WindowStyle = ProcessWindowStyle.Hidden; 
.        Process process = Process.Start(a); 
.}

 二.通过API函数加载

.using System.Configuration.Install; 
.using System.ServiceProcess; 
.using System.Runtime.InteropServices; 
.
.#region DLLImport    
.        [DllImport("advapi32.dll")]   
.        public static extern IntPtr OpenSCManager(string lpMachineName,string lpSCDB, int scParameter);   
.        [DllImport("Advapi32.dll")]    
.        public static extern IntPtr CreateService(IntPtr SC_HANDLE,string lpSvcName,string lpDisplayName,      
.          int dwDesiredAccess,int dwServiceType, int dwStartType,int dwErrorControl,string lpPathName,     
.          string lpLoadOrderGroup,int lpdwTagId, string lpDependencies,string lpServiceStartName,string lpPassword);  
.        [DllImport("advapi32.dll")]     
.        public static extern void CloseServiceHandle(IntPtr SCHANDLE);   
.        [DllImport("advapi32.dll")]    
.        public static extern int StartService(IntPtr SVHANDLE,int dwNumServiceArgs,string lpServiceArgVectors);   
.        [DllImport("advapi32.dll",SetLastError=true)]    
.        public static extern IntPtr OpenService(IntPtr SCHANDLE,string lpSvcName,int dwNumServiceArgs);   
.        [DllImport("advapi32.dll")]    
.        public static extern int DeleteService(IntPtr SVHANDLE);    
.        [DllImport("kernel32.dll")]    
.        public static extern int GetLastError();   
.        #endregion DLLImport  
///       
.        /// 安装和运行     
.        /// /// C#安装程序路径.     
.        /// /// 服务名     
.        /// /// 服务显示名称.     
.        /// /// 服务安装是否成功.     
.        public bool InstallService(string svcPath, string svcName, string svcDispName)    
.        {     
.            #region Constants declaration.       
.            int SC_MANAGER_CREATE_SERVICE = 0x0002;     
.            int SERVICE_WIN32_OWN_PROCESS = 0x00000010;      
.            //int SERVICE_DEMAND_START = 0x00000003;       
.            int SERVICE_ERROR_NORMAL = 0x00000001;     
.            int STANDARD_RIGHTS_REQUIRED = 0xF0000;     
.            int SERVICE_QUERY_CONFIG = 0x0001;      
.            int SERVICE_CHANGE_CONFIG = 0x0002;     
.            int SERVICE_QUERY_STATUS = 0x0004;      
.            int SERVICE_ENUMERATE_DEPENDENTS = 0x0008;      
.            int SERVICE_START =0x0010;      
.            int SERVICE_STOP =0x0020;     
.            int SERVICE_PAUSE_CONTINUE =0x0040;     
.            int SERVICE_INTERROGATE =0x0080;     
.            int SERVICE_USER_DEFINED_CONTROL =0x0100;      
.            int SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED |        
.                SERVICE_QUERY_CONFIG |      
.                SERVICE_CHANGE_CONFIG |      
.                SERVICE_QUERY_STATUS |       
.                SERVICE_ENUMERATE_DEPENDENTS |       
.                SERVICE_START |       
.                SERVICE_STOP |       
.                SERVICE_PAUSE_CONTINUE |        
.                SERVICE_INTERROGATE |       
.                SERVICE_USER_DEFINED_CONTROL);      
.            int SERVICE_AUTO_START = 0x00000002;     
.            #endregion Constants declaration.       
.            try    {      
.                IntPtr sc_handle = OpenSCManager(null,null,SC_MANAGER_CREATE_SERVICE);     
.                if (sc_handle.ToInt32() != 0)      
.                {        
.                    IntPtr sv_handle = CreateService(sc_handle,svcName,svcDispName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,svcPath,null,0,null,null,null);     
.                    if(sv_handle.ToInt32() ==0)       
.                    {       
.                        CloseServiceHandle(sc_handle);       
.                        return false;       
.                    }      
.                    else      
.                    {       
.                        //试尝启动服务       
.                        int i = StartService(sv_handle,0,null);        
.                        if(i==0)        
.                        {         
.                            return false;   
.                        }        
.                        CloseServiceHandle(sc_handle);       
.                        return true;      
.                    }      
.                }      
.                else       
.                    return false;  
.            }      
.            catch(Exception e)  
.    
.            {      
.                throw e;     
.            }   
.        } 
. ///       
.        /// 反安装服务.    
.        /// ///       
.        /// 服务名.      
.        public bool UnInstallService(string svcName)    
.        {     
.            int GENERIC_WRITE = 0x40000000;     
.            IntPtr sc_hndl = OpenSCManager(null,null,GENERIC_WRITE);      
.            if(sc_hndl.ToInt32() !=0)     
.            {      int DELETE = 0x10000;    
.                IntPtr svc_hndl = OpenService(sc_hndl,svcName,DELETE);     
.                if(svc_hndl.ToInt32() !=0)      
.                {        
.                    int i = DeleteService(svc_hndl);    
.                    if (i != 0)        
.                    {         
.                        CloseServiceHandle(sc_hndl);       
.                        return true;       
.                    }       
.                    else      
.                    {         
.                        CloseServiceHandle(sc_hndl);       
.                        return false;      
.                    }      
.                }      
.                else    
.                    return false;      
.            }      
.            else    
.                return false;   
.        }

 三.加载一个程序集,并运行其中的所有安装程序。

.////////@@@是服务的名字  
.    /// <summary>  
.    /// 用ServiceController启用服务  
.    /// </summary>  
.    /// <param name="sender"></param>  
.    /// <param name="e"></param>  
.    protected void Button5_Click(object sender, EventArgs e) 
.    { 
.        System.ServiceProcess.ServiceController   myController   = 
.              new System.ServiceProcess.ServiceController("@@@");    
.    
. ///ContinuePending 服务即将继续。这对应于 Win32 SERVICE_CONTINUE_PENDING 常数,该常数定义为 0x00000005。    
. //Paused 服务已暂停。这对应于 Win32 SERVICE_PAUSED 常数,该常数定义为 0x00000007。    
. //PausePending 服务即将暂停。这对应于 Win32 SERVICE_PAUSE_PENDING 常数,该常数定义为 0x00000006。    
. //Running 服务正在运行。这对应于 Win32 SERVICE_RUNNING 常数,该常数定义为 0x00000004。    
. //StartPending 服务正在启动。这对应于 Win32 SERVICE_START_PENDING 常数,该常数定义为 0x00000002。    
. //Stopped 服务未运行。这对应于 Win32 SERVICE_STOPPED 常数,该常数定义为 0x00000001。    
. //StopPending 服务正在停止。这对应于 Win32 SERVICE_STOP_PENDING 常数,该常数定义为 0x00000003。    
.        if (myController.Status.Equals(ServiceControllerStatus.Stopped)||myController.Status.Equals(ServiceControllerStatus.StopPending)) 
.        {    
.              myController.Start(); 
.            this.Button5.Text="关闭服务"
.              Response.Write("<mce:script language=javascript><!-- 
.alert('开启'); 
.// --></mce:script>");  
.        }   
.        else 
.        { 
.              myController.Stop(); 
.            this.Button5.Text="开启服务"
.            Response.Write("<mce:script language=javascript><!-- 
.alert('关闭服务'); 
.// --></mce:script>");  
.        } 
.    } 
.一、安装服务: 
.private void InstallService(IDictionary stateSaver, string filepath) 
.        { 
.            try 
.            { 
.                System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController("ServiceName"); 
.                if(!ServiceIsExisted("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); 
.            } 
.        } 
.二、卸载windows服务: 
.        private void UnInstallService(string filepath) 
.        { 
.            try 
.            { 
.                if (ServiceIsExisted("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); 
.            } 
.        } 
.三、判断window服务是否存在: 
.        private bool ServiceIsExisted(string serviceName) 
.        { 
.            ServiceController[] services = ServiceController.GetServices(); 
.            foreach (ServiceController s in services) 
.            { 
.                if (s.ServiceName == serviceName) 
.                { 
.                    return true
.                } 
.            } 
.            return false
.        } 
.四、启动服务: 
.private void StartService(string serviceName) 
.        { 
.            if (ServiceIsExisted(serviceName)) 
.            { 
.                System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName); 
.                if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running && service.Status != System.ServiceProcess.ServiceControllerStatus.StartPending) 
.                { 
.                    service.Start(); 
.                    for (int i = 0; i < 60; i++) 
.                    { 
.                        service.Refresh(); 
.                        System.Threading.Thread.Sleep(1000); 
.                        if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running) 
.                        { 
.                            break
.                        } 
.                        if (i == 59) 
.                        { 
.                            throw new Exception(startServiceError.Replace("$s$", serviceName)); 
.                        } 
.                    } 
.                } 
.            } 
.        } 
.五、停止服务: 
.        private void StopService(string serviceName) 
.        { 
.            if (ServiceIsExisted(serviceName)) 
.            { 
.                System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName); 
.                if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running) 
.                { 
.                    service.Stop(); 
.                    for (int i = 0; i < 60; i++) 
.                    { 
.                        service.Refresh(); 
.                        System.Threading.Thread.Sleep(1000); 
.                        if (service.Status == System.ServiceProcess.ServiceControllerStatus.Stopped) 
.                        { 
.                            break
.                        } 
.                        if (i == 59) 
.                        { 
.                            throw new Exception(stopServiceError.Replace("$s$", serviceName)); 
.                        } 
.                    } 
.                } 
.            } 
.        } 
.注:手动安装window服务的方法: 
.在“Visual Studio 2005 命令提示”窗口中,运行: 
.安装服务:installutil servicepath 
.卸除服务:installutil /u servicepath

 

posted @   ccqin  阅读(244)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示