#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
using namespace std;
int main()
{
HRESULT hres;
// 初始化COM
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
cout << "Failed to initialize COM library. Error code = 0x" << hex << hres << endl;
return 1;
}
// 设置COM安全级别
hres = CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL);
if (FAILED(hres))
{
cout << "Failed to initialize security. Error code = 0x" << hex << hres << endl;
CoUninitialize();
return 1;
}
// 创建WMI服务
IWbemLocator* pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID*)&pLoc);
if (FAILED(hres))
{
cout << "Failed to create IWbemLocator object. Error code = 0x" << hex << hres << endl;
CoUninitialize();
return 1;
}
IWbemServices* pSvc = NULL;
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"),
NULL,
NULL,
0,
NULL,
0,
0,
&pSvc);
if (FAILED(hres))
{
cout << "Failed to connect to IWbemServices object. Error code = 0x" << hex << hres << endl;
pLoc->Release();
CoUninitialize();
return 1;
}
// 设置WMI服务安全级别
hres = CoSetProxyBlanket(
pSvc,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE);
if (FAILED(hres))
{
cout << "Failed to set IWbemServices security. Error code = 0x" << hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1;
}
// 查询网卡信息
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(
_bstr_t(L"WQL"),
_bstr_t(L"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
cout << "Failed to execute query. Error code = 0x" << hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1;
}
// 遍历网卡信息
IWbemClassObject* pclsObj = NULL;
ULONG uReturn = 0;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (0 == uReturn)
{
break;
}
VARIANT vtIP, vtMask, vtGateway;
hr = pclsObj->Get(L"IPAddress", 0, &vtIP, 0, 0);
hr = pclsObj->Get(L"IPSubnet", 0, &vtMask, 0, 0);
hr = pclsObj->Get(L"DefaultIPGateway", 0, &vtGateway, 0, 0);
if (vtIP.vt & (VT_ARRAY | VT_BSTR))
{
SAFEARRAY* pIPs = vtIP.parray;
LONG lBound, uBound, i;
SafeArrayGetLBound(pIPs, 1, &lBound);
SafeArrayGetUBound(pIPs, 1, &uBound);
for (i = lBound; i <= uBound; i++)
{
BSTR bstrIP;
hr = SafeArrayGetElement(pIPs, &i, &bstrIP);
if (SUCCEEDED(hr))
{
cout << "IP Address: " << _com_util::ConvertBSTRToString(bstrIP) << endl;
SysFreeString(bstrIP);
}
}
}
if (vtMask.vt & (VT_ARRAY | VT_BSTR))
{
SAFEARRAY* pMasks = vtMask.parray;
LONG lBound, uBound, i;
SafeArrayGetLBound(pMasks, 1, &lBound);
SafeArrayGetUBound(pMasks, 1, &uBound);
for (i = lBound; i <= uBound; i++)
{
BSTR bstrMask;
hr = SafeArrayGetElement(pMasks, &i, &bstrMask);
if (SUCCEEDED(hr))
{
cout << "Subnet Mask: " << _com_util::ConvertBSTRToString(bstrMask) << endl;
SysFreeString(bstrMask);
}
}
}
if (vtGateway.vt & (VT_ARRAY | VT_BSTR))
{
SAFEARRAY* pGateways = vtGateway.parray;
LONG lBound, uBound, i;
SafeArrayGetLBound(pGateways, 1, &lBound);
SafeArrayGetUBound(pGateways, 1, &uBound);
for (i = lBound; i <= uBound; i++)
{
BSTR bstrGateway;
hr = SafeArrayGetElement(pGateways, &i, &bstrGateway);
if (SUCCEEDED(hr))
{
cout << "Default Gateway: " << _com_util::ConvertBSTRToString(bstrGateway) << endl;
SysFreeString(bstrGateway);
}
}
}
VariantClear(&vtIP);
VariantClear(&vtMask);
VariantClear(&vtGateway);
pclsObj->Release();
cout << endl;
}
// 释放COM对象
pEnumerator->Release();
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 0;
}
VC++ 通过WMI接口枚举网卡的IP、MASK、网关服务器
最新推荐文章于 2023-11-18 12:04:51 发布