Windows服务大家都知道,比如Audio、Theme都是大家比较熟悉的服务,他们可以设为自动启动的,并且在注册表的开机自启动项里是没有痕迹的。所以以前曾经用来隐藏过木马。但以前搞的那个木马服务,是通过手工导注册表来做的。从来没正式的开发过一个服务。

之前做的一个项目里有人用Service的方法定时获取远程数据,很犀利,我感觉还是挺有用的。所以今天我也开荒了一下用C#开发Windows服务,正规的体验了一下开发流程。下面就是我做的最入门的例子,MSDN上有类似的教程,但MSDN漏了一些比较重要的步骤,所以大家请看我开荒成功的版本:

首先,在VS2010里建立一个Windows Service项目:

它会提供我们一个默认的Serivce1,可以删掉,换成自己的。比如Fucker.cs,当然,你得把Program.cs里调用的语句换掉:

static void Main()
{
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
	{ 
		new Fucker() 
	};
    ServiceBase.Run(ServicesToRun);
}

创建Fucker.cs后,打开Design视图,从工具箱里拖一个EventLog进来,这个是在Components分类里的。注意,你不能用Windows Form的控件了,不然编译会爆。如果你的Service想用UI的方式弹出消息,只能在build的文件夹里再放一个开发好的专门弹东西的exe了。。。

 

现在,你就可以码这个Service了。先在构造函数里加几句话:

public Fucker()
{
    InitializeComponent();

    if (!System.Diagnostics.EventLog.SourceExists("TheFuckers"))
    {
        System.Diagnostics.EventLog.CreateEventSource("TheFuckers", "FuckerLog");
    }
    evt.Source = "TheFuckers";
    evt.Log = "FuckerLog";
}

首先判断系统的EventLog里有木有“TheFuckers”这个分类,如果木有,就建一个。后面那个参数“FuckerLog”是Log的名称。接下来我们要在服务启动和停止的时候写日志:

protected override void OnStart(string[] args)
{
    evt.WriteEntry("Oh Fuck!");
}

protected override void OnStop()
{
    evt.WriteEntry("Oh Shit!");
}

现在,Fucker的服务就码完了。我们需要添加一个很重要的installer,不然没法安装。方法是在Fucker的设计视图上点右键,选Add Installer:

然后我们要码一下ProjectInstaller.Designer.cs,注意,是Designer.cs,设计器生成的那个代码文件,而不是设计视图上点右键出来的那个ProjectInstaller类。

首先要去掉用户名和密码,不然安装的时候会问你要,它会用这个帐号去启动服务,如果你的帐号没有权限,服务是要安装失败的。注释掉下面的代码:

// this.serviceProcessInstaller1.Password = null;
// this.serviceProcessInstaller1.Username = null;

然后换成LocalSystem身份启动服务:

this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;

如果要更改服务的名称(就是在服务管理器里看到的名字)可以改ServiceName属性: 

this.serviceInstaller1.ServiceName = "Fucker";

现在代码部分已经码完了,最后要在项目属性里改一个Start Up的选项:

然后编译一下,成功之后会在bin文件夹生成一个exe。

然后在VS2010附送的命令行工具里用installutil.exe就可以安装了:

D:\DotNetProjects\TestLab\ShowFuck\bin\Debug>installutil.exe ShowFuck.exe

安装成功会显示消息:

 

现在去Windows的服务管理器里就能够看到我们的服务了:

试试启动再停止服务,我们就可以在事件日志里看见Fuck了,哈哈。