如何从Win32_Networkadapter配置获取IP地址(Ps:如何获得流量) [英] How Do I Get Ip Address From Win32_Networkadapterconfiguration (Ps: How Do I Get Rate Of Flow)

查看:1421
本文介绍了如何从Win32_Networkadapter配置获取IP地址(Ps:如何获得流量)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#include <stdio.h> 
#include <stdlib.h>
#include <tchar.h> 
#include <string.h>
#include <windows.h> 
#include <comdef.h>
#include <wbemidl.h> 
#pragma comment(lib,"wbemuuid.lib")

BOOL NetCardAddr()
{
	HRESULT Hresult;

	Hresult = CoInitializeEx(0, COINIT_MULTITHREADED);
	if (FAILED(Hresult))
	{
		return FALSE;
	}

	Hresult = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
	if (FAILED(Hresult))
	{
		CoUninitialize();
		return FALSE;
	}

	IWbemLocator *WbemLoc = NULL;
	Hresult = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&WbemLoc);
	if (FAILED(Hresult))
	{
		CoUninitialize();
		return FALSE;
	}

	IWbemServices *WbemSvc = NULL;
	Hresult = WbemLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &WbemSvc);
	if (FAILED(Hresult))
	{
		WbemLoc->Release();
		CoUninitialize();
		return FALSE;
	}

	Hresult = CoSetProxyBlanket(WbemSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
	if (FAILED(Hresult))
	{
		WbemSvc->Release();
		WbemLoc->Release();
		CoUninitialize();
		return FALSE;
	}

	IEnumWbemClassObject *EnumObj = NULL;
	Hresult = WbemSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_NetworkAdapterConfiguration where macaddress <> null"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &EnumObj);
	if (FAILED(Hresult))
	{
		printf("Exec WMI Failed\n");
		WbemSvc->Release();
		WbemLoc->Release();
		CoUninitialize();
		return FALSE;
	}

	int nTemperature = 0;
	int nTotalTime = 0;

	IWbemClassObject *pclsObj;
	ULONG uReturn = 0;

	while (EnumObj)
	{
		HRESULT hr = EnumObj->Next(WBEM_INFINITE, 1, 
			&pclsObj, &uReturn);

		if(0 == uReturn)
		{
			break;
		}

		VARIANT Name;
		VARIANT MACAddress;
		VARIANT NETAddress;

		VariantInit(&Name);
		VariantInit(&MACAddress);
		VariantInit(&NETAddress);

		// Get the value of the VendorSpecific property
		hr = pclsObj->Get(L"Description", 0, &Name, 0, 0);
		hr = pclsObj->Get(L"MACAddress", 0, &MACAddress, 0, 0);
		hr = pclsObj->Get(L"IPAddress", 0, &NETAddress, 0, 0);

		wprintf(L"Name: %-60s   MAC: %-20s IP: %-20s\n", Name.bstrVal, MACAddress.bstrVal, NETAddress.bstrVal); 

		VariantClear(&Name);
		VariantClear(&MACAddress);
		VariantClear(&NETAddress);
	}

	if (pclsObj != NULL) pclsObj->Release();
	EnumObj->Release();
	WbemSvc->Release();
	WbemLoc->Release();
	CoUninitialize();
	return TRUE;
}

VOID main( VOID )
{
	NetCardAddr();
	return;
}

推荐答案

NETAddress是一个safearray而不是字符串,因为适配器可以有多个IP地址。

扫描安全数组以提取每个值。

使用SafeArrayAccessData获取数组指针。

此代码构建一个字符串连接所有找到的IP地址:

NETAddress is a safearray not a string because an adapter can have multiple IP addresses.
Scan the safe array to extract each value.
Use SafeArrayAccessData to get the array pointer.
This code build a string concatenating all ip addresses found:
std::wstring ConvertArrayToString(VARIANT varArr, WCHAR* lpSeparator)
{
	std::wstring		strRet;

	if((VT_ARRAY|VT_BSTR) != varArr.vt)
		return L"";

	BSTR*	arr	= NULL;
	LONG	nLbound	= 0;
	LONG	nUBound = 0;

	SafeArrayGetLBound(varArr.parray, 1, &nLbound);
	SafeArrayGetUBound(varArr.parray, 1, &nUBound);
	SafeArrayAccessData(varArr.parray, (void **)&arr);
	for(int i = 0; i < (nUBound - nLbound + 1); i++)
	{
		if(0 != i)
			strRet += lpSeparator;
		strRet += std::wstring(arr[i]);
	}
	SafeArrayUnaccessData(varArr.parray);

	return strRet;
}



在您的代码中替换:


In your code replace:

wprintf(L"Name: %-60s   MAC: %-20s IP: %-20s\n", Name.bstrVal, MACAddress.bstrVal, NETAddress.bstrVal); 



使用:


With:

wprintf(L"Name: %-60s   MAC: %-20s IP: %-20s\n", Name.bstrVal, MACAddress.bstrVal, ConvertArrayToString(NETAddress, L" - "));





PS感谢downvote的任何人......



P.S. Thanks to whoever for the downvote...


这篇关于如何从Win32_Networkadapter配置获取IP地址(Ps:如何获得流量)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆