分享
 
 
 

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

王朝delphi·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

单位有两台服务器,一台的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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有