为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

远程开机关机

2010-12-29 20页 doc 86KB 194阅读

用户头像

is_227243

暂无简介

举报
远程开机关机远程开机关机----从零教起 远程开机关机----从零教起 作为机房管理员,要管理的计算机较多,经常面临大量计算机要开启或关闭,如果每次逐一去开启或关闭,也是一项艰巨的任务,如果能从一台计算机上远程开启或关闭本局域网内的一台或多台计算机,将是一件轻松快乐的事。 一、远程开机 1.对被开启计算机的硬件要求 要实现网络远程开机,对被开启的计算机而言需要电源、主板、网卡3件设备的支持。首先电源必须是符合ATX 2.03标准的ATX电源,而且其+5V的备用电流必须在600mA以上,以便能唤醒网卡。其次是主板和网卡都必须支持Wake-u...
远程开机关机
远程开机关机----从零教起 远程开机关机----从零教起 作为机房管理员,要管理的计算机较多,经常面临大量计算机要开启或关闭,如果每次逐一去开启或关闭,也是一项艰巨的任务,如果能从一台计算机上远程开启或关闭本局域网内的一台或多台计算机,将是一件轻松快乐的事。 一、远程开机 1.对被开启计算机的硬件要求 要实现网络远程开机,对被开启的计算机而言需要电源、主板、网卡3件设备的支持。首先电源必须是符合ATX 2.03标准的ATX电源,而且其+5V的备用电流必须在600mA以上,以便能唤醒网卡。其次是主板和网卡都必须支持Wake-up On LAN(WOL)技术(即远程唤醒)。可通过查看主板网卡使用说明确认,对主板而言可直接查看BIOS设置中的“Power Management Setup”菜单中是否有“Wake on Lan”一项来确认,有则将“Wake on Lan”设置为“Enable”, 开启远程唤醒功能。另外查看BIOS设置中是否有“Wake on PCI Card”,有则说明主板可通过PCI插槽直接向网卡供电,将其设置为“Enable”;没有则需要在主板的WOL接口(3针)和网卡的WOL接口之间连一根三芯远程唤醒电缆,以便主板给网卡供电。 2.远程开机原理 远程开机的实现,主要是向目标计算机发送特殊格式的数据包(包含有6个字节的“FF”和重复16遍的目标计算机的MAC地址,共102个字节的数据),目标计算机的网卡只要检测到数据包中某个片段含有这102个字节的数据,便会将该计算机唤醒,它是AMD公司开发推广的技术。所以远程开机需要知道目标计算机的MAC地址,如果要开启的计算机只有一台,可直接在该计算机上查看MAC地址并记录下来,但是如果有多台计算机需要开启,用这种方式麻烦且容易出错,所以应考虑编程解决这个问题。 3.编程获取局域网内各计算机的MAC地址 怎么获取局域网内各计算机的MAC地址呢?了解网络通信原理的人都知道,网络中两台计算机要相互通信,看似只要相互知道IP地址即可,但那只是在网络层上,在数据链路层上最终必须知道对方计算机网卡的物理地址,即MAC地址。那么网络通信时如何知道其它计算机的MAC地址呢?靠ARP(Address Resolution Protocol)即地址解析协议,通过在局域网内广播ARP请求包,对方即会响应,告知其MAC地址,双方计算机都会将对方的MAC地址及IP地址对应保存在一张地址映射表中,以备通信使用。所以编程时要发送一个ARP请求包来获取指定计算机的MAC地址,Windows API中已提供现成的函数SendARP,其声明如下: DWORD SendARP(IPAddr DestIP, IPAddr SrcIP,PULONG pMacAddr, PULONG PhyAddrLen ); 第一个参数为要获取其MAC地址的目标计算机机的IP地址,参数类型为IPAddr ,其实类型就是unsigned long (用户输入的目的主机的IP地址一般是字符串类型点式IP地址,需要将其转换成一个3 2位的无符号长整数,可用inet_addr函数完成);第二个参数为源机的IP地址;第三个参数为存放目标计算机MAC地址的指针变量;第四个参数为存放目标计算机MAC地址字节长度的指针变量。该函数的定义在iphlpapi.h头文件中,所以要包含#include;该函数的实现在Iphlpapi.lib库文件中,要在项目设置的链接中加入库文件Iphlpapi.lib。(注意:VC6.0不含这两个文件,需网上下载,而VC7.0中含有。)关键代码如下: //将用户输入的目的主机的字符串类型点式IP地址转换成一个3 2位的无符号长整数: ULONG ULDestIP=inet_addr(strIPAddr); //发送ARP请求包获得远程MAC地址: iRusult=SendARP(ULDestIP,(unsigned long)NULL,(PULONG)&ULMacAdd,&PhyAddrLen); //由于获得的MAC地址是6字节的unsigned char数值,不便阅读,所以需要将其转换为字符串: sprintf(strMacAddr,"%.2x-%.2x-%.2x-%.2x-%.2x-%.2x",ULMacAdd[0],ULMacAdd[1],ULMacAdd[2],ULMacAdd[3],ULMacAdd[4],ULMacAdd[5]); 为了实现获取机房内所有机器的MAC地址,可以采取循环的办法发送ARP请求包获得所有机器的MAC地址,考虑机房内机器的IP地址一般都是连续的,所以先获取IP地址最小的那台机器的MAC地址,然后逐一增加IP地址, 循环获取其它机器的IP地址。 //注意IP地址加一前先要将ULONG类型的IP地址从网络字节顺序转换为主机字节顺序,加一后再从主机字节顺序转换为网络字节顺序。 ULDestIP=htonl(ntohl(ULDestIP)+1); 为了使用户能对比观察及关机的需要,程序中还获取了远程机的机器名,并与IP地址、MAC地址一起显示在一个ListCtrl控件中。 //获取远程机器名: struct hostent *RemoteHost; RemoteHost=(struct hostent*)malloc(sizeof(struct hostent)); RemoteHost=gethostbyaddr((char*)&ULDestIP,4,AF_INET); strcpy(strRemoteHostName,RemoteHost->h_name); //将3 2位的无符号长整数IP地址转换成字符串类型点式IP地址: struct in_addr sAddr; sAddr.s_addr=ULDestIP; strcpy(strIPAddr,inet_ntoa(sAddr)); //将远程机的机器名、IP地址、MAC地址一起显示在一个ListCtrl控件中: int iItemNumber=m_ListHostInfo.GetItemCount(); char strNumber[4]; sprintf(strNumber,"%d",iItemNumber+1); m_ListHostInfo.InsertItem(iItemNumber,strNumber); //第一列显示序号 m_ListHostInfo.SetItemText(iItemNumber,1,strRemoteHostName); //第二列显示机器名 m_ListHostInfo.SetItemText(iItemNumber,2,strIPAddr); //第三列显示IP地址 m_ListHostInfo.SetItemText(iItemNumber,3,strMacAddr); //第四列显示MAC地址 为了下次开机的需要,要将ListCtrl控件中显示的机器名、IP地址、MAC地址一一对应保存在一个文件中。远程开机前,需要将文件中的机器名、IP地址、MAC地址读出来显示在ListCtrl控件中,在程序启动后(比如在OnInitDialog函数中)就读出来显示,以便开机和关机都可以使用。文件读写的代码比较简单,这里就不再赘述。 4.发送远程开机数据包 已经知道了要开启计算机的MAC地址,接下来便可发送远程开机的数据包了,采用广播形式发送。关键代码如下: SOCKET SocketData=socket(AF_INET, SOCK_DGRAM, 0); //创建套接字 bool bOptVal=true; int iRusult=setsockopt(SocketData,SOL_SOCKET,SO_BROADCAST,(char FAR *)&bOptVal,sizeof(bOptVal));//设置发送方式为广播发送 SOCKADDR_IN RecvAddr; RecvAddr.sin_family = AF_INET; RecvAddr.sin_port = htons(0); RecvAddr.sin_addr.s_addr=htonl(INADDR_BROADCAST); 为了将ListCtrl控件中所选择的计算机都开启,需要获取所有选择项中的MAC地址,然后构造远程开机数据包,逐机发送。关键代码如下: POSITION pos=m_ListHostInfo.GetFirstSelectedItemPosition(); while(pos) { int nItem=m_AddrListCtrl.GetNextSelectedItem(pos);//获取选择项 strMacAddr=m_ListHostInfo.GetItemText(nItem,3);//获取选择项的第四列数据MAC地址 BYTE ByteMacAddr[6]; //将字符串型式MAC地址转换为6个字节的数值: sscanf(strMacAddr, "%2x-%2x-%2x-%2x-%2x-%2x",&ByteMacAddr[0], &ByteMacAddr[1], &ByteMacAddr[2], &ByteMacAddr[3], &ByteMacAddr[4], &ByteMacAddr[5]); //构造远程开机数据包 BYTE bDataPacket[102]; memset(bDataPacket,0xFF,6);//先写入6个字节的FF for (int i=1; i<=16; i++)//然后循环16次写入6字节的MAC地址 memcpy(bDataPacket+i*6,ByteMacAddr,6); //发送远程开机数据包 iRusult=sendto(SocketData,(char FAR *)bDataPacket,102,0,(SOCKADDR *)&RecvAddr, sizeof(RecvAddr)); } 程序运行的主界面如图1所示。 下载 (20.91 KB) 2010-10-22 00:21 二、远程关机 远程关机的分两种:一种需要在被控制的计算机上编写软件(适用于任何系统)、一种不需要在被控制的计算机上编写软件(只适用于Windows2000、WindowsXP以上任何系统)。 1.有被控端软件 需要编写控制端软件和被控端软件,由控制端软件发送自定义的关机命令字符串,被控端软件收到相应命令后关闭本机。通信方式有TCP、UDP两种,TCP是面向连接的,为了保证可靠的传输可采用它,UDP是无连接的,为了提高传输速度可采用它。由于篇幅限制且UDP方式相对简单,我这里只谈TCP方式。 TCP方式需要通信的一端作为服务端,进行监听(Listen),等待接受(accept)另一端即客户端的连接(connect)。如果仅仅用于关机,将控制端或被控端作为服务端均无不可,但是为了软件的可扩展性,我将控制端作为服务端,关键代码如下: (1)服务端: 先设定服务端地址和端口,创建套接字并绑定,然后将套接字置为监听模式,启动一个线程处理接收。 sockaddr_in ServerSockAddr; ServerSockAddr.sin_addr.s_addr=htonl(INADDR_ANY); ServerSockAddr.sin_family=AF_INET; ServerSockAddr.sin_port=htons(SERVER_PORT); m_SockListen=socket(AF_INET,SOCK_STREAM,0); if (bind(m_SockListen,(sockaddr*)&ServerSockAddr,sizeof(ServerSockAddr))) MessageBox("绑定错误"); else listen(m_SockListen,5); AfxBeginThread(&thread,0); 在线程函数中接受客户端的连接,得到一个新的套接字,用于和刚接受连接的那个客户机通信。为了使用户能将在ListCtrl控件上所选择的计算机正确关机,需要将ListCtrl控件的行号与该行客户机的连接套接字对应,将与各客户机连接的所有套接字存放在一个套接字数组m_SockClient[]中,因此只要将客户机信息在ListCtrl控件中所在行号作为套接字数组m_SockClient []中的下标来对应该客户机的套接字即可。在accept函数的第二个参数中返回了发出连接请求的那个客户机的I P地址信息,因此只要将该I P地址与ListCtrll控件上所列出的所有客户机的I P地址一一比较,找到该客户机信息所在行号,然后将该客户机的套接字保存在以该行号为下标的数组套接字元素中。关键代码如下: UINT thread(LPVOID p) { SOCKET SockAccept; struct sockaddr_in clientaddr; int iAddrLen=sizeof(struct sockaddr); ULONG ulClientIpAddr; CString strIpAddr; CRemoteOnOffDlg *PowerDlg=(CRemoteOnOffDlg*)AfxGetApp()->GetMainWnd(); while(1) { SockAccept=accept(PowerDlg->m_SockListen,(sockaddr*)&clientaddr,&iAddrLen); ulClientIpAddr=clientaddr.sin_addr.s_addr; for(int i=0;im_ListHostInfo.GetItemCount();i++) { strIpAddr=PowerDlg->m_ListHostInfo.GetItemText(i,2); if(ulClientIpAddr==inet_addr(strIpAddr)) { PowerDlg->m_SockClient=SockAccept; //为了知道哪些客户机已建立了连接,我顺便在ListCtrll控件中对应连接客户机那一行的第五列打"√"作为标记: PowerDlg->m_ListHostInfo.SetItemText(i,4,"√"); break; } } } } 最后在用户点击关机按钮或菜单时发送自定义的关机命令字符串: POSITION pos=m_ListHostInfo.GetFirstSelectedItemPosition(); while(pos) { int nItem=m_ListHostInfo.GetNextSelectedItem(pos);//获取选择项 send(m_SockClient[nItem],"POWOFF",COM_STR_LEN,0); closesocket(m_SockClient[nItem]);//关闭套接字 m_ListHostInfo.SetItemText(nItem,4,"×"); } (2)客户端 先解析服务器名,然后用s o c k e t创建一个套接字,再用c o n n e c t创建与服务器的连接。最后等待接收关机命令字符串: CString strServerIPAddr="192.168.1.1";//此处为服务端的IP地址 SOCKET SockClient; sockaddr_in ServerSockAddr; ServerSockAddr.sin_addr.s_addr=inet_addr(strServerIPAddr); ServerSockAddr.sin_family=AF_INET; ServerSockAddr.sin_port=htons(SERVER_PORT); SockClient=socket(AF_INET,SOCK_STREAM,0); while(connect(SockClient,(sockaddr*)&ServerSockAddr,sizeof(ServerSockAddr))!=0); int iAllRecvLen=0,iThisRecvLen=0; char strRecvBuf[COM_STR_LEN+1]=""; while(iThisRecvLen!=SOCKET_ERROR&&iAllRecvLend:\home.txt,回车后,系统将会把你当前的网络配置备份到d盘的home.txt文档中。   然后开始编写bat文件,只有简单的一行:netsh -f d:\home.txt,保存为bat文件,以后双击该文 件就会应用home.txt中的网络配置。如果你觉得两个文件烦,也可以将两个文件写成一个bat文件:   @echo off   netsh interface ip set address name="本地连接" source=static addr=10.10.10.1 mask=255.255.255.0   //设置本地连接的ip地址为:10.10.10.1,子网掩码为:255.255.255.0   netsh interface ip set address name="本地连接" gateway=110.10.10.2 gwmetric=0   //设置网关   netsh interface ip set dns name="本地连接" source=static addr=10.10.10.3 register=PRIMARY   //设置主dns   netsh interface ip add dns name="本地连接" addr=10.10.10.4   //设置备份dns   netsh interface ip set wins name="本地连接" source=static addr=none   //设置wins 2.在局域网中群发信息   如果你局域网中的机器没有禁止信使服务的话(启用方法为:在“运行”里输入:services.msc,双 击里边的Messenger,选择启用即可),当需要定时向全网发送消息时,完全可以用批处理文件实现,实 现方法是:   rem 准备发布“9点断网”给局域网所有计算机   //显示在bat运行前,起到提示作用   pause   //暂停运行,按任意键继续,如果需要定时运行,则不要此段   net send * 9点断网   //发送下“9点断网”的信息,网段中所有的机器,“*”表示所有的机器   将其保存为bat文件,双击运行,再按键盘上的任意键,信息将被发送到全网。如果你希望它定时发 送,则将pause字段去掉,然后将其加入到计划任务中即可。 3.打开或关闭网络共享   当你需要共享某个远程的文件夹时,总要跑到本地去操作,如果数量众多,就有可能跑断腿,我们可 以编写一个自动共享硬盘的bat文件,将文件发给用户,只要其双击该文件,即可实现共享的目的。   @echo off   echo REGEDIT4>c:\1.reg   echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Network\LanMan\E]>>c :\j.reg echo "Flags"=dword:00000102>>c:\j.reg   //Flags用于是确定共享目录的访问方式,其中"Flags"=dword:00000102是完全共享,101是只读, 103是根据密码访问。   echo "Parm1enc"=123:>>c:\1.reg   //Parm1enc键值保存着完全访问方式下的密码   echo "Parm2enc"=456:>>c:\1.reg   //Parm2enc键值保存着只读访问方式下的密码   echo "Path"="D:\">>c:\1.reg   //Path键值是共享文件夹的路径   echo "Remark"="我共享了你的D盘">>c:\1.reg   //Remark键值是备注   echo "Type"=dword:00000000>>c:\1.reg   REGEDIT /S c:\j.reg DEL c:\j.reg cls exit   用户运行这个bat文件后,再注销一下,文件夹就会被共享出来了。如果你每天都需要访问某个共享 文件夹,且这个共享文件夹设置了密码,你还可以让bat 文件帮你在开机的时候先输入密码,你再访问时 就只需要双击打开即可。输入:net use \\192.168.0.1\IPC$ "1234" /user:"administrator,这个表 示访问PC机192.168.0.1上边的共享文件夹,用administrator用户,密码为: 1234.将其保存为bat文件 ,并将其加入到启动组中即可。   共享文件夹管理不当,会产生严重安全隐患,所以有时为了安全,需要批量卸载掉共享文件夹,其实 只要将命令:net share c$ /del加入到bat文件中即可,其中c$为共享文件夹的名字。 4.备份网络数据   (1)你还可以利用bat文件将数据备份到局域网内的某台文件服务器上,这样就省去了复制粘贴的麻 烦,具体做法是:   set source=e:\work   //文件来源为本机e盘的work文件夹   set dest=\\192.168.0.1\backup   //目标文件夹为PC机192.168.0.1的backup文件夹   net use \\192.168.0.1\IPC$ "1234" /user:"administrator"   xcopy %source% %dest% /e /v /r /y /z   //将源盘文件拷贝到目的服务器   将其保存为bat文件,以后只要双击此文件即可完成备份任务。 (2)在某台机器上备份服务器数据库:     在服务器上将数据库目录如(DATA目录)设为只读共享,在某机上新建一个备份目录如(BACK目录, 目录下再新建一目录为DATA),在记事本上敲入如下内容: xcopy \\192.168.0.1\路径\DATA F:\back\DATA\ /c /y /Z /s /E /V /R /I /Q / H 将以上内容存为BAT文件,放在BACK目录下即可。 (3)用RAR备份   1、制作备份文件列表   WinRAR之所以能够自己找到需要的文件进行备份,秘密就在一个列表文件上。这个以1st为后缀名的 文件实际上是一个纯文本文件,其中的内容便是需要备份的文件列表,里面有需要备份的文件或文件夹在 网络上的完整路径,例如“\\computer1\d\lj\work”。以下便是果冻所制作的备份文件列表中的一段:   \\tv1\share\work //1号机上的工作文件夹   \\tv2\share\work //2号机上的工作文件夹 其中,//后面的文字是对前面内容的注释,有了注释能够便于管理,尤其是在需要备份的文件和文件夹数 目众多的情况下。当然,这些注释不会对列表文件造成任何影响。   在服务器的D盘建立一个文件夹,取名为data,在其中新建一个文本文件,输入以上文件列表后,再 另存为bak.1st文件即可(文件名可任意取,但后缀名不能变)。   提示:对局域网内某台电脑上的数据进行备份时,要备份的内容必须处于共享状态,同时还得拥有登 录对方电脑的权限。   2、创建备份命令   完成上述操作后,我们可以通知WinRAR进行数据备份的有关工作了。打开data文件夹,在空白处点击右键,选择“新建→快捷方式”,在弹出的“创建快捷方式”对话框中输入以下命令: >>(http://www.lookxin.cn/html/czxt/index.html)  URL(http://www.lookxin.cn/html/2009-10/8950.html)
/
本文档为【远程开机关机】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索