一个定时网络唤醒的Windows 2000服务(Service)程序

原创 2004年06月02日 19:33:00

单位有两台服务器,一台的Bios中有定时启动的功能,而另外一台没有。所以每天早上到单位后第一件事情就是要去按一下这台服务器的电源开关来开机,不甚其烦!今天编写了一个定时网络唤醒的服务(Service)程序,安装在第一台服务器上,这样当第一台服务器启动后,如果到了时间,就会自动通过网络发送WakeOnLine(WOL)的广播包来唤醒另外一台服务器。

步骤:

启动Delphi,File-New-Other-Server Application,然后定义该Service的属性,如图:

保存文件名称为WakeOnlineSrv.pas,该单元的代码如下:

unit WakeOnlineSrv;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  WakeOnlineExecuteThread;

type
  TWakeOnLineServer = class(TService)
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
  private
    { Private declarations }
    ThdWakeOnline:TWakeOnline;
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  WakeOnLineServer: TWakeOnLineServer;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  WakeOnLineServer.Controller(CtrlCode);
end;

function TWakeOnLineServer.GetServiceController: TServiceController;
begin
  Result:=ServiceController;
end;

procedure TWakeOnLineServer.ServiceStart(Sender: TService;
  var Started: Boolean);
begin
//启动服务
  ThdWakeOnline:=TWakeOnline.Create(False);
  Started:=True;
end;

procedure TWakeOnLineServer.ServiceStop(Sender: TService;
  var Stopped: Boolean);
begin
//停止服务
  ThdWakeOnline.Terminate;
  Stopped:=True;
end;

procedure TWakeOnLineServer.ServicePause(Sender: TService;
  var Paused: Boolean);
begin
//暂停服务
  ThdWakeOnline.Suspend;
  Paused:=True;
end;

procedure TWakeOnLineServer.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
//恢复服务
  ThdWakeOnline.Resume;
  Continued:=True;
end;

end.

再从File-New-Other-Thread Object,新建一个单元文件,保存文件名称为WakeOnlineExecuteThread.pas,代码如下:

unit WakeOnlineExecuteThread;

interface

uses
  Classes, IdUDPClient, SysUtils;

Const
  WakeUpTime='07:50';  //Notice that Not 7:50!
  StopSendTime='07:51';
  TargetComputerMacAddress='00025556E5C5';

type
  TWakeOnLine = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var Sent:Boolean=False;

implementation

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure WakeOnLine.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ WakeOnLine }

procedure TWakeOnLine.Execute;
var
  MacAddr:String;
  FUDP: TIdUDPClient;
  SendCode:string;
  I,J: Integer;
  Bin: String[6];
begin
{ Place thread code here }
  //线程终止时自动释放
  Self.FreeOnTerminate:=True;
  //发送标志
  Sent:=False;
  //如果线程没有被终止则运行下面的循环
  while not Terminated do
  begin
    //如果没有发送,并且已经到了发送的时间
    if (not Sent) and (Copy(FormatDateTime('hh:mm:ss',Now),1,5)=WakeUpTime) then
    begin
      //开始发送
      MacAddr:=TargetComputerMacAddress;

      FUDP:=TIdUDPClient.Create(nil);
      try
        FUDP.Port:=7;
        FUDP.Host:='10.10.10.2';
        FUDP.Active:=True;

        HextoBin(PChar(MacAddr),@Bin,6);
        SendCode:=StringofChar(#255,6);

        //填充缓冲区
        for I:=0 to 15 do
          for J:=0 to 5 do
            SendCode:=SendCode+Bin[J];

        //连续发送6次,保险啊。。。
        for I:=0 to 5 do
          FUDP.Broadcast(SendCode,7);

      finally
        FUDP.Free;
      end;

      Sent:=True;

    end else

    begin
      //如果已经发送,并且已经到了发送时间的下一分钟,则重置发送标志以备下一天还能发送
      if Sent and (Copy(FormatDateTime('hh:mm:ss',Now),1,5)=StopSendTime) then
         Sent:=False;

      //休息30秒,避免浪费资源
      Sleep(30000);
    end;

    //如果有终止信号则终止
    if Terminated then Break;

  end;

end;

end.

最后保存工程文件名称为WakeOnline.dpr,内容如下:

program WakeOnline;

uses
  SvcMgr,
  WakeOnlineSrv in 'WakeOnlineSrv.pas' {WakeOnLineServer: TService},
  WakeOnlineExecuteThread in 'WakeOnlineExecuteThread.pas';

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TWakeOnLineServer, WakeOnLineServer);
  Application.Run;
end.

给这个服务程序选择一个合适的图标,最后编译生成一个名称为WakeOnLine.Exe可执行文件。

到Cmd窗口去安装该服务程序:执行:WakeOnLine -install,会提示服务已经成功安装:

然后鼠标右击我的电脑-管理-服务和应用程序-服务,然后找到刚刚安装好的服务:Wake On Line Server,

可以看到它还没有启动,现在双击它,点击启动:


我在程序中指定的时间是早上7:50分发送广播,启动一个网络包抓取程序,将时间调节到早上7:49来测试一下,等带一会儿,看看抓到了什么:

目标机器启动啦。。。

(说明:Delphi 7编译;CISCO 2950交换机;被唤醒的是IBM X205服务器,注意将Bios中的Wake On Line选项Enable)

iLittle@FAT

2004-6-2

写一个Windows Service定时任务

本次将做一个Windows Serice定时任务,具体步骤,以下将一一讲解 1.打开VS2013,选择文件->新建->项目。 2.在项目中找到【windows服务】项目,重新命名后点击确定...
  • u013538542
  • u013538542
  • 2015年05月28日 11:32
  • 1089

C#创建简单的windows服务项目--定时执行任务

C#编写Windows服务项目--定时执行任务
  • dream_follower
  • dream_follower
  • 2017年02月20日 20:48
  • 1287

一个定时网络唤醒的Windows 2000服务(Service)程序

单位有两台服务器,一台的Bios中有定时启动的功能,而另外一台没有。所以每天早上到单位后第一件事情就是要去按一下这台服务器的电源开关来开机,不甚其烦!今天编写了一个定时网络唤醒的服务(Service)...
  • ilittlefat
  • ilittlefat
  • 2004年06月02日 19:33
  • 823

Android服务开发经验——优雅地活着(唤醒)

大多数的Android应用开发都会将注意力集中在界面功能上,只有少数应用会需要一个Service,尤其是一个长期运行的Service,去进行后台联网、环境检测、媒体播放等功能。Android环境下的S...
  • rongwenbin
  • rongwenbin
  • 2015年10月29日 14:09
  • 1149

.net 定时执行 windows 服务

1.新建项目 --》 Windows 服务2.Service1.cs代码 using System; using System.Collections.Generic; ...
  • dyllove98
  • dyllove98
  • 2013年04月04日 00:07
  • 3712

android 如何在service中定时请求网络

一般来说,android的一些耗时的操作很多都会丢给后台服务来做,而一些公司因为安全原因,再每次请求的网络的时候请求头会隔一段时间变化一次,但是也不能每次请求网络都去拿一次请求头,所以这个时候在ser...
  • qq_32937131
  • qq_32937131
  • 2017年05月15日 16:55
  • 1549

编写一个Windows服务程序,定时从数据库中拿出记录发送邮件

前言:编写一个Windows服务程序,定时从数据库中拿出记录发送邮件。测试环境:Visual Studio 2005 SP1、Windows Server 2003 SP2一、新建项目打开VS2005...
  • DaChu
  • DaChu
  • 2007年11月30日 15:05
  • 2538

windows service程序的入门范例(一)

Windows Service 程序编写方法 1.最简单的创建一个windows service程序 (1)新建一个win32控制台程序 (2)开始->运行->cmd,必须右键—>以管理员身份运行,...
  • shine_journey
  • shine_journey
  • 2016年09月09日 12:29
  • 1416

App之间通过Service相互唤醒保活

App之间通过Service相互唤醒保活场景:有2个APP,分别为A和B,当A活着的时候,试着开启B的后台服务,将原本杀死的B的后台服务程序活起来。反之也一样。示例代码(以A启动B为例):1.先看B的...
  • qq_33689414
  • qq_33689414
  • 2017年02月10日 14:32
  • 2101

做一个windows服务,这个服务用来定时访问一个网站[转贴]

1、新建一个"Windows服务"项目2、然后在工具箱中“组件”栏拖一个"Timer"下来3、双击自动产生下列事件:private void timer1_Elapsed(object sender,...
  • wdcszl
  • wdcszl
  • 2005年04月26日 12:57
  • 5171
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个定时网络唤醒的Windows 2000服务(Service)程序
举报原因:
原因补充:

(最多只允许输入30个字)