調用的Windows服務應用程序網址:http://www.cnblogs.com/pingming/p/5115304.html
一、引用
二、公共靜態類:可以單獨放到類庫里
using System; using System.Collections; using System.Collections.Generic; using System.Configuration.Install; using System.Linq; using System.ServiceProcess; using System.Text; using Microsoft.Win32; namespace CM.Web.UI { public static class WindowsServiceHelper { #region 已封裝Window服務 /// <summary> /// 安裝服務 /// </summary> /// <param name="NameService">Windows服務顯示名稱</param> /// <returns>存在返回 true,否則返回 false;</returns> public static bool InstallService(string serviceName) { bool flag = true; if (!IsServiceIsExisted(serviceName)) { try { string location = System.Reflection.Assembly.GetExecutingAssembly().Location; string serviceFileName = location.Substring(0, location.LastIndexOf('\\') + 1) + serviceName + ".exe"; //測試用的絕對路徑 //string serviceFileName = @"F:\CM.WebSite\KJLMDemo\bin\Debug\KJLMDemo.exe"; InstallMyService(null, serviceFileName); } catch { flag = false; } } return flag; } /// <summary> /// 卸載服務 /// </summary> /// <param name="NameService">Windows服務顯示名稱</param> /// <returns>存在返回 true,否則返回 false;</returns> public static bool UninstallService(string serviceName) { bool flag = true; if (IsServiceIsExisted(serviceName)) { try { string location = System.Reflection.Assembly.GetExecutingAssembly().Location; string serviceFileName = location.Substring(0, location.LastIndexOf('\\') + 1) + serviceName + ".exe"; //測試用的絕對路徑 //string serviceFileName = @"F:\CM.WebSite\KJLMDemo\bin\Debug\KJLMDemo.exe"; UnInstallMyService(serviceFileName); } catch { flag = false; } } return flag; } /// <summary> /// 檢查Windows服務是否存在 /// </summary> /// <param name="NameService">Windows服務顯示名稱</param> /// <returns>存在返回 true,否則返回 false;</returns> public static bool IsServiceIsExisted(string serviceName) { ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController s in services) { if (s.ServiceName.ToLower() == serviceName.ToLower()) { return true; } } return false; } /// <summary> /// 安裝Windows服務 /// </summary> /// <param name="stateSaver">集合</param> /// <param name="filepath">Windows服務程序文件路徑</param> private static void InstallMyService(IDictionary stateSaver, string filePath) { AssemblyInstaller AssemblyInstaller1 = new AssemblyInstaller(); AssemblyInstaller1.UseNewContext = true; AssemblyInstaller1.Path = filePath; AssemblyInstaller1.Install(stateSaver); AssemblyInstaller1.Commit(stateSaver); AssemblyInstaller1.Dispose(); } /// <summary> /// 卸載Windows服務 /// </summary> /// <param name="filePath">Windows服務程序文件路徑</param> private static void UnInstallMyService(string filePath) { AssemblyInstaller AssemblyInstaller1 = new AssemblyInstaller(); AssemblyInstaller1.UseNewContext = true; AssemblyInstaller1.Path = filePath; AssemblyInstaller1.Uninstall(null); AssemblyInstaller1.Dispose(); } /// <summary> /// 判斷某個Windows服務是否啟動 /// </summary> /// <param name="serviceName">Windows服務顯示名稱</param> /// <returns>bool</returns> public static bool IsServiceStart(string serviceName) { ServiceController psc = new ServiceController(serviceName); bool bStartStatus = false; try { if (!psc.Status.Equals(ServiceControllerStatus.Stopped)) { bStartStatus = true; } return bStartStatus; } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 修改服務的啟動項 2為自動,3為手動 /// </summary> /// <param name="startType">2為自動,3為手動</param> /// <param name="serviceName">Windows服務顯示名稱</param> /// <returns>bool</returns> public 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; } /// <summary> /// 啟動服務 /// </summary> /// <param name="serviceName">Windows服務顯示名稱</param> /// <returns>bool</returns> public static bool StartService(string serviceName) { bool flag = true; if (IsServiceIsExisted(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) { flag = false; } } } } return flag; } /// <summary> /// 停止服務 /// </summary> /// <param name="serviceName">Windows服務顯示名稱</param> /// <returns>bool</returns> public static bool StopService(string serviceName) { bool flag = true; if (IsServiceIsExisted(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) { flag = false; } } } } return flag; } #endregion } }
三、靜態公共類操作Windows服務-------控制台程序
using System; using System.Collections; using System.Collections.Generic; using System.Configuration.Install; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; using Microsoft.Win32; namespace ConsoleService { class Program { static void Main(string[] args) { Console.WriteLine("Window服務應用程序"); Console.WriteLine("請選擇,[1]安裝服務 [2]卸載服務 [3]啟動服務 [4]關閉服務 [5]暫停/繼續 [6]檢測服務"); var rs = int.Parse(Console.ReadLine()); //一、通過封裝類操作Windows服務 switch (rs) { case 1://安裝服務 InstallService("ServiceDemo"); Console.WriteLine("安裝成功"); break; case 2://卸載服務 UninstallService("ServiceDemo"); Console.WriteLine("卸載成功"); break; case 3://啟動服務 StartService("ServiceDemo"); Console.WriteLine("啟動服務成功"); break; case 4://關閉服務 StopService("ServiceDemo"); Console.WriteLine("關閉服務成功"); break; case 5://暫停/繼續 ServiceController serviceControllerPauseToContinue = new ServiceController("KJLMDemo"); if (serviceControllerPauseToContinue.CanPauseAndContinue) { if (serviceControllerPauseToContinue.Status == ServiceControllerStatus.Running) serviceControllerPauseToContinue.Pause(); else if (serviceControllerPauseToContinue.Status == ServiceControllerStatus.Paused) serviceControllerPauseToContinue.Continue(); } break; case 6://判斷服務是否開啟 Console.WriteLine("服務狀態:" + IsServiceStart("ServiceDemo")); break; default: break; } Console.ReadKey(); } } }
四、通過SC命令操作Windows服務-------控制台程序
using System; using System.Collections; using System.Collections.Generic; using System.Configuration.Install; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; using Microsoft.Win32; namespace ConsoleService { class Program { static void Main(string[] args) { Console.WriteLine("Window服務應用程序"); Console.WriteLine("請選擇,[1]安裝服務 [2]卸載服務 [3]啟動服務 [4]關閉服務 [5]暫停/繼續 [6]檢測服務"); var rs = int.Parse(Console.ReadLine());
//二、通過SC命令操作Windows服務 switch (rs) { case 1://安裝服務 //取當前服務的路徑bin/debug下面的exe文件 string path = @"F:\CM.WebSite\KJLMDemo\bin\Debug\KJLMDemo.exe"; Process.Start("sc", "create KJLMDemo binPath= \"" + path + "\" "); Console.WriteLine("安裝成功"); break; case 2://卸載服務 Process.Start("sc", "delete KJLMDemo"); Console.WriteLine("卸載成功"); break; case 3://啟動服務 ServiceController serviceControllerStart = new ServiceController("KJLMDemo"); serviceControllerStart.Start(); Console.WriteLine("啟動服務成功"); break; case 4://關閉服務 ServiceController serviceControllerStop = new ServiceController("KJLMDemo"); serviceControllerStop.Stop(); Console.WriteLine("關閉服務成功"); break; case 5://暫停/繼續 ServiceController serviceControllerPauseToContinue = new ServiceController("KJLMDemo"); if (serviceControllerPauseToContinue.CanPauseAndContinue) { if (serviceControllerPauseToContinue.Status == ServiceControllerStatus.Running) serviceControllerPauseToContinue.Pause(); else if (serviceControllerPauseToContinue.Status == ServiceControllerStatus.Paused) serviceControllerPauseToContinue.Continue(); } break; case 6://判斷服務是否開啟 ServiceController serviceControllerIsEnabled = new ServiceController("KJLMDemo"); string Status = serviceControllerIsEnabled.Status.ToString(); Console.WriteLine("服務狀態:"+Status); break; default: break; } } }