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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架