rt,只是大概知道好像可以用WMI来实现,但是具体怎么做呢?望大侠指教!!

解决方案 »

  1.   

    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;
    }
      

  2.   

    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
      

  3.   

    呵呵,是啊,我记得看过这个帖子,当时这个帖子好像就是 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"); 

    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;
    }
      

  4.   

    直接用API可以实现啊!!!!!!!!!!!