优秀的毕业设计论文网
计算机 JAVA 电子信息 单片机 机械机电 模具 土木工程 建筑结构 论文
热门搜索词:网络 ASP.NET 汽车 电气 数控 PLC

029_Windows系统辅助管理程序

以下是资料介绍,如需要完整的请充值下载.
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
  
资料介绍:

2.3 软件设计
(1)功能模块初步设计
通过对用户需求调研并分析,确定系统应具备的功能,包括:获取主机名和IP地址,获取物理地址,显示本机用户信息,显示工作站信息,列举本机服务,测试目的地是否可达,文件查找,各功能设计如下:
1、获取主机名和IP地址:
对用户而言要想轻松地在网络中遨游,首先必须对本地主机的网络配置信息有清晰的了解,如主机名、IP地址、所注册的域等。在网络编程中,一般都需要获取本地主机的主机名和IP地址,起码应该将这些信息显示给用户,让其感到程序界面的友好性。
2、获取物理地址:
Windows下的TCP/IP协议允许计算机通过网络与另一台计算机通过IP地址、主机名或NETBIOS名称进行通信。但是,当计算机间使用上述三种名称进行通信时,这些名称都必须解析为硬件地址,即MAC地址。如何获取计算机上安装的网卡的物理地址是一个重要问题。
3、显示本机用户信息:
由于Windows设计已达到了C2标准,C2标准建立在用户级别的权限管理基础上,因此任何Windows中与安全性有关的问题都要先查看用户账号的相关信息,用户账号是Windows常用的最小的用户身份标识。任何行为都直接与它的用户账号相联系。但是,管理整个系统的所有用户的权限是一个费时费力的工作,特别是用户很多的情况下。通过一个简易的用户显示工具,管理员可以很快的知道用户对某种资源有什么权限。

[资料来源:THINK58.com]


4、显示工作站信息:
获取工作站的配置信息(如工作站的操作平台信息、操作系统版本信息等)以及工作站上的登陆用户信息。
5、列举本机服务:
了解网络机器提供的服务信息非常有用,它可以让用户充分了解机器的性能和功用,对服务进行管理。
6、测试目的地是否可达:
随着网络的普及,网络资源的丰富给很多用户带来很大的便利,获取网络的连接状态能更高效的利用网络资源。
7、文件查找:
查找文件是每个用户经常遇到的事情,因此,一个简洁、方便的文件搜索工具将受到大家的青睐。
(2)模块的组织结构图

图2.2 功能模块图
3 系统工具设计与实现
3.1 获取主机名和IP地址
3.1.1 功能设计
这个窗体主要用来获取本地主机名和IP地址。获取本地主机名及IP地址通过WinSock API编程实现,应用程序在使用WinSock API之前,必须先成功调用函数WSAStartup,对WinSock DLL进行初始化,协商WinSock DLL的版本支持,并分配必要的资源,如果在调用WinSock函数之前,没有加载WinSock DLL,则会返回SOCKET_ERROR错误,错误信息是WSANOTINITIALISED。而应用程序结束时,调用WSACleanup函数终止对Winsock DLL的使用,并释放资源,以备下一次使用。模块使用WSAGetLastError函数返回上次发生的网络错误。当一特定的Winsock Sockets API函数指出已经发生了一个错误,则调用本函数来获得相应的错误代码。
[资料来源:THINK58.com]

功能实现主要函数和结构:
(1)gethostname函数返回本地主机的标准主机名,函数原型如下:
int PASCAL FAR gethostname(
char FAR *name
int namelen
)
name:一个指向要存放主机名的缓冲区指针。
namelen:缓冲区的长度。
该函数把本地主机名存放在由name参数指定的缓冲区中。返回的主机名是一个以空字符结尾的字符串。主机名的形式取决于Windows Sockets的实现,也就是说,它可以是一个简单的主机名,也可以是一个域名。如果函数调用成功,则返回0;否则返回SOCKET_ERROR。应用程序可调用函数WSAGetLastError 来获取详细的错误信息。
(2)Gethostbyname函数根据主机名称返回相应的信息。函数原型如下:
Struct hostent FAR * gethostbyname(
Const char FAR *name
)
name:一个以空字符结尾的表示主机名的字符串。
函数gethostbyname返回一个HOSTENT结构的地址,该结构由Windows套接字分配。应用程序不能修改本结果或释放它的某个成员。函数gethostbyname不能解析传递给它的IP地址字符串。也就是说,如果向函数传递一个IP地址字符串作为参数,则函数认为这是一个未知的主机名参数。如果要想通过机器的IP地址字符串获取相应的主机信息,可以先调用函数inet_addr,将IP地址字符串转换为实际的IP地址,然后使用函数gethostbyaddr来得到HOSTENT结构中的信息。函数gethostbyname可以成功解析由函数gethostname返回的主机名字符串。如果成功,则函数返回一个指向HOSTENT结构的指针;否则,函数返回一个NULL指针,若调用函数WSAGetLastError,还可得到相应的错误代码。 本文来自think58
[资料来源:THINK58.com]

(3)结构HOSTENT,结构的定义如下:
Struct hostent(
Char FAR *h_name;
Char FAR *FAR *h_aliases;
Short h_addrtype;
Short h_length;
Char FAR *FAR *h_addr_list;
);
h_name:主机名的官方名称。
h_aliases:可选择的别名数组,该数组以NULL结尾。
h_addrtype:返回的地址的类型。
h_length:每个地址的字节长度。
h_addr_lis:一个以NULL结尾的主机地址列表。
窗体使用自定义函数GetIPAddress()实现本地主机IP地址的获取:
Private Function GetIPAddress() As String
……
sHostName = Trim$(sHostName)
lpHost = gethostbyname(sHostName)
……
‘为展开返回的IP地址,将HOST结构及其数据复制到变量中
……
CopyMemory tmpIPAddr(1), dwIPAddr, HOST.hLen
For i = 1 To HOST.hLen ‘由结果数组建立实际的IP地址
sIPAddr = sIPAddr & tmpIPAddr(i) & "."
Next
……
End Function
窗体使用函数GetIPHostName()实现主机名的获取:

think58好,好think58 [资料来源:THINK58.com]


Private Function GetIPHostName() As String
……
GetIPHostName = Left$(sHostName, InStr(sHostName, Chr(0)) - 1)
socketscleanup
End Function

think58.com

[资料来源:THINK58.com]

[资料来源:http://think58.com]

3.1.2 界面实现
添加一个窗体,并按照下表设置窗体的属性

[资料来源:THINK58.com]

think58好,好think58

[资料来源:http://THINK58.com]

表3.1 获取主机名和IP地址窗体设置表
窗体属性 取值
Name nameandip
Caption 获取主机名及IP地址
该窗体添加2个label控件,Caption属性分别设置为‘主机名’,‘IP地址’,2个text控件,text属性均设为空,1个commandbotton控件,Caption属性设置为‘运行’。添加完毕后的窗体如图所示:

图3.1 显示主机名和IP地址界面
单击按钮,调用GetIPHostName()和GetIPAddress()函数,在text文本框中分别显示出当前主机名和IP地址。
3.2 获取物理地址
3.2.1 功能设计
这个窗体主要用来获取MAC地址,本模块使用NetBIOS网络编程接口来获取网卡的物理地址。NetBIOS API只有一个函数NetBIOS, 该函数解释和执行指定的网络控制块(NCB),函数的原型如下:
UCHAR NetBIOS (PNCB pncb);
pncb:指向NCB结构的指针,该结构描述了网络控制块。在网络控制块结构中,包含了一个执行NetBIOS命令、相应的NetBIOS函数需要用到的全部信息。
NCB结构的定义如下:
private type NET_CONTROL_BLOCK
ncb_command as byte
ncb_retcode as byte
……
ncb_event as long

think58好,好think58

[资料来源:www.THINK58.com]


End type
进行任何NetBIOS调用之前,必须先将这个结构清零。
NetBIOS提供了几个专门负责收集网络参数的命令,其中包括名字查找命令(NCBFINDNAME)和适配器状态命令(NCBASTAT)。这里主要讲述适配器状态命令,利用适配器状态命令,可取得与本地计算机及其LANA编号的有关信息。适配器状态命令返回一个ADAPTER_STATUS结构和紧接其后的大量NAME_BUFFER结构。ADAPTER_STATUS结构定义如下:
Private type ADAPTER_STATUS
adapter_address(5) as byte
rev_major as byte
……
Name_count as integer
End type
在ADAPTER_STATUS结构中,最重要的成员是adapter_address成员,它表示的是网卡的MAC地址。
使用函数GetMACAddress()实现物理地址的获取:
Private Function GetMACAddress() As String
……
pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS Or HEAP_ZERO_MEMORY, NCB.ncb_length)
……
NCB.ncb_buffer = pASTAT
Call Netbios(NCB)
CopyMemory AST, NCB.ncb_buffer, Len(AST)
tmp = Format$(Hex(AST.adapt.adapter_address(0)), "00") & "" & Format$(Hex(AST.adapt.adapter_address(1)), "00") & "" &

本文来自think58 [资料来源:http://www.THINK58.com]


……
Format$(Hex(AST.adapt.adapter_address(5)), "00")
……
End Function
函数GetMACAddress()为自定义函数,它通过调用NetBIOS函数来获取网卡的MAC地址。GetMACAddress()函数两次调用了NetBIOS函数:第一次调用NetBIOS函数采用的是NCBRESET命令,目的是重置所有的LANA编号;第二次调用采用的是适配器状态命令NCBASTAT,通过它可以取得与本地计算机指定LANA编号有关的结构信息,从这个结构信息中,可以解析出网卡的物理地址。

think58好,好think58 [资料来源:THINK58.com]

[资料来源:THINK58.com]

3.2.2 界面实现
添加一个窗体,并按照下表设置窗体的属性
表3.2 获取物理地址窗体设置表
窗体属性 取值
Name MACaddress
Caption 获取物理地址
该窗体上添加1个label控件,Caption属性设置为‘MAC地址’,1个text控件,text属性设置为空,1个commandbotton控件,Caption属性设置为‘运行’。添加完毕后的窗体如图所示:

图3.2 获取物理地址界面
点击按钮,程序调用GetMACAddress()函数,在text控件中显示主机物理地址。
3.3 显示本机用户信息
3.3.1 功能设计
这个窗体主要用来显示系统中所有用户及其相关信息。使用API函数GetComputerName获取服务器名,使用API函数NetUserEnum返回PDC/BDC用户管理器(User Manager)中定义的所有用户,显示在ListBox控件中,调用API函数NetUserGetInfo函数,并使用其中的USER_INFO_10结构返回当前服务器上指定用户的信息,包括用户名、用户全名、描述和用户描述信息,显示在对应的文本框里。其主要的函数和结构如下:
(1)NetUserEnum函数
NET_API_STATUS NetUserEnum(
LPWSTR servername,
DWORD level,
……
LPDWORD entriesread, think58好,好think58

[版权所有:http://think58.com]


LPDWORD totalentries,
LPDWORD resume_handle
);
servername:一个指向Unicode字符串的指针,该字符串给出了执行该函数的远程服务器名,空指针或空字符串指明以本地机作为服务器。
level:定义返回信息的级别,本设计只返回枚举的用户名,使用0值,即返回USER_INFO_0的信息。
Entriesread:指向一个DWORD变量的指针。该变量中包含了实际枚举的元素的数量。
resume_handle:指向一个DWORD变量的指针。给出了重用句柄(resume_handle),它用于继续查找存在的用户。
如果函数调用成功,则返回NERR_SUCCESS;否则,返回错误代码。该函数不会返回windows所有的系统用户,它只能返回由函数NetUserAdd添加的用户。
(2)NetUserGetInfo函数
NET_API_STATUS NetUserGetInfo(
LPWSTR servername,
LPWSTR username,
DWORD level,
LPBYTE * bufptr
);
servername:一个指向Unicode字符串的指针,该字符串给出了执行该函数的远程服务器名,空指针或空字符串指明以本地机作为服务器。
username: 一个指向Unicode字符串的指针,该字符串给出了将返回信息的用户名称。
level:定义返回信息的级别,本设计只返回枚举的用户名,使用10值,即返回USER_INFO_10结构的信息。 copyright think58 [资料来源:THINK58.com]
如果函数调用成功,则返回NERR_SUCCESS;否则,返回错误代码。
(3)USER_INFO_10结构
Private type USER_INFO_10
Usr10_name as long
Usr10_comment as long
Usr10_usr_comment as long
Usr10_full_name as long
End type
窗体中使用定义了USER_INFO结构存放实际显示的字符串。
窗体中使用自定义函数GetUserEnumInfo()枚举本机用户:
Private Function GetUserEnumInfo(bServername() As Byte)
……
CopyMemory users(0), ByVal buff, entriesread * 4
For cnt = 0 To entriesread - 1
List1.AddItem GetPointerToByteStringW(users(cnt))
Next cnt
……
End Function
以服务器名和当前选中用户名为参数,调用函数,返回USER_INFO_10结构中的用户信息。GetPointerToByteStringW()函数获取指针所指的字符串信息。
窗体使用自定义函数GetUserNetworkInfo()实现获取各个用户详细信息:
Private Function GetUserNetworkInfo(bServername() As Byte, bUsername() As Byte) As USER_INFO
……
CopyMemory usrapi, ByVal buff, Len(usrapi)

[资料来源:http://think58.com]


GetUserNetworkInfo.name = GetPointerToByteStringW(usrapi.usr10_name)
GetUserNetworkInfo.full_name = GetPointerToByteStringW(usrapi.usr10_full_name)
GetUserNetworkInfo.comment = GetPointerToByteStringW(usrapi.usr10_comment)
GetUserNetworkInfo.usr_comment = GetPointerToByteStringW(usrapi.usr10_usr_comment)‘GetPointerToByteStringW()为自定义函数,用于获取指针中的字符串
……
End Function [资料来源:http://www.THINK58.com]

3.3.2 界面实现
添加一个窗体,并按照下表设置窗体的属性
表3.3 显示用户窗体设置表
窗体属性 取值
Name userinformation
Caption 用户信息
该窗体首先添加一个ListBox控件,然后再添加5个label控件,Caption分别设置属性为服务器名、用户名、用户全名、描述、用户描述,添加5个text控件分别对应5个Label控件,text属性均设为空,添加完毕后的窗体如图所示:

图3.3 显示用户信息
当用户单击工程主窗体上的‘用户信息’按钮,调用GetUserEnumInfo()和rgbGetCompterName()函数,获取本机用户名和服务器名分别显示在ListBox和text1控件中,用户单击列表框中的任一用户,调用GetUserNetworkInfo()函数,获取USER_INFO_10结构中的用户信息,显示在下面对应的四个text文本框中。
think58

[资料来源:THINK58.com]