C#实现对Windows 服务安装

时间:2022-03-27 03:30:54

Windows服务作用:定时用户消息推送,WEB程序实时统计等

Windows服务创建:C#创建服务的方式也有很多种,建议大家在做之前可以先全面了解一下这方面东西再去动手这样便于解决中间遇到一些比较棘手的小问题。

主要说一种通过SC命令实现服务的创建、修改、查询、卸载、开始、暂停,具体服务工作的业务可以另行完善。

1,创建一个控制台程序,当然也可以写个winform或者其他XXX

2,在创建好的项目中新建一个服务

创建完服务,剩下的就需要代码实现了。

思路:我们将通过模拟在命令窗中输入SC服务命令创建和操作服务,所以这里先把一些公用的方法写出来。

运行命令并返回命令输出消息

/// <summary> /// 运行CMD命令 /// </summary> /// <param>命令</param> /// <returns></returns> public static string Cmd(string[] cmd) { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.StandardInput.AutoFlush = true; for (int i = 0; i < cmd.Length; i++) { p.StandardInput.WriteLine(cmd[i].ToString()); } p.StandardInput.WriteLine("exit"); string strRst = p.StandardOutput.ReadToEnd(); p.WaitForExit(); p.Close(); CloseProcess("cmd.exe");//执行结束,关闭cmd进程 return strRst; }

结束Process 方法

/// <summary> /// 关闭进程 /// </summary> /// <param>进程名称</param> /// <returns></returns> public static bool CloseProcess(string ProcName) { bool result = false; System.Collections.ArrayList procList = new System.Collections.ArrayList(); string tempName = ""; int begpos; int endpos; foreach (System.Diagnostics.Process thisProc in System.Diagnostics.Process.GetProcesses()) { tempName = thisProc.ToString(); begpos = tempName.IndexOf("(") + 1; endpos = tempName.IndexOf(")"); tempName = tempName.Substring(begpos, endpos - begpos); procList.Add(tempName); if (tempName == ProcName) { if (!thisProc.CloseMainWindow()) thisProc.Kill(); // 当发送关闭窗口命令无效时强行结束进程 result = true; } } return result; }

因为服务的请求可能会从系统服务或者应用程序发起请求,所以我们要加一个完善的主方法请求判断,如果是命令行过来的就给用户提供可选的操作菜单,否则运行服务。

定义一个枚举,记录不同请求来源。

/// <summary> /// 定义程序被启用的几种形式 /// </summary> public enum appModel { /// <summary> /// 网页启用 /// </summary> Web, /// <summary> /// 系统服务启用 /// </summary> Service, /// <summary> /// 窗体程序启用 /// </summary> Windows, /// <summary> /// 控制台启用 /// </summary> Console }

主方法内添加状态判断