C语言根据MAC地址查找网卡并修改IP地址

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "setupapi.h"
#include <devguid.h>
#pragma comment(lib, "IPHLPAPI.lib")
#pragma comment(lib, "setupapi.lib")

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

/* Note: could also use malloc() and free() */

BOOL GetAdapterInfo(LPCTSTR lpszAdapterName, PIP_ADAPTER_INFO pAdapterInfo);
BOOL SetIP(LPCTSTR lpszAdapterName, int nIndex, LPCTSTR pIPAddress, LPCTSTR pNetMask, LPCTSTR pNetGate);
BOOL RestartNetwork(LPCTSTR lpszAdapterName);

int __cdecl main()
{
 LPCTSTR lpszMAC = "DE-AD-DE-ED-9A-05";
 LPCTSTR lpszIP = "10.3.3.145";
 LPCTSTR lpszMask = "255.255.252.0";
 LPCTSTR lpszGateway = "10.3.0.5";
 IP_ADAPTER_INFO AdapterInfo;
 BOOL bResult = GetAdapterInfo(lpszMAC, &AdapterInfo);
 if (bResult) {
  printf("Get adapter information successfuly!\nAdapterName:%s\nnDescription:%s\nIndex:%d\n", AdapterInfo.AdapterName, AdapterInfo.Description, AdapterInfo.Index);
  BOOL bResult = SetIP(AdapterInfo.AdapterName, AdapterInfo.Index, lpszIP, lpszMask, lpszGateway);
  printf("result:%d", bResult);
 }
 return 0;
}

BOOL GetAdapterInfo(LPCTSTR lpszMAC, PIP_ADAPTER_INFO pRetAdapterInfo)
{
 PIP_ADAPTER_INFO pAdapterInfo;
 PIP_ADAPTER_INFO pAdapter = NULL;
 DWORD dwRetVal = 0;
 UINT i;

 ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
 pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(sizeof (IP_ADAPTER_INFO));
 if (pAdapterInfo == NULL) {
  printf("Error allocating memory needed to call GetAdaptersinfo\n");
  return 1;
 }
 // Make an initial call to GetAdaptersInfo to get
 // the necessary size into the ulOutBufLen variable
 if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
  FREE(pAdapterInfo);
  pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(ulOutBufLen);
  if (pAdapterInfo == NULL) {
   printf("Error allocating memory needed to call GetAdaptersinfo\n");
   return 1;
  }
 }

 if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
  pAdapter = pAdapterInfo;
  while (pAdapter) {
   CHAR szMAC[18] = { 0 };
   for (i = 0; i < pAdapter->AddressLength; i++) {
    if (i == (pAdapter->AddressLength - 1))
     sprintf(szMAC + i * 3, "%.2X", (int)pAdapter->Address[i]);
    else
     sprintf(szMAC + i * 3, "%.2X-", (int)pAdapter->Address[i]);
   }
   if (strcmp(szMAC, lpszMAC) == 0) {
    memcpy(pRetAdapterInfo, pAdapter, sizeof(IP_ADAPTER_INFO));
    if (pAdapterInfo)
     FREE(pAdapterInfo);
    return TRUE;
   }
   pAdapter = pAdapter->Next;
  }
 }
 else {
  printf("GetAdaptersInfo failed with error: %d\n", dwRetVal);
  return FALSE;
 }
 if (pAdapterInfo)
  FREE(pAdapterInfo);
 return FALSE;
}

 

BOOL RestartNetwork(LPCTSTR lpszAdapterName)
{
 LPCTSTR lpszNetworkName = "本地连接";
 // 获取网络连接名称用于netsh命令
 HKEY hKey;
 std::string strKeyName = "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
 strKeyName += lpszAdapterName;
 strKeyName += "\\Connection";
 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  strKeyName.c_str(),
  0,
  KEY_QUERY_VALUE,
  &hKey) != ERROR_SUCCESS)
  return FALSE;
 CHAR szNetworkName[32] = { 0 };
 DWORD dwSize = 32;
 DWORD dwResult = RegQueryValueEx(hKey, "Name", NULL, NULL, (LPBYTE)szNetworkName, &dwSize);
 printf("Name:%s", szNetworkName);
 CHAR szCommand[128] = { 0 };
 sprintf(szCommand, "netsh interface set interface name=\"%s\" admin=DISABLED", lpszNetworkName);
 system(szCommand);

 sprintf(szCommand, "netsh interface set interface name=\"%s\" admin=ENABLED", lpszNetworkName);
 system(szCommand);
 RegCloseKey(hKey);
 return TRUE;
}

#if 1
BOOL SetIP(LPCTSTR lpszAdapterName, int nIndex, LPCTSTR pIPAddress, LPCTSTR pNetMask, LPCTSTR pNetGate)
{
 HKEY hKey;
 std::string strKeyName = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
 strKeyName += lpszAdapterName;
 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  strKeyName.c_str(),
  0,
  KEY_WRITE,
  &hKey) != ERROR_SUCCESS)
  return FALSE;

 char mszIPAddress[100];
 char mszNetMask[100];
 char mszNetGate[100];

 strncpy(mszIPAddress, pIPAddress, 98);
 strncpy(mszNetMask, pNetMask, 98);
 strncpy(mszNetGate, pNetGate, 98);

 int nIP, nMask, nGate;

 nIP = strlen(mszIPAddress);
 nMask = strlen(mszNetMask);
 nGate = strlen(mszNetGate);

 *(mszIPAddress + nIP + 1) = 0x00;
 nIP += 2;

 *(mszNetMask + nMask + 1) = 0x00;
 nMask += 2;

 *(mszNetGate + nGate + 1) = 0x00;
 nGate += 2;

 DWORD dwLastError = 0;
 RegSetValueEx(hKey, "EnableDHCP", 0, REG_DWORD, (LPBYTE)&dwLastError, sizeof(DWORD));
 RegSetValueEx(hKey, "IPAddress", 0, REG_MULTI_SZ, (unsigned char*)mszIPAddress, nIP);
 RegSetValueEx(hKey, "SubnetMask", 0, REG_MULTI_SZ, (unsigned char*)mszNetMask, nMask);
 RegSetValueEx(hKey, "DefaultGateway", 0, REG_MULTI_SZ, (unsigned char*)mszNetGate, nGate);

 RegCloseKey(hKey);
 RestartNetwork(lpszAdapterName);
 return TRUE;
}
#endif

时间: 2024-10-26 22:41:26

C语言根据MAC地址查找网卡并修改IP地址的相关文章

Windows7上ARP缓存更新延迟 修改IP地址后不能连通解决办法

在开发过程中,一些工具具备修改其他设备IP地址的功能. 修改IP地址的实现方式有:1)通过IP地址A连接过去修改IP地址B;2)通过IP地址A连接过去修改IP地址A. 这两种方式,都涉及到ARP缓存的更新. ARP(Address Resolution Protocol)协议是连接IP层与物理层的一种协议,ARP协议负责将网络层的IP地址转换为链路层的MAC地址,因为链路层最终是通过MAC地址发送数据包的. 关于OSI的7层以及他们之间的各种协议,请参考OSI Model. 在操作系同实现层面,

Shell脚本实现自动修改IP地址_linux shell

作为一名Linux SA,日常运维中很多地方都会用到脚本,而服务器的ip一般采用静态ip或者MAC绑定,当然后者比较操作起来相对繁琐,而前者我们可以设置主机名.ip信息.网关等配置.修改成特定的主机名在维护和管理方面也比较方便.如下脚本用途为:修改ip和主机名等相关信息,可以根据实际需求修改,举一反三! #!/bin/sh #auto Change ip netmask gateway scripts #wugk 2012-12-17 cat << EOF ++++++++自动修改ip和主机名

使用批处理修改IP地址和DNS配置

1.Windows XP系统BAT批处理修改IP地址和DNS. 新建:文本文档,复制下面代码到文本文档,保存为Set IP Address.bat,双击运行,即可! @echo offecho **************************************************************************echo * 修改IP地址.DNS *echo * Windows XP Copyright (C) 2013-02-05 *echo ***********

php获取浏览器信息、访客语言、访客操作系统、访客IP地址及访客地理位置

php获取浏览器信息.获取访客语言.获取访客操作系统.获取访客IP地址.获取访客地理位置. php获取浏览器信息,获取访客语言:简体中文.繁體中文.English.获取访客操作系统:Windows.MAC.Linux.Unix.BSD.Other.获取访客IP地址.获取访客地理位置,使用 新浪腾讯接口. <?php /** * 获取访客信息的类:语言.浏览器.操作系统.IP.地理位置.ISP. * 使用: * $obj = new guest_info; * $obj->GetLang();

linux系统双网卡绑定单个IP地址

双网卡绑定单个IP 地址 为了提供网络的高可用性,我们可能需要将多块网卡绑定成一块虚拟网卡对外提供服务,这样即使其中的一块物理网卡出现故障,也不会导致连接中断.多网卡绑. 为了提供网络的高可用性,我们可能需要将多块网卡绑定成一块虚拟网卡对外提供服务,这样即使其中的一块物理网卡出现故障,也不会导致连接中断.在Linux下叫bonding,IBM称为etherchanel,broadcom叫team,但是名字怎么变,效果都是将两块或更多的网卡当做一块网卡使用,在增加带宽的同时也可以提高冗余性.比如我

网卡无法获取IP地址自己给他找个

电脑出现网卡无法获取IP地址出现这类问题,可以尝试更改网卡工作模式来解决.展开"设备管理器"中的"网络适配器",然后双击网卡驱动标志,然后切换到 "高级"选项,在属性中将网卡工作速率模式由自动模式改为10Mbps全双工模式.如果还是不能解决问题,很有可能是主板与网卡不兼容,你可以尝试通过升级最新版的主板BIOS试试,实在不行只有更换网卡.

Windows 8系统有线网卡自动获取IP地址

  设置动画示范教程: Windows 8系统有线网卡自动获取IP地址设置动画 Windows 8系统有线网卡自动获取IP地址的详细设置步骤如下: 第一步:进入Windows 8系统的经典桌面,在电脑桌面右下角找到网络图标,右键点击并选择 打开网络和共享中心.如下图所示: 第二步:弹出 网络和共享中心 的界面,点击 更改适配器设置.如下图所示: 第三步:打开 更改适配器设置后,找到 以太网,右键点击并选择 属性.如下图所示: 第四步:找到并点击 Internet协议版本4(TCP/IPv4),点

Windows7有线网卡自动获取IP地址设置

  设置动画示范教程: Windows 7系统有线网卡自动获取IP地址的详细设置步骤如下: 第一步:鼠标点击电脑桌面右下角小电脑图标,在弹出的对话框中,点击 打开网络和共享中心.如下图所示: 第二步:弹出 网络和共享中心 的界面,点击 更改适配器设置.如下图所示: 第三步:找到 本地连接,右键点击并选择 属性.如下图所示: 第四步:找到并点击 Internet协议版本4(TCP/IPv4),点击 属性.如下图所示: 第五步:选择 自动获得IP地址(O).自动获得DNS服务器地址(B),点击 确定

Windows XP系统有线网卡自动获取IP地址设置

  设置动画示范教程: Windows XP系统有线网卡自动获取IP地址设置动画 操作步骤: Windows XP系统有线网卡自动获取IP地址的详细设置步骤如下: 第一步:电脑桌面上找到 网上邻居 的图标,右键点击并选择 属性.如下图所示: 第二步:弹出 网络连接 的对话框后,找到 本地连接 的图标,右键点并选择 属性.如下图所示: 第三步:出现 本地连接属性 的对话框后,找到并点击 Internet协议(TCP/IP),点击 属性.如下图所示: 第四步:选择 自动获得IP地址(0).自动获得D