在掃描項目的插件中增加一項檢測防火牆的功能:
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容器中交給其他操作實現