for more WMI usage, refer to http://www.fruitfruit.com/vc/hardware/usewmi.cpp BSTR InstancePath = SysAllocString(L"Win32_NetworkAdapterConfiguration=2"); in my computer, network card index is 2, your computer may have a different index
呵呵,是啊,我记得看过这个帖子,当时这个帖子好像就是 masterz(www.fruitfruit.com)大侠回的我再补充一些^_^#include "stdafx.h" #define _WIN32_DCOM #include <Wbemidl.h> #pragma comment(lib,"Wbemuuid.lib") #include <atlbase.h> //#include "wbemcli.h" #include "objbase.h" #include <windows.h> #include <comutil.h> #pragma comment(lib, "comsupp.lib") void CreateOneElementBstrArray(VARIANT* v, LPCWSTR s) { SAFEARRAYBOUND bound[1]; SAFEARRAY* array; bound[0].lLbound = 0; bound[0].cElements = 1; array = SafeArrayCreate(VT_BSTR, 1, bound); long index = 0; BSTR bstr = SysAllocString(s); SafeArrayPutElement(array, &index, bstr); SysFreeString(bstr); VariantInit(v); v->vt = VT_BSTR | VT_ARRAY; v->parray = array; } HRESULT __fastcall UnicodeToAnsi(LPCOLESTR pszW, LPSTR* ppszA) { ULONG cbAnsi, cCharacters; DWORD dwError; // If input is null then just return the same. if (pszW == NULL) { *ppszA = NULL; return NOERROR; } cCharacters = wcslen(pszW)+1; // Determine number of bytes to be allocated for ANSI string. An // ANSI string can have at most 2 bytes per character (for Double // Byte Character Strings.) cbAnsi = cCharacters*2; // Use of the OLE allocator is not required because the resultant // ANSI string will never be passed to another COM component. You // can use your own allocator. *ppszA = (LPSTR) CoTaskMemAlloc(cbAnsi); if (NULL == *ppszA) return E_OUTOFMEMORY; // Convert to ANSI. if (0 == WideCharToMultiByte(CP_ACP, 0, pszW, cCharacters, *ppszA, cbAnsi, NULL, NULL)) { dwError = GetLastError(); CoTaskMemFree(*ppszA); *ppszA = NULL; return HRESULT_FROM_WIN32(dwError); } return NOERROR;} void PrintWMIError(HRESULT hr) { IWbemStatusCodeText * pStatus = NULL; HRESULT hres = CoCreateInstance(CLSID_WbemStatusCodeText, 0, CLSCTX_INPROC_SERVER, IID_IWbemStatusCodeText, (LPVOID *) &pStatus); if(S_OK == hres) { BSTR bstrError; hres = pStatus->GetErrorCodeText(hr, 0, 0, &bstrError); if(S_OK != hres) bstrError = SysAllocString(L"Get last error failed"); LPSTR pszStatusTextA; UnicodeToAnsi(bstrError, &pszStatusTextA); printf("%s\n",pszStatusTextA); CoTaskMemFree(pszStatusTextA); pStatus->Release(); SysFreeString(bstrError); }}HRESULT ConfigNet() { IWbemLocator *pLocator=NULL; IWbemServices *pNamespace=NULL; IWbemClassObject *pClass=NULL; IWbemClassObject *pInputParamClass=NULL; IWbemClassObject *pInputParamInstance=NULL; IWbemClassObject * pOutInst = NULL; BSTR InstancePath = SysAllocString(L"Win32_NetworkAdapterConfiguration=2"); /**/ HRESULT hr; BSTR Path = SysAllocString(L"\\\\MICROSOFT\\root\\cimv2"); BSTR ClassPath = SysAllocString(L"Win32_NetworkAdapterConfiguration"); BSTR MethodName = SysAllocString(L"EnableStatic"); LPCWSTR Arg1Name = L"IPAddress"; VARIANT var1; LPCWSTR Arg2Name = L"SubnetMask"; VARIANT var2; __try { CreateOneElementBstrArray(&var1, L"10.0.0.101"); CreateOneElementBstrArray(&var2, L"255.255.255.0");
{ IWbemLocator *pLocator=NULL;
IWbemServices *pNamespace=NULL;
IWbemClassObject *pClass=NULL;
IWbemClassObject *pInputParamClass=NULL;
IWbemClassObject *pInputParamInstance=NULL;
IWbemClassObject * pOutInst = NULL;
BSTR InstancePath = SysAllocString(L"Win32_NetworkAdapterConfiguration=2"); /**/
HRESULT hr;
BSTR Path = SysAllocString(L"\\\\MICROSOFT\\root\\cimv2");
BSTR ClassPath = SysAllocString(L"Win32_NetworkAdapterConfiguration");
BSTR MethodName = SysAllocString(L"EnableStatic");
LPCWSTR Arg1Name = L"IPAddress";
VARIANT var1;
LPCWSTR Arg2Name = L"SubnetMask";
VARIANT var2;
__try
{
CreateOneElementBstrArray(&var1, L"10.0.0.101");
CreateOneElementBstrArray(&var2, L"255.255.255.0");
CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (void**)&pLocator);
hr = pLocator->ConnectServer(Path,NULL, NULL, NULL, 0, NULL, NULL,
&pNamespace);
hr = CoSetProxyBlanket( pNamespace ,
RPC_C_AUTHN_WINNT ,
RPC_C_AUTHZ_NONE ,
NULL,
RPC_C_AUTHN_LEVEL_CALL ,
RPC_C_IMP_LEVEL_IMPERSONATE ,
NULL,
EOAC_NONE); if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pNamespace->GetObject(ClassPath, 0, NULL, &pClass, NULL);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pClass->GetMethod(MethodName, 0, &pInputParamClass, NULL);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pInputParamClass->SpawnInstance(0, &pInputParamInstance);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pInputParamInstance->Put(Arg1Name, 0, &var1, 0);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pInputParamInstance->Put(Arg2Name, 0, &var2, 0);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pNamespace->ExecMethod(InstancePath, MethodName, 0, NULL,
pInputParamInstance, &pOutInst, NULL);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
}
__finally
{
if(pInputParamInstance)
pInputParamInstance->Release();
if(pInputParamClass)
pInputParamClass->Release();
if(pClass)
pClass->Release();
if(pNamespace)
pNamespace->Release();
if(pLocator)
pLocator->Release();
}
return hr;
}
BSTR InstancePath = SysAllocString(L"Win32_NetworkAdapterConfiguration=2"); in my computer, network card index is 2, your computer may have a different index
#define _WIN32_DCOM
#include <Wbemidl.h>
#pragma comment(lib,"Wbemuuid.lib")
#include <atlbase.h>
//#include "wbemcli.h"
#include "objbase.h"
#include <windows.h>
#include <comutil.h>
#pragma comment(lib, "comsupp.lib")
void CreateOneElementBstrArray(VARIANT* v, LPCWSTR s)
{
SAFEARRAYBOUND bound[1];
SAFEARRAY* array;
bound[0].lLbound = 0;
bound[0].cElements = 1;
array = SafeArrayCreate(VT_BSTR, 1, bound);
long index = 0;
BSTR bstr = SysAllocString(s);
SafeArrayPutElement(array, &index, bstr);
SysFreeString(bstr);
VariantInit(v);
v->vt = VT_BSTR | VT_ARRAY;
v->parray = array;
}
HRESULT __fastcall UnicodeToAnsi(LPCOLESTR pszW, LPSTR* ppszA)
{ ULONG cbAnsi, cCharacters;
DWORD dwError; // If input is null then just return the same.
if (pszW == NULL)
{
*ppszA = NULL;
return NOERROR;
} cCharacters = wcslen(pszW)+1;
// Determine number of bytes to be allocated for ANSI string. An
// ANSI string can have at most 2 bytes per character (for Double
// Byte Character Strings.)
cbAnsi = cCharacters*2; // Use of the OLE allocator is not required because the resultant
// ANSI string will never be passed to another COM component. You
// can use your own allocator.
*ppszA = (LPSTR) CoTaskMemAlloc(cbAnsi);
if (NULL == *ppszA)
return E_OUTOFMEMORY; // Convert to ANSI.
if (0 == WideCharToMultiByte(CP_ACP, 0, pszW, cCharacters, *ppszA,
cbAnsi, NULL, NULL))
{
dwError = GetLastError();
CoTaskMemFree(*ppszA);
*ppszA = NULL;
return HRESULT_FROM_WIN32(dwError);
}
return NOERROR;} void PrintWMIError(HRESULT hr)
{
IWbemStatusCodeText * pStatus = NULL;
HRESULT hres = CoCreateInstance(CLSID_WbemStatusCodeText, 0, CLSCTX_INPROC_SERVER,
IID_IWbemStatusCodeText, (LPVOID *) &pStatus);
if(S_OK == hres)
{
BSTR bstrError;
hres = pStatus->GetErrorCodeText(hr, 0, 0, &bstrError);
if(S_OK != hres)
bstrError = SysAllocString(L"Get last error failed");
LPSTR pszStatusTextA;
UnicodeToAnsi(bstrError, &pszStatusTextA);
printf("%s\n",pszStatusTextA);
CoTaskMemFree(pszStatusTextA);
pStatus->Release();
SysFreeString(bstrError);
}}HRESULT ConfigNet()
{ IWbemLocator *pLocator=NULL;
IWbemServices *pNamespace=NULL;
IWbemClassObject *pClass=NULL;
IWbemClassObject *pInputParamClass=NULL;
IWbemClassObject *pInputParamInstance=NULL;
IWbemClassObject * pOutInst = NULL;
BSTR InstancePath = SysAllocString(L"Win32_NetworkAdapterConfiguration=2"); /**/
HRESULT hr;
BSTR Path = SysAllocString(L"\\\\MICROSOFT\\root\\cimv2");
BSTR ClassPath = SysAllocString(L"Win32_NetworkAdapterConfiguration");
BSTR MethodName = SysAllocString(L"EnableStatic");
LPCWSTR Arg1Name = L"IPAddress";
VARIANT var1;
LPCWSTR Arg2Name = L"SubnetMask";
VARIANT var2;
__try
{
CreateOneElementBstrArray(&var1, L"10.0.0.101");
CreateOneElementBstrArray(&var2, L"255.255.255.0");
CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (void**)&pLocator);
hr = pLocator->ConnectServer(Path,NULL, NULL, NULL, 0, NULL, NULL,
&pNamespace);
hr = CoSetProxyBlanket( pNamespace ,
RPC_C_AUTHN_WINNT ,
RPC_C_AUTHZ_NONE ,
NULL,
RPC_C_AUTHN_LEVEL_CALL ,
RPC_C_IMP_LEVEL_IMPERSONATE ,
NULL,
EOAC_NONE); if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pNamespace->GetObject(ClassPath, 0, NULL, &pClass, NULL);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pClass->GetMethod(MethodName, 0, &pInputParamClass, NULL);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pInputParamClass->SpawnInstance(0, &pInputParamInstance);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pInputParamInstance->Put(Arg1Name, 0, &var1, 0);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pInputParamInstance->Put(Arg2Name, 0, &var2, 0);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
if(SUCCEEDED(hr))
hr = pNamespace->ExecMethod(InstancePath, MethodName, 0, NULL,
pInputParamInstance, &pOutInst, NULL);
if(!SUCCEEDED(hr)) {PrintWMIError(hr);return hr;}
}
__finally
{
if(pInputParamInstance)
pInputParamInstance->Release();
if(pInputParamClass)
pInputParamClass->Release();
if(pClass)
pClass->Release();
if(pNamespace)
pNamespace->Release();
if(pLocator)
pLocator->Release();
}
return hr;
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
ConfigNet();
CoUninitialize();
printf("Program end\n");
return 0;
}