1. 程式人生 > >windows從登錄檔獲取ip配置資訊

windows從登錄檔獲取ip配置資訊

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;