高分求救——在网络中主机如何控制其他机器的开机关机?急!急!急! 在网络中主机如何控制其他机器的开机关机?需要些什么控件?需要怎样设置IP?能否给个事例!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用Delphi语言实现Windows 2000环境下远程关机笔者单位的20多台计算机的网络是Windows 2000/98对等网,一台Windows 2000计算机接入宽带,其余计算机通过Windows 2000的‘Internet共享’功能共 享上网,为了方便每次通过任何一台计算机可关闭接入宽带的计算机,我自己编写了远程关闭计算机的程序,程序在windows 2000操作系统,Delphi 5.0环境下编译成功。一、编程思路要实现远程控制,涉及到主控机(共享上网的各工作站)和受控机(接入宽带的服务器)。在编程中,采用Client/Server结构,编制两个应用程序,一个为Vclient.exe,装在受控机上,另一个为VServer.exe,装在主控机上。VServer.exe指定要监视的受控机的IP地址和发送指令到客户机的Vclient.exe,客户机的Vclient.exe得到指令后,执行指令。网络中的通信协议采用UDP协议。UDP(User Datagram Protocol,意为用户报文协议)是Internet上广泛采用的通信协议之一。与TCP协议不同,它是一种非连接的传输协议,没有确认机制,可靠性不如TCP,但它的效率却比TCP高。同时,UDP控件不区分服务器端和客户端,只区分发送端和接收端,编程上较为简单,故选用UDP协议,使用Delphi 5.0提供的TNMUDP控件。二、编程要点关闭计算机的的指令使用API函数ExitwindowsEx来实现,此函数定义:Bool ExitWindowsEx( UNIT uflag, / /操作参数 DWORD dwReserved / /保留字,可以设置为零 );其中uflag参数指定关机的类型,此参数必须包括下列值之一;EWX_LOGOFF:关闭所有调用函数ExitWindowsEx的进程的安全环境里运行的进程,然后注销用户;EWX_POWEROFF:关闭系统并关闭电源,系统必须具有电源关闭特性;在Windows 2000(NT)中调用进程必须有SE_shutdown_name特性。EWX_REBOOT:关闭系统并重新启动系统。在Windows 2000(NT)中调用进程必须有SE_shutdown_name特性。EWX_SHUTDOWN:关闭系统使之能安全关闭电源。所有文件缓冲区都被清洗到磁盘,所有运行进程都停止;在Windows 2000(NT)中调用进程必须有SE_shutdown_name特性。EWX_FORCE强迫中止没有响应的进程;三、程序编写1、主控程序的编写(1)、新建一应用程序,其界面如下。将窗体的Name属性设为“server”,加入TNMUDP控件,name属性设为“SUDP”其RemotePort属性设为“1111”,与受控机的LocalPort属性一致;LocalPort属性设为“2222”,与受控机的RemotePort属性一致,Remohost属性值为192.168.101.1(受控机在局域网内IP地址)。加入一命令按钮Button1,(注意:端口值为自定义值,只要不相互冲突) unit verver; interface usesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NMUDP, StdCtrls; type TForm1 = class(TForm) Button1: TButton; SUDP: TNMUDP; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation const bufsize=2048; //缓冲区大小 var rslts ream,tmpstream:Tmemorystream;{$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); //让受控机关闭电源var reqcode:array[0..200] of char; reqcodestr:string; hToken:THandle; tkp : TOKEN_PRIVILEGES; ReturnLength : DWord; begin reqcodestr:='close'; strpcopy(reqcode,reqcodestr); SUDP.SendBuffer(reqcode,30);end; procedure Tform1.winexit(var msg:tmessage);begin msg.result:=1; application.processmessages; application.terminate;end; procedure TForm1.FormCreate(Sender: TObject); //程序启动时创建内存流beginrsltstream:=Tmemorystream.create;tmpstream:=tmemorystream.create;end;procedure TForm1.FormDestroy(Sender: TObject); //程序结束后释放内存流beginrsltstream.free;tmpstream.free;end; end. 2.受控机运行程序(1) 新建一应用程序,设计界面如下: 加入一个TNMUDP控件。窗体的Name属性设为“Client“,TNMUDP控件的Name属性设为“CUDP”。CUDP的Localport属性值设为“1111”,Remoteport属性值设为“2222”。控件CUDP的OnDataReceived事件代码: unit vclient; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NMUDP,mmsystem, StdCtrls; type TForm1 = class(TForm) CUDP: TNMUDP; procedure CUDPDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementationconstbufsize=2048;var bmpstream:Tmemorystream; {$R *.DFM} procedure TForm1.CUDPDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); var ctrlcode:array[0..250] of char; hToken:THandle; tkp : TOKEN_PRIVILEGES; ReturnLength : DWord; begin CUDP.readbuffer(ctrlcode,numberbytes); application.terminate; if ctrlcode[0]+ctrlcode[1]+ctrlcode[2]+ctrlcode[3]+ctrlcode[4]='close' then if (not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_ALL_ACCESS or TOKEN_QUERY, hToken))then //获取优先权beginapplication.Terminate;end; LookupPrivilegeValuew(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid); tkp.PrivilegeCount := 1; tkp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED; ReturnLength :=50;AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,ReturnLength); exitwindowsex(ewx_poweroff,1);end dxLookupTreeView 中KeyField的值如何获取? Label的caption内容显示问题 急!!!帮帮忙,请问如何实现显示所有正在执行的应用程序 初学者除法问题! 急问:请问在com中怎样声明ADORecordSet类型的属性 动态菜单为何多出一个&符号? delphi中如何取得字符串的子串? Delphi制作多语种工程的问题 小 问题 Borland公司的前景;Delphi会有高版本吗? 请问我用ShowMessage()函数后,如何用语句实现关闭此窗口 在DELPHI 7中如何进行多语言系统的开发
享上网,为了方便每次通过任何一台计算机可关闭接入宽带的计算机,我自己编写了远程关闭计算机的程序,程序在windows 2000操作系统,Delphi 5.0环境下编译成功。一、编程思路要实现远程控制,涉及到主控机(共享上网的各工作站)和受控机(接入宽带的服务器)。在编程中,采用Client/Server结构,编制两个应用程序,一个为Vclient.exe,装在受控机上,另一个为VServer.exe,装在主控机上。VServer.exe指定要监视的受控机的IP地址和发送指令到客户机的Vclient.exe,客户机的Vclient.exe得到指令后,执行指令。网络中的通信协议采用UDP协议。UDP(User Datagram Protocol,意为用户报文协议)是Internet上广泛采用的通信协议之一。与TCP协议不同,它是一种非连接的传输协议,没有确认机制,可靠性不如TCP,但它的效率却比TCP高。同时,UDP控件不区分服务器端和客户端,只区分发送端和接收端,编程上较为简单,故选用UDP协议,使用Delphi 5.0提供的TNMUDP控件。二、编程要点关闭计算机的的指令使用API函数ExitwindowsEx来实现,此函数定义:Bool ExitWindowsEx( UNIT uflag, / /操作参数 DWORD dwReserved / /保留字,可以设置为零 );其中uflag参数指定关机的类型,此参数必须包括下列值之一;EWX_LOGOFF:关闭所有调用函数ExitWindowsEx的进程的安全环境里运行的进程,然后注销用户;EWX_POWEROFF:关闭系统并关闭电源,系统必须具有电源关闭特性;在Windows 2000(NT)中调用进程必须有SE_shutdown_name特性。EWX_REBOOT:关闭系统并重新启动系统。在Windows 2000(NT)中调用进程必须有SE_shutdown_name特性。EWX_SHUTDOWN:关闭系统使之能安全关闭电源。所有文件缓冲区都被清洗到磁盘,所有运行进程都停止;在Windows 2000(NT)中调用进程必须有SE_shutdown_name特性。EWX_FORCE强迫中止没有响应的进程;三、程序编写1、主控程序的编写(1)、新建一应用程序,其界面如下。将窗体的Name属性设为“server”,加入TNMUDP控件,name属性设为“SUDP”其RemotePort属性设为“1111”,与受控机的LocalPort属性一致;LocalPort属性设为“2222”,与受控机的RemotePort属性一致,Remohost属性值为192.168.101.1(受控机在局域网内IP地址)。加入一命令按钮Button1,(注意:端口值为自定义值,只要不相互冲突) unit verver; interface usesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NMUDP, StdCtrls; type TForm1 = class(TForm) Button1: TButton; SUDP: TNMUDP; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation const bufsize=2048; //缓冲区大小 var rslts ream,tmpstream:Tmemorystream;{$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); //让受控机关闭电源var reqcode:array[0..200] of char; reqcodestr:string; hToken:THandle; tkp : TOKEN_PRIVILEGES; ReturnLength : DWord; begin reqcodestr:='close'; strpcopy(reqcode,reqcodestr); SUDP.SendBuffer(reqcode,30);end; procedure Tform1.winexit(var msg:tmessage);begin msg.result:=1; application.processmessages; application.terminate;end; procedure TForm1.FormCreate(Sender: TObject); //程序启动时创建内存流beginrsltstream:=Tmemorystream.create;tmpstream:=tmemorystream.create;end;procedure TForm1.FormDestroy(Sender: TObject); //程序结束后释放内存流beginrsltstream.free;tmpstream.free;end; end. 2.受控机运行程序(1) 新建一应用程序,设计界面如下: 加入一个TNMUDP控件。窗体的Name属性设为“Client“,TNMUDP控件的Name属性设为“CUDP”。CUDP的Localport属性值设为“1111”,Remoteport属性值设为“2222”。控件CUDP的OnDataReceived事件代码: unit vclient; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NMUDP,mmsystem, StdCtrls; type TForm1 = class(TForm) CUDP: TNMUDP; procedure CUDPDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementationconstbufsize=2048;var bmpstream:Tmemorystream; {$R *.DFM} procedure TForm1.CUDPDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); var ctrlcode:array[0..250] of char; hToken:THandle; tkp : TOKEN_PRIVILEGES; ReturnLength : DWord; begin CUDP.readbuffer(ctrlcode,numberbytes); application.terminate; if ctrlcode[0]+ctrlcode[1]+ctrlcode[2]+ctrlcode[3]+ctrlcode[4]='close' then if (not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_ALL_ACCESS or TOKEN_QUERY, hToken))then //获取优先权beginapplication.Terminate;end; LookupPrivilegeValuew(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid); tkp.PrivilegeCount := 1; tkp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED; ReturnLength :=50;AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,ReturnLength); exitwindowsex(ewx_poweroff,1);end