原文:https://blog.csdn.net/kingshown_WZ/article/details/89483040
标题:C# Windows服务开发入门
请阅读原文,本文删除了原文很多内容,这个只是学习笔记。
概念
过去称为 NT 服务,允许用户创建可在其自身的 Windows 会话中长时间运行的可执行应用程序。
这些服务可在计算机启动时自动启动,可以暂停和重启,并且不显示任何用户界面。
注意:
LocalSystem 帐户具有广泛的权限,包括能够写入事件日志。
使用此帐户时要特别小心,因为它会增加你受到恶意软件攻击的风险。
对于其他任务,请考虑使用 LocalService 帐户,该帐户用作本地计算机上的非特权用户,并向任意远程服务器提供匿名凭据。
如果你尝试使用 LocalService 账户,此例子将失败,因为它需要写入事件日志的权限。
安装服务
要安装 Windows 服务,必须在安装它的计算机上拥有管理员凭据。进入“Visual Studio 的开发人员命令提示”窗口,导航到包含项目输出的文件夹(默认情况下,它是项目的 inDebug 子目录),输入命令:
installutil MyNewService.exe
启动并运行服务
在 Windows 中,打开“服务”桌面应用程序
按“Windows 徽标键+R”以打开“运行”框,然后输入 services.msc 并按 Enter 或单击“确定”。
若要启动该服务,请从服务的快捷菜单中选择“启动”。
若要停止该服务,请从服务的快捷菜单中选择“停止”。
(可选)可在命令行使用“net start<服务名称>”和“net stop<服务名称>”来启动和停止服务。
卸载服务
使用管理员凭据,进入“Visual Studio 的开发人员命令提示”窗口,导航到包含项目输出的文件夹(默认情况下,它是项目的 inDebug 子目录),输入命令:
installutil.exe /u MyNewService.exe
————————————————
版权声明:本文为CSDN博主「酷爱挑战之王」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kingshown_WZ/article/details/89483040
=============================================================================
完整的开发示例。从新建windows服务,添加安装,设置服务描述和名称,设置账号。
2、添加Windows服务的安装程序。
在默认Service1设计器界面空白处点击右键->添加安装程序,系统会自动新建一个带有默认配置的安装程序类,如下图:
新建完安装程序后,需要给默认的serviceInstaller1和serviceProcessInstaller1做一些基本的属性设置。如下图:
以上工作完成,安装程序配置完毕。
注意:如果不给服务添加安装程序,后面是没法把服务安装至windows系统里的。
3、添加应用程序配置文件(如果有需要的话)。
如果项目有需要,一些应用程序的配置参数可以设置在此文件里(例如:数据库连接字符串)。
4、编写windows服务主代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.IO; namespace OrganizClientSocketService { public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); System.Timers.Timer timer = new System.Timers.Timer(); timer.Elapsed += new System.Timers.ElapsedEventHandler(TimedEvent); timer.Interval = 5000;//每5秒执行一次 timer.Enabled = true; } //定时执行事件 private void TimedEvent(object sender, System.Timers.ElapsedEventArgs e) { //业务逻辑代码 } protected override void OnStart(string[] args) { this.WriteLog("搜才Organiz客户端数据同步服务:【服务启动】"); } protected override void OnStop() { this.WriteLog("搜才Organiz客户端数据同步服务:【服务停止】"); } protected override void OnShutdown() { this.WriteLog("搜才Organiz客户端数据同步服务:【计算机关闭】"); } #region 记录日志 /// <summary> /// 记录日志 /// </summary> /// <param name="msg"></param> private void WriteLog(string msg) { //string path = @"C:log.txt"; //该日志文件会存在windows服务程序目录下 string path = AppDomain.CurrentDomain.BaseDirectory + "\log.txt"; FileInfo file = new FileInfo(path); if (!file.Exists) { FileStream fs; fs = File.Create(path); fs.Close(); } using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write)) { using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine(DateTime.Now.ToString() + " " + msg); } } } #endregion } }
5、编译生成,安装windows服务至Windows系统。
完成开发后,对整各项目进行编译生成。在windows服务开发文件夹“inDebug”下,就是我们需要安装的服务,建议把里面的所有文件拷贝至系统里的某个目录进行安装。
我是把整个个文件夹里的文件拷贝到c:WindowService文件夹下。然后打开目录C:WindowsMicrosoft.NETFramework64v4.0.30319,拷贝里面的InstallUtil.exe文件至c:WindowService文件夹下)。
注意:我的系统是windows10,64位系统,我的服务也将安装至64位系统下,所以我是进入C:WindowsMicrosoft.NETFramework64v4.0.30319目录拷贝InstallUtil.exe文件。各位安装的时候,根据你安装的目标系统,来觉得是拷贝哪个framework哪个版本,具体是64位的还是32位的也由你系统决定。
做好以上工作后就可以安装了,打开cdm就可执行安装了(一定要以管理员身份运行哟,要不然安装时会报“Windows服务安装异常:System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件”)。
以下是安装命令、启动服务命令、停止服务命令、卸载服务命令:
安装命令:C:WindowServiceInstallUtil.exe C:WindowServiceOrganizClientSocketService.exe
启动服务命令:net start 搜才Organiz客户端数据同步服务
关闭服务命令:net stop 搜才Organiz客户端数据同步服务
卸载服务命令:C:WindowServiceInstallUtil.exe -u C:WindowServiceOrganizClientSocketService.exe
==============================================================================
参考:https://docs.microsoft.com/zh-cn/dotnet/framework/windows-services/
标题:开发 Windows 服务应用
使用 Visual Studio 或 .NET Framework SDK,可以通过创建作为服务安装的应用程序来轻松创建服务。
这种类型的应用程序称为 Windows 服务。 借助框架功能,可以创建、安装服务,启动、停止服务并及控制服务的行为。
Windows 服务应用程序介绍
Microsoft Windows 服务(过去称为 NT 服务)允许用户创建可在其自身的 Windows 会话中长时间运行的可执行应用程序。 这些服务可在计算机启动时自动启动,可以暂停和重启,并且不显示任何用户界面。 这些功能使服务非常适合在服务器上使用,或者需要长时间运行的功能(不会影响在同一台计算机上工作的其他用户)的情况。 还可以在与登录用户或默认计算机帐户不同的特定用户帐户的安全性上下文中运行服务。 有关服务和 Windows 会话的详细信息,请参阅 Windows SDK 文档。
可以通过创建作为服务安装的应用程序来轻松创建服务。 例如,假设你想监视性能计数器数据并对阈值作出响应。 可以编写一个侦听性能计数器数据的 Windows 服务应用程序,部署该应用程序并开始收集和分析数据。
可以将服务创建为 Microsoft Visual Studio 项目,并在其中定义代码,以控制可以将哪些命令发送到服务以及在收到这些命令时应采取的操作。 可以发送到服务的命令包括启动、暂停、恢复和停止服务,还可以执行自定义命令。
在创建和生成应用程序之后,可以通过运行命令行实用程序 InstallUtil.exe 并将该路径传递给服务的可执行文件来安装它。 然后,可以使用服务控制管理器来启动、停止、暂停、恢复和配置服务。 还可以在“服务器资源管理器”的“服务”节点中或使用 ServiceController 类完成许多相同的任务。
服务应用程序与其他 Visual Studio 应用程序
服务应用程序与许多其他项目类型的运行方式存在以下几个方面的不同:
-
在项目能够以有意义的方式运行之前,服务应用程序项目创建的已编译可执行文件必须安装在服务器上。 无法通过按 F5 或 F11 来调试或运行服务应用程序;无法立即运行服务或单步执行其代码。 相反,必须安装并启动服务,然后将调试程序附加到服务进程。 有关详细信息,请参阅如何:调试 Windows 服务应用程序。
-
与某些项目类型不同,你必须为服务应用程序创建安装组件。 安装组件在服务器上安装并注册该服务,并使用 Windows 服务控制管理器为服务创建条目。 有关详细信息,请参阅如何:将安装程序添加到服务应用程序。
-
服务应用程序的
Main
方法必须为项目包含的服务发出 Run 命令。Run
方法将服务加载到相应服务器上的服务控制管理器中。如果使用 Windows 服务项目模板,则会自动为你编写此方法。 请注意,加载服务与启动服务不同。 有关详细信息,请参阅下面的“服务生存期”。 -
Windows 服务应用程序在不同于登录用户的交互式工作站的窗口站中运行。 窗口站是一个安全对象,它包含一个剪贴板、一个全局原子集和一组桌面对象。 由于 Windows 服务站不是交互式工作站,因此从 Windows 服务应用程序中引发的对话框将不会显示,并且可能导致程序停止响应。 同样,错误消息应记录在 Windows 事件日志中,而不是在用户界面中引发。
.NET Framework 支持的 Windows 服务类不支持与交互式工作站(即登录用户)的交互。 .NET Framework 也不包括表示工作站和桌面的类。 如果 Windows 服务必须与其他工作站进行交互,则需要访问非管理的 Windows API。 有关详细信息,请参阅 Windows SDK 文档。
Windows 服务与用户或其他工作站的交互必须经过精心设计,以便包括各种场景(如没有登录用户或用户具有一组意外的桌面对象)。 在某些情况下,编写在用户控制下运行的 Windows 应用程序可能更合适。
-
Windows 服务应用程序在其自己的安全上下文中运行,并在用户登录安装这些应用程序的 Windows 计算机之前启动。 应仔细规划要在哪个用户帐户中运行服务;在系统帐户下运行的服务具有比用户帐户更多的权限和特权。
服务生存期
一项服务在其生存期内会经历几个内部状态。 首先,服务会安装到它将在其上运行的系统上。 此过程执行服务项目的安装程序,并将该服务加载到该计算机的服务控制管理器中。 服务控制管理器是 Windows 提供的用于管理服务的中央实用程序。
必须在服务加载完成后启动它。 启动该服务以允许它开始运行。 可以从服务“服务控制管理器”、“服务器资源管理器”,或从通过调用 Start 方法的代码来启动服务。 Start 方法将处理进程传递给应用程序的 OnStart 方法,并处理在那里定义的任何代码。
正在运行的服务可以在此状态下无限期地存在,直到它停止或暂停,或者直到计算机关闭。 服务可以三种基本状态之一存在:Running、Paused 或 Stopped。 该服务还可以报告挂起命令的状态:ContinuePending、PausePending、StartPending 或 StopPending。 这些状态指示命令已发出(例如,暂停正在运行的服务的命令),但尚未执行。 可以查询 Status 以确定服务所处的状态,或者在出现其中任一状态时使用 WaitForStatus 执行操作。
可以从“服务控制管理器”、“服务器资源管理器”,或通过调用代码中的方法来暂停、停止或恢复服务。 其中的每个操作都可以调用服务中的相关过程(OnStop、OnPause 或 OnContinue),可以在其中定义在服务更改状态时执行的其他处理进程。
服务类型
可以使用 .NET Framework 在 Visual Studio 中创建两种服务类型。 作为进程中唯一服务的服务将分配类型 Win32OwnProcess。 与其他服务共享进程的服务将分配类型 Win32ShareProcess。 可以通过查询 ServiceType 属性来检索服务类型。
如果查询未在 Visual Studio 中创建的现有服务,则可能偶尔会看到其他服务类型。 有关这些服务类型的更多信息,请参阅 ServiceType。
服务和 ServiceController 组件
ServiceController 组件用于连接到已安装的服务并操纵其状态;可以使用 ServiceController 组件启动和停止服务,暂停并继续其运行,并将自定义命令发送到服务。 但是,在创建服务应用程序时,无需使用 ServiceController 组件。 事实上,在大多数情况下,ServiceController 组件应存在于定义服务的 Windows 服务应用程序的单独应用程序中。
有关详细信息,请参阅 ServiceController 。
要求
-
必须在 Windows 服务应用程序项目或其他 .NET Framework(启用了在生成并从 ServiceBase 类继承时创建 .exe 文件的项目)中创建服务。
-
包含 Windows 服务的项目必须具有项目及其服务的安装组件。 这可以通过“属性”窗口轻松完成。 有关详细信息,请参阅如何:将安装程序添加到服务应用程序。
请参阅
- Windows 服务应用程序
- 服务应用程序编程体系结构
- 如何:创建 Windows 服务
- 如何:安装和卸载服务
- 如何:启动服务
- 如何:调试 Windows 服务应用程序
- 演练:在组件设计器中创建 Windows 服务应用程序
- 如何:将安装程序添加到服务应用程序
==================================================================
微软提供的示例:https://docs.microsoft.com/zh-cn/dotnet/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer
内容比较完整,而且有很多关联资料可以学习。
在服务中添加一个事件日志,将服务的日志写到系统程序日志中,这个功能如果需要可以学习下。