打造一款属于自己的远程管理软件(二)
作者:CQITer小编 时间:2018-03-17 21:27
前一篇文章介绍了软件的整体架构,接下来对被控端进行详细讲解,主要介绍被控端各个功能模块的关键技术以及开发过程中遇到的坑,希望对各位读者有借鉴作用。
被控端工作流程应用程序初始化阶段初始化工作界面、从地址文件读取反向连接的ip地址和端口作为MyClientThread线程的启动参数。MyClientThread启动后执行GetClientSystemInfo函数获取本机信息并传至控制端显示。而后进入while(1)循环等待接收控制端传来的控制命令。进入switch_case结构解析命令,执行相应函数。将执行结果发送到控制端,继续进入循环等待。

GetClientSystemInfo传入一个SYSTEMINIT结构的引用,对该结构的定义在common.h文件中,该结构定义如下:
typedef struct tagSytemInit { char computer[32]; //计算机名 char user[32]; //当前用户名 char os[72]; //操作系统信息 char processor[16]; //处理器信息 char mem[16]; //内存 char version[16]; //软件版本 char HDSerial[32]; //硬盘序列号 }SYSTEMINIT;调用GetComputerName、GetUserName、GetVersionEx、GlobalMemoryStatus来分别获取计算机名、当前用户名、操作系统版本、内存信息。CPU的信息通过查询注册表来获取,通过打开不同的注释(3个中只能打开一个)获取CPU的不同信息,这里我们选择获取CPU的频率信息。
#include "stdafx.h"#include "windows.h"
#include "GetHDSerial.h"
#define BUFSIZE 16
bool GetClientSystemInfo(SYSTEMINIT& sysinfo)
{
TCHAR computerbuf[256]; //获取计算机名
DWORD computersize=256;
memset(computerbuf,0,256);
if(!GetComputerName(computerbuf,&computersize))
return false;
computerbuf[computersize]=0;
sysinfo.computer[0]=0;
strcat(sysinfo.computer,"计算机: ");
strcat(sysinfo.computer,computerbuf);
TCHAR userbuf[256]; //获取用户名
DWORD usersize=256;
memset(userbuf,0,256);
if(!GetUserName(userbuf,&usersize))
return false;
userbuf[usersize]=0;
sysinfo.user[0]=0;
strcat(sysinfo.user,"用户名: ");
strcat(sysinfo.user,userbuf);
OSVERSIONINFOEX osvi; //获取操作系统
BOOL bOsVersionInfoEx;
OSVERSIONINFOEX osviex;
sysinfo.os[0]=0;
memset(&osviex,0,sizeof(OSVERSIONINFOEX));
osviex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if(GetVersionEx((LPOSVERSIONINFO)&osviex)==0)
{
OutputDebugString("GetVersionEx Error");
return FALSE;
}
switch(osviex.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
switch(osviex.dwMajorVersion)
{
case 4:
if(osviex.dwMinorVersion == 0)
strcat(sysinfo.os,"Microsoft Windows NT 4");
break;
case 5:
if(osviex.dwMinorVersion == 0)
{
strcat(sysinfo.os,"Microsoft Windows 2000 ");
}
else if(osviex.dwMinorVersion == 1)
{
strcat(sysinfo.os,"Windows XP ");
}
else if(osviex.dwMinorVersion == 2)
{
strcat(sysinfo.os,"Windows 2003 ");
}
}
break;
}
char *temp; //获取硬盘序列号
sysinfo.HDSerial[0]=0;
CGetHDSerial HDSerial; // 创建实例
temp=HDSerial.GetHDSerial(); // 得到硬盘序列号
strcat(sysinfo.HDSerial,temp);
sysinfo.processor[0]=0; //获取CPU信息
HKEY hKey;
char szcpuinfo[80];
DWORD dwBufLen=80;
RegOpenKeyEx( HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey );
RegQueryValueEx( hKey, "VendorIdentifier", NULL, NULL, //这里获取cpu的生产厂商标识
(LPBYTE)szcpuinfo, &dwBufLen);
szcpuinfo[dwBufLen]=0; //strcat(sysinfo.processor,szcpuinfo); //打开这句注释,控制端显示cpu生产厂商
memset(szcpuinfo,0,80);
dwBufLen=80;
RegQueryValueEx( hKey, "Identifier", NULL, NULL, //获取CPU型号
(LPBYTE)szcpuinfo, &dwBufLen);
szcpuinfo[dwBufLen]=0;
//strcat(sysinfo.processor,szcpuinfo); //可以打开这句注释,控制端显示cpu型号
DWORD f;
dwBufLen=8;
RegQueryValueEx( hKey, "~MHz", NULL, NULL,
(LPBYTE)&f, &dwBufLen);
char hz[10];
sprintf(hz," %dMHZ",f); //显示cpu工作频率
strcat(sysinfo.processor,hz);
RegCloseKey(hKey);
MEMORYSTATUS ms; //获取内存容量
GlobalMemoryStatus(&ms);
char membuf[256];//物理内存:
sprintf(membuf,"%dMB",ms.dwTotalPhys/1024/1024);
sysinfo.mem[0]=0;
strcpy(sysinfo.mem,membuf);
return true;
}
获取硬盘序列号




