基于VC6_0实现计算机的远程关机_重起和注销

更新时间:2023-07-26 01:04:38 阅读: 评论:0

2008年第6期福建电脑(下转第180页)
基于VC6.0实现计算机的远程关机、重起和注销
朱高华,郑天明
(周口师范学院河南周口466001)
摘要:在VC6.0下利用WinSock 控件编写服务器与客户端的程序,通过服务器与客户端的通信,调用WINDOWS API 实现对客户端计算机的远程控制,并给出了部门核心代码。在客户端利用微软提供的DETOUR 库和HOOK API 技术,确保客户端程序不被WINDOWS 任务管理器强行关闭,提高服务器对客户端控制的可靠性。
关键词:WINSOCK ,WINDOWS API ,HOOK ,DETOUR ,关机、重起和注销现在很多高校都有学生机房,在管理和维护计算机的时候,经常要让计算机关机、重起和注销等操作。这是一项很繁重的工作。为了避免这种简单重复的操作,笔者开发了一个计算机远程控制系统,较好的解决了这个问题。下文以该系统为例,详细介绍了远程控制的实现。1.设计思想
在C/S 结构中,服务器端和客户端通过TCP/IP 协议进行通信。首先,服务器和客户端通过WINSOCK 控件进行连接,一旦连上,服务器就可以向客户端发送控制消息。客户机收到该控制信息后,对其进行分
析,确认要进行的操作如关机、重起或注销,并调用相应的API 函数,实现该过程。2.服务器和客户端程序实现2.1下面给出主要的代码:2.1.1服务器端:
创建监听的SOCKET
m_pListenSocket=new CListenSocket(this);if(m_pListenSocket->Create(m_Port)){
什么灯具品牌好if(!m_pListenSocket->Listen(5)){
MessageBox("设置监听SOCKET 时失败!","提示!",MB_OK);delete m_pListenSocket;}}el {
MessageBox("创建SOCKET 时失败!","提示!",MB_OK);delete m_pListenSocket;}}
建立连接:
CAcceptSocket*pSocket=new CAcceptSocket(m_pServerDlg);if(Accept(*pSocket)){
MessageBox(NULL,"同意连接请求!","提示!",MB_OK);m_pServerDlg->m_pAcceptList.AddTail(pSocket);}el
delete pSocket;
人文摄影
向客户端发送控制消息:
CAcceptSocket*CurrentSocket=new CAcceptSocket(this);
CurrentSocket=(CAcceptSocket*)this->m_pAcceptList.GetHead();CurrentSocket.Send(ControlMessage,Strlen(ControlMessage),0);
2.1.2客户端程序:
发送连接请求:
CClientSocket*CClientDlg::ConnectToServer(){
CClientSocket*m_pTempSocket=new CClientSocket(this);if(!(m_pTempSocket->Create())){
delete m_pTempSocket;
MessageBox("创建SOCKET 出错!","提示!",MB_OK);return NULL;}
if(!m_pTempSocket->Connect((LPCTSTR)m_Address,m_Port)){
delete m_pTempSocket;
MessageBox("和服务器进行连接出错!","提示!",MB_OK);return NULL;
}
《鲁滨逊漂流记》主要内容return m_pTempSocket;}
客户端调用Receive(ControlMessage,500)接受控制信息,分析控制信息,最后调用相应的API 函数完成操作:
Switch(ControlMessage){
Ca "LOGOFF":
周而复始
::EXitWindowsEx(EWX_LOGOFF,0);
Ca "SHUTDOWN":
::ExitWindwosEx(EWX_SHUTDOWN,0);
Ca "REBOOT":
::ExitWindwosEx(EWX_REBOOT,0);
}
2.2对该系统的进一步完善
为了不影响客户端计算机的使用,我们将客户端窗体进行隐藏,这可以通过重载DefWindowProc 函数来实现:
DefWindowProc(UINT message,WPARAM wParam,LPARAM lParam){
竹子图片大全高清图片if(message==133)
ShowWindow(SW_HIDE);
return CDialog::DefWindowProc(message,wParam,lParam);}
这样也可以实现客户端程序在任务管理器程序栏的隐身,防止客户端被非法关闭。
在使用该系统的过程中,发现有些学生还是可以通过任务管理器关闭进程的功能,强行结束客户端程序,下面我们就来分析如何解决这个问题。我们知道,任务管理器关闭用户进程首先要调用OPENPROCEES 函数打开进程,将获得的进程句柄pHandle 传递给TerminateProcess 函数,强行结
束进程。这就提示我们可以使用HOOK API 技术,拦截OPENPROCESS 函数,如果发现是监控进程,返回一个空值。这样TerminateProcees 就得不到要结束进程的句柄,也就无法结束该进程了。这个拦截功能,我们可以通过微软提供的DETOURS 库简单方便的实现。下面给出部分代码:
#include "detours.h"
#pragma comment(lib,"detours.lib")
HANDLE WINAPI NewOpenProcess (DWORD dwDesiredAccess,BOOL bIn 鄄heritHandle,DWORD dwProcessId );
DETOUR_TRAMPOLINE (HANDLE WINAPI NewOpenProcess (DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId ),OpenProcess);
DWORD GetProcessIdFromName(LPCTSTR name);
HANDLE WINAPI JackOpenProcess (DWORD dwDesiredAccess,BOOL bIn 鄄heritHandle,DWORD dwProcessId )
{
if (dwProcessId ==GetProcessIdFromName((LPCTSTR)"")){
return NULL;
}
HANDLE nResult =NewOpenProcess (dwDesiredAccess,bInheritHandle,dwPro 鄄cessId);return nResult;
}
将该拦截模块做成DLL 文件,客户端程序加载该文件,并为任务管理器程序安装钩子,实现该拦截功能:
179
2008年第6期
福建电脑
(上接第179页)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
hinstDLL=LoadLibrary((LPCTSTR)"Client.dll");
hkprcMsgProc=(HOOKPROC)GetProcAddress(hinstDLL,"MsgProc");
大学生就业创业hhookMsg=SetWindowsHookEx(WH_GETMESSAGE,hkprcMsgProc,hinst鄄DLL,0);
3.结束语
利用该系统将管理员从频繁的开关机中解脱出来,使用证明效果是明显的。对客户端程序的改进更是让监控更加实用可靠。
参考文献:
1.丁展、刘海英Visual C++网络通信编程人民邮电出版社
2.JeffreyRichter《Windows核心编程》机械工业出版社
使用C++开发教学用SimpleTron虚拟计算机
曾浩
阴暑
(南京化工职业技术学院信息系江苏南京210048)
摘要:本文研究了如何开发一种称为SimpleTron的虚拟计算机,讨论了该计算机的结构和性能,并指出其在教学中的应用价值。
关键词:虚拟计算机
随着计算机软硬件技术的进步,计算机的人机接口变得越来越友好,使用也越来越方便,同时,由于软硬件的层层封装,计算机底层与使用者越来越远,从而增加了学习计算机原理课程的学生的学习困难,尤其是很难找到一个合适的实验平台。一些虚拟机软件如VMware,模拟的是现实计算机,并没有体现计算机的本质特征,源程序也没有公开。本文使用C++开发了一个称为SimpleTron的虚拟计算机,它具有CPU,控制器,内存等体现计算机本质特征的部分,源程序全部公开,可以供教学时参考,并可以在此基础上让学生扩充和改进该计算机的功能以作练习之用,使大学的计算机基础,计算机原理等相关课程有一个良好的学习开发平台。作者在教学中使用之取得了良好的效果。
Simpletron计算机,顾名思义,它是一个简单的机器,同时它也具有强大的功能。Simpletron只能运用于它能理解的唯一语言,即Simpletron机器语言(简称SML)编写的程序。
Simpletron包含一个累加器(一个"特殊寄存器"),存放Simpletron用于计算和处理的各种信息。Simp
letron中的所有信息都是按照"字"来处理的。字是带符号的4位十进制数,例如+ 3364,-1293,+0007,-0001,等等。Simpletron带有100个字的内存,并且这些字通过它们的位置编号00,01,…,99被引用。在运行一个SML程序之前,我们必须把程序载入或者放置到内存。每个SML程序的第一条指令(或语句)总是放在位置00处。模拟器从这个位置开始执行。
使用SML编写的每条指令占用Simpletron内存中的一个字;因此,指令是带符号的4位十进制数。假设SML指令的符号总是正号,但是数据字的符号可正可负。Simpletron内存中的每个位置可以包含一条指令,程序使用的一个数据值或未用到的(即未定义的)内存区。每个SML指令的前两位数字是操作码,指定要进行的操作。
SML指令的后两位数字是操作数,也就是要操作的字的内存位置。
现在让我们考虑下面的SML程序(如图2所示)从键盘读入两个数,然后计算并打印它们的和。指令+1007从键盘读入第一个数字,并把它存放的内存位置07(初始化为0)处。指令+ 1008读入下一个数到内存位置08处。载入指令+2007,把第一个数放置(复制)到累加器,然后加法指令+3008把第二个数和累加器中的数相加。所有的SML算术运算指令都把它们的结果留在累加器中。存储指令+2109把结果放回(复制)到内存位置09。然后,写入指令+1109取得这个数并打印它9作为一个带符号的4位十进制)。停止指令+4300终止执行。
下面对SimpleTron的软件结构作一分析。首先是一个初始化模块,用于定义各个指令代码,初始化一个简单数组作为内存区域,定义各个寄存器,并且全部清零。然后启动一个输入模块,用于接受用户输入的SML指令,输入完毕后进入执行逻辑模块。执行逻辑模块先将指令的操作码和操作数分离,用一个多路分支语句判断操作码从而执行不同的操作,模拟了CPU和控制器的运作。最后,通过一个屏幕输出模块将机器状态输出供参考。
以上简要描述了SimpleTron的原理和结构,在实际使用中,还可以作必要的扩充,如扩展内存容量,对内存作分区保护等,这些内容在教学上具有很大的使用价值。
参考文献:
防火区
1.H.M.Deitel,P.J.Deitel.张引等译C++大学教程(第五版).北京:电子工业出版社,2007.
2.张福炎,孙志挥.信息技术教程.南京大学出版社,2004.
3.徐君毅.单片微型计算机原理.北京:人民邮电出版社,2004.
180

本文发布于:2023-07-26 01:04:38,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1096731.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:计算机   指令   客户端   内存
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图