在网络中主机如何控制其他机器的开机关机?需要些什么控件?需要怎样设置IP?能否给个事例!!!!

解决方案 »

  1.   

    用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