用Delphi设计网络监视器实现计算机监考

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

·22·ComputerEraNo.72004
用Delphi设计网络监视器实现计算机监考
胡开明
(广东松山职业技术学院,广东韶关512126)
摘要:本文介绍用Delphi设计网络监视器实现计算机监考的设计思想,文中给出了实现方法和部分原代码。

关键词:Delphi;API函数;网络监视器;网络资源;句柄
在计算机机房进行监考,学生可以利用网络相互拷贝,且监考教师难以发现。

为有效地防止学生利用网络作弊,可以利用Delphi设计网络监视器,实现计算机监考。

1设计思路
在Delphi程序中,通过API函数可列举出局域网上指定工作组中的所有计算机名称,对每一台计算机列举共享资源,可以达到利用计算机监考的目的。

下面以Win98的对等网络为例,列举“网络邻居”中指定工作组中的用户计算机名称及每台计算机的共享资源,设计网络监视器,实现计算机监考。

2设计步骤
2.1列举“网络邻居”中的工作组中的所有计算机名称在“网络邻居”中,打开“整个网络”,再打开本工作组,可以看到网络中本工作组中所有计算机的名称。

在Delphi程序中,可以用API函数WnetOpenEnum和WnetEnumResource来列举“网络邻居”本工作组中所有计算机的名称。

MicroSoft提供了以下几个API函数:WnetOpenEnum、WnetEnumResource、WNetCloseEnum及一个网络资源数据结构类型NETRESOURCE,用于搜索局域网上的网络资源。

其中NETRESOURCE的定义如下:
typedefstruct—NETRESOURCE{
DWORDdwScope;
DWORDdwType;
DWORDdwDisplayType;
DWORDdwUsage;
LPTSTRIpLocalName;
LPTSTRIpRemoteName;
LPTSTRIpComment;
LPTSTRIpProvider;
)NETRESOURCE:
WNetOpenEnum函数用于获取一个网络资源句柄,可用它的一些返回值进而列举出所有网络资源。

函数原形如下:DWORDWnetOpenEnum(DWORDdwScope,DWORDdwType,DWORDdwUsage,
LPNETRESOURCEIpNetResOurce,
LPHANDLEIphEnum):
参数说明:dwScope,dwType,dwUsage与网络资源数据结构中对应的域的取值范围相同,只是dwUsage多了一个可取值0,表明要列举任何用途的资源,并当dwScope参数的值不是RESOURCE_GLOBALNET时,dwUsage参数被忽略,这三个参数共同决定要列举的资源范围。

LpNetResource是指向结构NETRESOURCE的指针,如果此参数是一个空指针,函数就从网络的最高层逐层搜索符合条件的网络资源,如果参数dwS-cope不是RESOURCE_GLOBALNET,此参数必须为空指针。

参数lphEnum用来保存指向此函数返回的一个句柄的指针,保留给WnetEnumResource用来完成整个列举过程。

如果函数调用成功,返回值是NO_ERROR,否则调用GetLastError函数获取错误代号,作进一步处理。

WnetEnumResource函数该函数功能是在WNetOpe-nEnum的基础上,利用它的返回值,罗列出所有符合条件的Ijc)4络资源,函数原形如下:
DWORDWnetEnumResource(HANDLEhEnum,LPDWORDIpcCount,LPVOIDIpBuffer,LPDWORDIpBufferSize);
参数说明:参数hEnum是由WnetOpenEnum返回的句柄;lpcCount是指向一个整数的指针,该整数指明要求返回的资源项数,当此函数成功返回时,该整数值就是实际上返回的项数;参数lpBuffer是指向一个缓冲区的指针,该缓冲区包含一个NETRESOURCE类型的数组,也就是所返回的资源数据。

Lp-BufferSize指明要存放结果的缓冲区的大小。

该函数成功返回分两种情况,如果列举成功,返回值是NO—ERROR,缓冲区中包含着请求的数据,调用函数的程序能继续调用WnetEnum-Resource以完成整个列举过程;如果返回值是ER-ROR—NO—MORE—ITEMS,表明整个列举已经完成,没有其它资源了;如果返回不是以上两个值,则表明列举过程出错。

WnetCloseEnum函数该函数用来关闭一个列举过程,函数原形如下:
DWORDWnetCIoseEnum(HANDLEhEnum):
参数hEnum是由WnetOpenEnum返回的句柄。

在WNetOpenEnum函数中,将参数lpNetResource中的lpRemoteName部分指定为一个工作组的名称(如“微机三室”),可以获取一个句柄,在WNetEnumResource中利用这个句柄,可以获取一个NetResource类型的数组,每个NetRe-source元素的lpRemoteName部分即为一个计算机名称(如”\\jsj26”)。

其代码如下:
FunctionGetUsers(GroupName:string;varList:TListBox):Boolean;
type
 万方数据
计算机时代2004年第7期·23·
TNetResourceArray=^TNetResource;//网络类型的数组
Var
NetResource:TNetResource;
Buf:Pointer;
Count,BufSize,Res:DWord;
Ind:Integer;
IphEnum:THandle;
Temp:TNetResourceArray;
Begin
Result:=False;
List.Clear;
FillChar(NetResource,SizeOf(NetResource),0):
//初始化网络层次信息
NetResource.IpRemoteName:=@GroupName[1];
/,指定工作组名称
NetResource.dwDisplayType:=
RESOURCEDISPLAYTYPE_sERVER;
NetResource.dwUsage:=RESOURCEUSAGE—CONTAINERNetResource.dwScope:=RESOURCETYPE—DISK;
//列举文件资源信息
//获取指定工作组的网络资源句柄
Res:=WNetOpenEnum(RESOURCE—GLOBALNET,RESOURCETYPE—DISK,
RESOURCEUSAGE—CONTAINER,@NetResource,
IphEnum):
IfRes<>NO—ERRORThenExit;//执行失败
WhileTrueDo,,列举指定工作组的网络资源
Begin
Count:=¥FFFFFFFF;//不限资源数目
BufSize:=8192;II缓冲区大小设置为8K
GetMem(Buf,BufSize);
/,申请内存,用于获取工作组信息
,/获取计算机名称
Res:=WNetEnumResource(IphEnum,Count,
Pointer(Buf),BufSize);
IfRes=ERROR—NO—MORE—ITEMSThenbreak;
|f资源烈举完率
If(Res<>NO—ERROR)thenExit;//执行失败
Temp:=TNetResourceArray(Buf);
ForInd:=0toCount一1do//列举工作组的计算机名称Begin
//获取工作组的计算机名称,+2表示删除”\(¥%¥43%
^#ASD#2@¥斯¥%“),
List.Items.Add(Temp^.IpRemoteName+2):
Inc(Temp);
End;
End;
Res:=WNetCIoseEnum(IphEnum);//关闭一次列举
IfRes<>NO—ERRORThenexit;//执行失败
Result:=True;
FreeMem(Buf);
End:
并通过如下语句,调用上面的函数,将本工作组所有已连接的计算机名称例举在一个listbox框中。

代码如下:procedureTForml.ButtonlClick(Sender:TObjed):
begin
ifeditl.Text=”then
showmessage(。

请输入工作组名’)
elseifnotGetUsers(ed.11.text,listboxl)then
listboxlitems.add(’此工作组中无已连接的计算机’)end;
以下要对列举出的每台机器搜索出所有共享资源。

2.2列举计算机中的共享资源
在WNetOpenEnum函数中,将参数lpNetResource中的lpRemoteName指定为一个计算机名称(如”\\jsj26”),可以获取一个句柄,在WNetEnumResource中利用这个句柄,获取一个NetResource类型的数组,每个NetResource元素的lpRemom—Name即为计算机中的共享资源名称(可以是共享目录、文件名称和共享打印机名称等,如“\\jsj26\共享文件”)。

代码如下:FunctionGetUserResource(UserName:string:varList:TListBox):Boolean;
type
TNetResourceArray=“TNetResource;II网络类型的数组Var
NetResOurce:TNetResource;
Buf:Pointer;
Count,BufSize,Res:DWord;
Ind:Integer;
IphEnum:THandle;
Temp:TNetResourceArray;
Begin
Result:=False;
List.Clear;
FillChar(NetResource,SjZeOf(NetResource),0);
//初始化网络层次信息
NetResource.IpRemoteName:=@UserName[1];
,,指定计算机名称
//获取指定计算机的网络资源句柄
Res:=WNetOpenEnum(RESOURCE—GLOBALNET,RESOURCETYPE_ANY,
RESOURCEUSAGE—CONNECTABLE,@NetResource,
IphEnum);
IfRes<>NO—ERRORThenexit;//执行失败
WhileTrueDo//列举指定工作组的网络资源
Begin
Count:=¥FFFFFFFF;//不限资源数目
BufSize:=8192;//缓冲区大小设置为8K
GetMem(Buf,BufSize);//申请内存,用于获取工作组信息
//获取指定计算机的网络资源名称
Res:2WNetEnumResource(IphEnum,Count,
Pointer(Buf),BufSize);
 万方数据
·24·ComputerEraNo.72004
IfResERROR-No_MORE—nEMshenbreak;
,,资源列举完毕
If(IRes<>NO-_ERROR)thenExit;//'执行失败
Temp:=TNetResourceArray(Buf):
ForInd:=0toCount-1do
Begin
//获取指定计算机中的共享资源名称,+2表示删除”、(¥%¥43%“社ASD#2@¥坩¥%“),
List.Items.Add(Temp^.IpiRemoteName+2):
Inc(Temp);
End;
End;
Res:=WNetCIoseEnum(IphEnum);//关闭一次列举
IfRes<>NO—ERRORThenexit;//执行失败
Result:=True;
FreeMem(Buf);
End;
使用如下语句,调用上面的函数,可以将本工作组中已连接的每一台机器的共享资源全部列举出来。

procedureTForml.Button2C¨ck(Sender:TObject);
i:integer;
begin
ifnotGetUsers(editl.text,listboxl)then
(上接第19页)
privatestaticvoidencrypt(char[]password,StringinFile,StringoutFile)throwsException(
/,将明文加密成密文
Keykey=IoadKey(password);
Ciphercipher=
Cipher.getlnstance(”AES/ECB,PKCS5Padding”):
cipher.init(Cipher.ENCRYPT_MODE,key);//加密模式
F¨elnDutStreamfis=newFilelnputStream(inFile);
FileOutputStreamfos=newFileOutputStream(outFile);
CipherOutputStreamCOS
newCipherOutputStream(fos,cipher);//加密的输出流inttheByte=0:
while((theByte=nsread())!=一1){
COS.write(theByte);

fis.close();
COS.close();

privatestaticvoiddecrypt(char[]password,StringinFile,StringoutFile)throwsException{
//将密文解密成明文
Keykey=IoadKey(password);
Ciphercipher=
Cipher.getlnstance(”AES,ECB,PKCS5Padding”):
begin
iistbox2.Clear;
listboxl.items.add(’此工作组中无计算机’):
end
elsebegin
listbox2.Clear;
for}:=0tolistboxl.Count.1dO
GetUserResource(。

\\'+listboxl.Items[i],listbox2)
end;
iflistbox2.Items.Text=”then
listbox2.Items.Add(’此工作组的所有计算机无共享!’)end;
3结束语
将本工作组中的所有计算机的所有共享资源全部列举在listbox2框中,通过listbox2中列举出的机器共享目录或文件,监考教师可以有效地防止学生利用网络共享,相互拷贝作弊,实现利用计算机监考的目的。

参考文献:
[1】汤庸.Delphi编程范例与元件库参考.海潮出版社,1999.
[2】新智工作室Delphi基础与提高.电子工业出版社,1999
【3】http://www.jsj92.com/cxg/delphi/net/net2.html.2003.10.
【4】http://www.piecust.js01.net/jinjohn/program/delphi/wtj/network/net0009.htm.2003.11.鞠
cipher.init(Cipher.DECRYPT_MODE,key);//解密模式
FilelnputStreamfis=newFilelnputStream(inFile);
FileOutputStreamlos=newFileOutputStream(outFile);
CipherlnputStreamcis=
newCipherlnputStream(fis,cipher);
//加密的输入流
inttheByte=0:
while((theByte=cis.read())I--1)(
fos.write(theByte);

cis.close();
los.close();


6结束语
对称加密的密钥本身也要秘密保存,因为加密和解密都使用相同的密钥。

做好这个工作是非常困难的。

基于口令的加密在一定程度上解决了这个问题。

更好的方法是采用非对称密钥加密。

参考文献:
[1】JessGarms等著.ProfessionalJavaSecurity.WroxPress,2001.[2】BruceSchneier著,吴世忠等译.应用密码学(协议算法与C源程序)机械工业出版社,2000.潮
 万方数据
用Delphi设计网络监视器实现计算机监考
作者:胡开明
作者单位:广东松山职业技术学院,广东,韶关,512126
刊名:
计算机时代
英文刊名:COMPUTER ERA
年,卷(期):2004,(7)
引用次数:0次
1.汤庸Delphi编程范例与元件库参考 1999
2.新智工作室Delphi基础与提高 1999
3.查看详情 2003
4.查看详情 2003
1.期刊论文王艳萍.张锐在Delphi下用Windows API函数实现串行通信-宁夏工程技术2003,2(2)
简单说明了在Msdos和Windows下的编程差别及怎样用Windows API函数在Delphi下建立串行通信机制,着重论述了在Windows下基于串行通信的API函数的功能及使用方法,讨论了怎样打开、设置、读写和关闭串行端口,并给出了Windows API函数在使用时应重点注意的几个问题.通过具体的实例给出了在Delphi下利用Windows环境的通信编程技术实现串行通信的程序设计.
2.期刊论文唐绍华.曾凡秩WIN32 API函数在软件开发中的应用研究-科技信息(学术版)2008(36)
本文从实际情况出发,在用户需求分析的基础上,提出利用WIN32 API函数在TDBGRID中嵌入CHECKBOX组件的方法,并运用Delphi开发工具结合实例对实现方法进行探讨.
3.期刊论文朱毅.ZHU Yi基于Delphi的计算机电源定时管理软件的实现-贵州师范大学学报(自然科学版)2008,26(2)
在阐述电源定时管理的概念、应具备的功能和Windows环境下用于电源管理的Api函数的基础上,利用Delphi实现了具有较强功能的电源定时管理程序.经过实践证明,该程序在节约能源、减少软硬件的损坏几率、提升系统稳定性、降低管理计算机的工作强度等方面有明显的作用.
4.期刊论文徐向阳.曹帮琴.XU Xiang-yang.CAO Bang-qin在DELPHI中实现中英文输入法自动切换-南阳师范学院学报2006,5(9)
针对中文应用系统中普遍存在的因中英文数据项并存引发的输入法切换问题,提出了在Delphi中通过调用Windows API函数实现中英文输入法自动切换的思路和解决方案,并通过一个简化的示例展示了在实际应用系统中的实现途径.
5.学位论文吴燕基于局域网的远程监控技术2002
该论文主要阐述了应用于局域网的远程监控软件的开发.这套远程监控软件以Delphi 6作为开发工具,采用C/S编程模式,分为服务器软件和客户机软件两部分,本地控制端安装客户机软件;安装在远程受控端的服务器软件利用注册表的启动加载项目而自动运行,并通过自我拷贝法始终运行在系统目录下以达到隐藏的目的.为使服务器进程不出现在任务栏和任务管理器中,将其注册为系统服务;并采用写注册表的方式让服务器程序与Txt文件关联,使被监控机上的用户无法将其删除.位于同一局域网内的服务器和客户机之间采用用户数据报协议(UDP)作为运输层通信协议,论文作者还制定了功能编码,使得服务器能够解释客户机通过网络发送的命令,并根据命令进行操作;论文以建立在面向对象基础上的抽象数据类型"流"作为传送数据的载体,通过Delphi提供的NMUDP控件进行"流"的发送和接收以实现服务器和客户机之间的交互.论文应用了大量的Windows的API函数实现了控制远程计算机的鼠标、键盘,限制其系统功能(如关机、重启等);还通过读注册表获取远程计算机的系统信息,并利用Delphi提供TRegistry类实现远程操作注册表;设置了日志钩子以记录并回放远程计算机的键盘操作.
6.期刊论文王静.赵怀林.孙玉强Delphi 环境中的串口通信程序设计方法-微机发展2002,12(4)
主要讨论了在Delphi 5.0程序设计中串行通信程序设计方法,介绍了与串行通信有关的部分Win32 API函数以及Mscomm控件属性,并给出了分别使用查询和事件驱动方式操作串口的例子.
7.期刊论文马晓晨利用文件接口调用Delphi编写的API函数-承德石油高等专科学校学报2002,4(3)
在研究Windows操作系统API函数的基础上,深入分析了不同开发工具所编写的API函数的调用过程,通过事例提出了在VB环境中开发的应用程序利用文件接口调用Delphi编写的API函数的方法.
8.期刊论文黄新革基于Delphi的Windows2000服务器定时关机程序-信息技术2003,27(3)
针对编程关闭Windows2000系统需要取得相关权限这一问题作了一定阐述,详细介绍了解决这一问题的具体实现方法,并列出了部分API函数的原型和相关参数的说明.同时,文中也对怎样定时关闭系统这一问题作了一定介绍.
9.期刊论文胡开明.陈建华.Hu Kaiming.Chen Jianhua基于Delphi的网络监考系统设计-计算机与数字工程2009,37(4)
考试是教学过程中的一个重要环节,随着计算机进一步的普及,越来越多的考试在计算机机房进行,机房考试作弊跟传统笔试作弊有很大区别,具有很强的隐蔽性.如何有效的防止学生作弊,保证考试的公平公,提出用delphi设计网络监考系统的思路和解决办法.达到防止作弊行为,保证考试的公平公正目的,从而实现计算机监考.
10.学位论文马红麟CAD网络教学系统的研究与应用2004
随着计算机和信息技术的发展,知识更新日益加快,传统的教学方式已经满足不了现代教育的需求,这就迫切需要一种全新的知识传播方式.课题"CAD网络教学系统的研究与应用"正是在这种背景下,来源于北京轻工职业技术学院的实际教学需求.该文首先对多媒体网络技术对教学的影响进行了分析
,说明了开发纯软件控制的"CAD网络教学系统"的必要性.分析了网络通信协议的构成、多媒体数据的特点及多媒体数据压缩方法.用Delphi程序设计语言开发了CAD网络教学系统.该系统是一种专用的教学平台,它利用一套软件,在现有的电脑网络设备上,实现了实时动态地传输教学过程.开发工作主要完成如下内容.1.实现教师机对学生机的屏幕广播控制.可自动检测学生机的在线情况,利用UDP协议,实现了教师机屏幕广播等功能.2.实现教师机对学生机的远程控制.利用Delphi中调用API函数技术,实现教师机对学生机的远程关机、远程重启的功能.3.实现教师机对学生机的监看控制.利用端口技术和轮循机制,实现监看学生屏幕、学生操作示范等功能.所开发的系统,现已在北京轻工职业技术学院CAD计算机教室使用.系统运行稳定,传输的画面清晰稳定,使用效果较好.
本文链接:/Periodical_jsjsd200407011.aspx
下载时间:2010年3月18日。

相关文档
最新文档