在扫描项目的插件中增加一项检测防火墙的功能:
1、声明一个存储防火墙状态的枚举类型并且实例化一个对象作为全局变量
//@author Denny
// \brief 防火墙状态
enum FIREWALL_STATUS
{
FIREWALLUNKNOWN = 0,
FIREWALLCLOSE,
FIREWALLOPEN
};
FIREWALL_STATUS m_eFirewall;
2、通过函数从注册表中获取防火墙状态
//获取防火墙状态
FIREWALL_STATUS CSystemInfo::GetFireWallStatus()
{
LOG4CPLUS_TRACE(*g_Root, "获取防火墙状态开始");
FIREWALL_STATUS status = FIREWALLUNKNOWN;
HKEY pHkey;
TCHAR chSubKey[] = _T("SYSTEM\\CurrentControlSet\\services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile");
if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, chSubKey, 0, KEY_READ, &pHkey))
{
LOG4CPLUS_ERROR(*g_Root, "打开子键失败");
return status;
}
DWORD type = REG_DWORD; //EnableFireWall的类型
DWORD dwdata = -1;//EnableFireWall的值
DWORD dwsize = sizeof(DWORD);//EnableFireWall的大小
if (ERROR_SUCCESS != RegQueryValueEx(pHkey, _T("EnableFireWall"), 0, &type, (LPBYTE)&dwdata, &dwsize))
{
LOG4CPLUS_ERROR(*g_Root, "查询键值失败");
RegCloseKey(pHkey);
return status;
}
if (1 == dwdata)
{
status = FIREWALLOPEN;
}
else if (0 == dwdata)
{
status = FIREWALLCLOSE;
}
RegCloseKey(pHkey);
LOG4CPLUS_INFO(*g_Root, "防火墙状态: " << status);
LOG4CPLUS_TRACE(*g_Root, "获取防火墙状态结束");
return status;
}
3、将获取的防火墙状态的值赋给全局变量
m_eFirewall = GetFireWallStatus(); //获取防火墙状态的返回值</span>
4、用string_t类型的数据存储状态值
pugi::string_t szWinVer, szWinSP, szWin64, szUserName, szAdmin, szInternet, szUAC,szFireWall;
szUserName = m_szUserName;
5、在_ParseSystemInfo中解析防火墙状态
void CSystemInfo::_ParseSystemInfo(pugi::string_t& szWinVer, pugi::string_t& szWinSP, pugi::string_t& szWin64,
pugi::string_t& szAdmin, pugi::string_t& szInternet, pugi::string_t& szUAC, pugi::string_t& szFireWall)
{
<span style="white-space:pre"> </span>switch (m_eFirewall)
{
case FIREWALLUNKNOWN:
szFireWall = _T("查询注册表失败");
break;
case FIREWALLOPEN:
szFireWall = _T("开启");
break;
case FIREWALLCLOSE:
szFireWall = _T("关闭");
break;
default:
szFireWall = _T("未知");
break;
}
}
6、将状态的值放入到vector容器中
vecInfo.push_back(szFireWall);//将防火墙的状态值放入vector容器
7、最后和其他检测项目例如系统信息,用户信息,网络状态等等一起在vector容器中交给其他操作实现