重新启动局域网中某一台计算机?(100分)

  • 主题发起人 主题发起人 litterbug
  • 开始时间 开始时间
L

litterbug

Unregistered / Unconfirmed
GUEST, unregistred user!
想做一个美萍网管软件的统一关闭局域网中计算机和重新启动计算机的软件,有没有具体的做法和语句?
求救!
 
必须在本地机器上,才能执行RESTART等,所以你要做两个程序,由服务器发命令,CLIENT如果
收到命令再执行RESTART就行了。
 
對對﹐支持menxin!像別的遠程控制﹐實際上還是在遠程機上調用的命令。
 
具体是怎么做呢?
必须在本地机器上,才能执行RESTART等,所以你要做两个程序,由服务器发命令,CLIENT如果
收到命令再执行RESTART就行了。
 
用NMUDP吧,让受控端接收到restart命令执行相应的重起的API函数
 
第一步,开始Client程序,在其中加入clientsocket控件,取名CS,设置host属性为受控机ip地址,port属性为8888(端口可以随便设置,但不要与默认端口冲突,如80等)。
第二步,在FormCreate事件中加入代码CS.close;CS.open;
第三步,加入个Button,设置caption为“重新启动”,并在ButtonClick事件中加入代码control.Socket.SendText('rebootRemote');
第四步,开始受控方(server)程序,在其中加入serversocket控件,取名SS,设置port属性为8888(刚才的相同),active属性为true;
第五步,在SS的OnclientRead事件中加入代码if Socket.ReceiveText='rebootRemote' then
ExitWindowsEx(EWX_REBOOT,2);
 
---- WinSock是一组API,用于在网络上传输数据和交换信息。虽然现在有很多工具如FTP 程序可以在网络上传输数据和文件,但是通过WinSock编程有更大的灵活性,它不需要关心网络连接的细节,不过用WinSock编程却很复杂。在Delphi中我们并不需要直接与 WinSock的API打交道,因为TClientSocket元件和TServerSocket元件(在Internet页)封装了WinSock的大部分API,使得对WinSock的访问大大简化。下面这个远程控制的例子就很清楚地说明了这个问题,它可以发送一个消息给对方,并能够使对方的电脑关闭、重新启动或重新登录。

一 实现原理
---- 实行远程控制,实际上就是一个服务器程序(以下简称被控程序)和一个客户程序(以下简称主控程序):被控方即为服务器程序,它监听客户的请求,并作出处理;主控方即为客户程序,它连接上服务器后,发出自己的请求,服务器便根据自已的请求进行不同的响应。
二 编写主控程序
----1.新建一个项目Client.dpr,并把一个TClientSocket元件放到Form上,它的属性设置如下:Port设为100(端口号可任意设置,只要求双方统一),其他属性按默认值。在窗体上添加两个TEdit:Edit1,用来输入发送的字符,Edit2用来输入IP地址;添加两个TButton:Button1,点击后用来连接被控机,Button2点击后用来发送字符,然后声明一个私有变量ConnectFlag,表示双方是否连接好:
private
ConnectFlag:Boolean;

----2.ClientSocket1的OnConnect事件代码如下:

procedure TForm1.ClientSocket1Connect
(Sender: TObject;Socket: TCustomWinSocket);
begin
ConnectFlag:=True; //表示连接成功
end;

----3.ClientSocket1的OnError事件代码如下:

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent:
TErrorEvent;var ErrorCode: Integer);
begin
Application.MessageBox(Pchar
(‘不能连接到IP地址 : ' + Edit2.Text+‘。'+
#13+‘可能是监听程序没有运行或网络故障!'),
‘连接错误',MB_OK+MB_ICONSTOP);
ErrorCode := 0;
end;

----4.Button1的OnClick事件代码如下:

procedure TForm1.Button1Click(Sender: TObject);
begin
with ClientSocket1 do begin
if Active then begin
Active := False;//在连接之前首先关闭
ConnectFlag:=False; //置连接标志为假
end;
if Length(Edit2.Text) > 0 then begin
Host := Edit2.Text; //指定IP地址或主机名
Active := True;
end;
end;
end;

----5.Button2的OnClick事件代码如下:

procedure TForm1.Button2Click(Sender: TObject);
begin
if ConnectFlag then
ClientSocket1.Socket.SendText(Edit1.Text)
//如果连接成功则发送字符串
else
Application.MessageBox(PChar(‘没有连接到地址 :
' + Edit2.Text+‘。'+#13+‘检查IP地址是否
存在或是否已经连接!'),‘提示信息',MB_OK+MB
_ICONSTOP);
end;

三 编写被控程序
---- 1.新建一个项目Server.dpr,并把一个TServerSocket元件放到Form上,它的属性设置如下:Active设为True;Port设为100,其他属性按默认值。
----2.ServerSocket1的OnClientRead事件代码如下:

procedure TForm1.ServerSocket1ClientRead
(Sender: TObject;Socket: TCustomWinSocket);
var
Str:PChar;
Code,V:Integer;
begin
Str:=PChar(Socket.ReceiveText);
//接收字符串
Val(Str,V,Code);
//处理接收的字符串,首先转换字符串为整数
if Code<>0 then
Application.MessageBox(Str,
‘提示信息',MB_OK+MB_ICONINFORMATION)
//如果转换后的数据不是一个整型数
//就通过消息框来显示字符串
else
if (V=0)or(V=1)or(V=2) then
ExitWindowsEx(V,0)
//调用Windows的API函数(V=0表示重新登录、
//V=1表示关机、V=2表示重启动)
else
Application.MessageBox
(Str,‘提示信息',MB_OK+MB_ICONINFORMATION);
//转换后数据不为0、1、2时在消息框内显示字符串
end;

----3.修改项目文件,不让窗口显示并且防止它运行两次,修改begin和end之间的代码如下:

begin
Application.Initialize;
if FindWindow(‘TForm1',‘Form1')=
0 then begin //当没有找到Form1时执行下面代码
Application.ShowMainForm:=False; //不显示主窗口
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
end.

四 注意事项
---- 1.网络要装配正确并安装TCP/IP协议,且要正常运行。
----2.首先要运行被控程序。
---- 3.必须知道对方的IP地址或主机名。
---- 上述程序用Delphi5.0编写,在Windows98对等网、 WindowsNT4.0局域网以及Internet上运行通过。最后要声明的是此程序由于能够控制对方的计算机,在实验时要事先经过他人同意,不要给别人造成影响。

以上是我写的一篇文章,如需要原码,则来信:robin_lo@163.com
 
实际上可以在客户端的form.creater()中编一个得到本机的IP得知的函数,使计算机在启动是自动调用客户端监控程序,然后自动监测当本机的IP
地址,并且自动发送给主控机!前提是:设全局变量,使之为主控记得IP地址!
 
一、命令行:iisreset /reboot

二、编程:

#include "stdio.h"
#include "windows.h"
int main()
{
     //定义重起的时候发送给所有用户的消息
     LPSTR msg="Reboot Tool By Lion Hook/nhttp://www.xici.net";
     //尝试用最简单的API函数重起
     if(ExitWindowsEx(EWX_REBOOT, 0))return TRUE;
     if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))return TRUE;
     //因为上面的重起不成功,所以需要调整本进程的特权
     HANDLE hToken;
     TOKEN_PRIVILEGES tkp;
     if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &amp;hToken)) return FALSE;
     //获取重起的特权SE_SHUTDOWN_NAME
     LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &amp;tkp.Privileges[0].Luid);
     tkp.PrivilegeCount = 1;
     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
     AdjustTokenPrivileges(hToken, FALSE, &amp;tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
     //判断是NT内核还是9x内核,选择用不同的方式
     if(!(GetVersion() &amp; 0x80000000))
       InitiateSystemShutdown(NULL, msg, 20, TRUE, TRUE);
     else if (!ExitWindowsEx(EWX_REBOOT, 0))
         if(!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
            return FALSE;
     return TRUE;
}


满意请您尽快给分,谢谢。
 
后退
顶部