用C++通过wmi方式修改网卡TCP/IP设置

本文介绍了使用C++编程语言通过WMI方式修改网卡配置的方法,包括设置IP地址、网关及DNS等信息的具体步骤,并提供了解决清除网关问题的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上有文章总结了4种C++编程修改网卡方法,但其中对Vista支持较好的只有Wmi方式,所以目标也是定在这个方向上。搜索了几篇文章,基本上都是这样的核心流程
CoInitializeEx
CoInitializeSecurity
CoCreateInstance
ConnectServer
GetMethod
SpawnInstance
SafeArrayCreate
SafeArrayPutElement
pInParams->Put
ExecMethod

整理网上的代码,才发现这个流程里面没有指明操作的网络适配器是哪个,然后又翻了一下,有3种方式可以找到
注册表
System\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}
LowerRange?ethernet
DriverDesc
NetCfgInstanceID
SDK函数
ULONG uListSize = 680;//sizeof(IP_ADAPTER_INFO)
PIP_ADAPTER_INFO pAdapterListBuffer = new IP_ADAPTER_INFO;
GetAdaptersInfo(pAdapterListBuffer, &uListSize);//可惜这种方式我机器上和WMI有冲突
WMI方式
SELECT NetConnectionID,DeviceID FROM Win32_NetworkAdapter WHERE NetConnectionID!=null

这个参数找到了之后,通过他又可以搜索并填充ExecMethod的第一个参数为Win32_NetworkAdapterConfiguration.Index=?这种形式,不然Method是肯定执行错误的。好了走到这一步,一切顺利的话已经可以通过C++编程的方式调用Wmi接口操作设置IP、网关、DNS等信息了。顶多是因为没开DNS Client服务提示Unable to notify DNS service.

最后还有个问题,能设置网关但如何清除网关?!百度搜索里面是木有好结果的,还是Google强大!搜索关键字vbs clear Gateway第一篇文章就解决了这个问题!
最好的答案居然是先启用DHCP然后再重设一下IP。

转载于:https://www.cnblogs.com/myamanda/archive/2009/09/22/1571787.html

要使用 C++ 通过 WMI 查询网卡的所有信息,您可以使用以下步骤: 1. 引用 WMI 类库。您可以在 Visual Studio 的“项目”菜单中选择“添加引用”,然后选择“System.Management”来添加类库。 2. 初始化 COM 库。您可以在程序的开头调用 CoInitializeEx 函数来初始化 COM 库。 3. 使用 COM 对象获取 WMI 服务对象。您可以使用 CoCreateInstance 函数创建 IWbemLocator 接口实例,并使用该实例的 ConnectServer 方法连接到本地或远程计算机上的 WMI 服务。 4. 使用 WMI 查询语言 (WQL) 获取 Win32_NetworkAdapter 类的实例。您可以使用 IWbemServices 接口的 ExecQuery 方法并指定查询语句来获取 Win32_NetworkAdapter 类的实例。 5. 遍历每个网卡实例并获取其属性。您可以使用 IWbemClassObject 接口的 Get 方法获取每个实例的属性,并将其存储在 C++ 变量中。 以下是一个简单的示例代码,它演示了如何使用 C++ 获取本地计算机上所有网卡的名称和描述: ```cpp #include <iostream> #include <comdef.h> #include <Wbemidl.h> #pragma comment(lib, "wbemuuid.lib") int main() { // 初始化 COM 库 HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if (FAILED(hr)) { std::cerr << "Failed to initialize COM library. Error code: " << hr << std::endl; return 1; } // 获取 WMI 服务对象 IWbemLocator* pLocator = nullptr; hr = CoCreateInstance(CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID*>(&pLocator)); if (FAILED(hr)) { std::cerr << "Failed to create IWbemLocator object. Error code: " << hr << std::endl; return 1; } IWbemServices* pServices = nullptr; hr = pLocator->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), nullptr, nullptr, 0, NULL, 0, 0, &pServices); if (FAILED(hr)) { std::cerr << "Failed to connect to WMI service. Error code: " << hr << std::endl; pLocator->Release(); return 1; } // 查询 Win32_NetworkAdapter 类的实例 IEnumWbemClassObject* pEnum = nullptr; hr = pServices->ExecQuery(_bstr_t(L"WQL"), _bstr_t(L"SELECT * FROM Win32_NetworkAdapter"), WBEM_FLAG_FORWARD_ONLY, nullptr, &pEnum); if (FAILED(hr)) { std::cerr << "Failed to execute WMI query. Error code: " << hr << std::endl; pServices->Release(); pLocator->Release(); return 1; } // 遍历网卡实例并获取属性 IWbemClassObject* pObject = nullptr; ULONG uReturned = 0; while (pEnum->Next(WBEM_INFINITE, 1, &pObject, &uReturned) == S_OK) { // 获取名称和描述 VARIANT varName, varDesc; hr = pObject->Get(L"Name", 0, &varName, nullptr, nullptr); if (FAILED(hr)) { std::cerr << "Failed to get Name property. Error code: " << hr << std::endl; pObject->Release(); continue; } hr = pObject->Get(L"Description", 0, &varDesc, nullptr, nullptr); if (FAILED(hr)) { std::cerr << "Failed to get Description property. Error code: " << hr << std::endl; VariantClear(&varName); pObject->Release(); continue; } // 输出名称和描述 std::wcout << L"Name: " << varName.bstrVal << std::endl; std::wcout << L"Description: " << varDesc.bstrVal << std::endl; // 释放对象和变量 VariantClear(&varName); VariantClear(&varDesc); pObject->Release(); } // 释放资源 pEnum->Release(); pServices->Release(); pLocator->Release(); CoUninitialize(); return 0; } ``` 请注意,这只是一个简单的示例,Win32_NetworkAdapter 类还有许多其他属性,您可以根据需要查询和获取它们。此外,WMI 查询是一种强大的技术,可以用于检索计算机上的各种系统信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值