windows從登錄檔獲取ip配置資訊
阿新 • • 發佈:2019-01-02
DNS的獲取方式有多種:
這裡提供一種方式是從登錄檔獲取的:
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Adapters可以獲取網絡卡的SettingID,
//HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Adapters bool GetAdaptersKeyName(std::list<CString> *listAdapters) { OutputDebugStringA("Get network config"); //獲取網絡卡名稱 網絡卡名稱,網絡卡別名 string strAdapterName,strAdapterAlias; HKEY hKey, hSubKey; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Adapters"), 0, KEY_READ, &hKey) != ERROR_SUCCESS) return FALSE; DWORD dwIndex = 0; DWORD dwBufSize = 256; TCHAR szSubKey[256]; listAdapters->clear(); while(RegEnumKeyEx(hKey, dwIndex++, szSubKey, &dwBufSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { if(RegOpenKeyEx(hKey, szSubKey, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS) { listAdapters->push_back(CString(szSubKey)); RegCloseKey(hSubKey); } dwBufSize = 256; } /* end of while */ RegCloseKey(hKey); return true; }
根據SettingID,再逐個查詢獲取到ip配置包含DNS的資訊:
這裡要查詢 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces的SettingID下的 內容
引用頭內容有:typedef struct tagNetworkCfg { TCHAR szIP[18]; TCHAR szNetmask[18]; TCHAR szGateway[18]; TCHAR szDns1[256]; TCHAR szDns2[18]; }NetworkCfg; bool GetNetworkCfg(NetworkCfg *cfg, CString strAdapterAlias) { HKEY hKey; BYTE lpData[256]; CString strKeyName = _T("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\"); strKeyName += strAdapterAlias; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, strKeyName, 0, KEY_READ, &hKey) != ERROR_SUCCESS) return FALSE; DWORD dwBufSize = 256; DWORD dwDataType; if(RegQueryValueEx(hKey, _T("DhcpIPAddress"), 0,&dwDataType, lpData, &dwBufSize) == ERROR_SUCCESS) wcscpy(cfg->szIP,(LPCTSTR)lpData); else { if(RegQueryValueEx(hKey, _T("IPAddress"), 0, &dwDataType, lpData, &dwBufSize) == ERROR_SUCCESS) wcscpy(cfg->szIP,(LPCTSTR)lpData); } dwBufSize = 256; if(RegQueryValueEx(hKey, _T("DhcpSubnetMask"), 0, &dwDataType, lpData, &dwBufSize) == ERROR_SUCCESS) wcscpy(cfg->szNetmask,(LPCTSTR)lpData); else { if(RegQueryValueEx(hKey, _T("SubnetMask"), 0, &dwDataType, lpData, &dwBufSize) == ERROR_SUCCESS) wcscpy(cfg->szNetmask,(LPCTSTR)lpData); } dwBufSize = 256; if(RegQueryValueEx(hKey, _T("DhcpDefaultGateway"), 0, &dwDataType, lpData, &dwBufSize) == ERROR_SUCCESS) wcscpy(cfg->szGateway,(LPCTSTR)lpData); else { if(RegQueryValueEx(hKey, _T("DefaultGateway"), 0, &dwDataType, lpData, &dwBufSize) == ERROR_SUCCESS) wcscpy(cfg->szGateway,(LPCTSTR)lpData); } dwBufSize = 256; if(RegQueryValueEx(hKey, _T("DhcpNameServer"), 0, &dwDataType, lpData, &dwBufSize) == ERROR_SUCCESS) wcscpy(cfg->szDns1,(LPCTSTR)lpData); else { if(RegQueryValueEx(hKey, _T("NameServer"), 0, &dwDataType, lpData, &dwBufSize) == ERROR_SUCCESS) wcscpy(cfg->szDns1,(LPCTSTR)lpData); } RegCloseKey(hKey); return true; }
std::list<CString> listAdapters; GetAdaptersKeyName(&listAdapters); std::list<NetworkCfg> networkCfgList; for (list<CString>::iterator iter = listAdapters.begin(); iter!=listAdapters.end();iter++) { CString strTemp = *iter; NetworkCfg cfg; GetNetworkCfg(&cfg, strTemp); }
#include <string>
#include <list>
#include <WinSock2.h>
#pragma comment(lib,"Ws2_32.lib")
#include <Iphlpapi.h>
#pragma comment(lib, "Iphlpapi.lib")
using namespace std;