Desactivar un adaptador de red desde C++

Iniciado por el_doctor, 17 Septiembre 2013, 19:06 PM

0 Miembros y 6 Visitantes están viendo este tema.

el_doctor

Hola, existe alguna manera de desactivar las tarjetas de red desde una aplicación hecha en C++ he estado leyendo la documentación msdn y está la clase Win32_NetworkAdapter la he usado desde C# pero no me funciona no se si puedo usar esta clase en C++ y hacer que funcione o hay alguna otra forma de hacerlo desde C++.

Gracias por su ayuda

Eternal Idol

Si, por supuesto que se puede, busca informacion y ejemplos sobre WMI. Casi con toda seguridad todas esas clases terminan llamando a la API de Windows para implementar su funcionalidad ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

ecfisa

Hola.

Fijate si te sirve alguna de las opciónes de este enlace: Enabling and disabling interface/adapter.

Saludos. :)

el_doctor

Gracias ecfisa lo voy a revisar.

Eternal no me dará problemas usar la clase Win32_NetworkAdapter en Windows8 ya que quiero que la aplicación funcione tanto en windows xq como windows 8

Eternal Idol

No tengo ni la mas minima idea sinceramente, fijate que dice su documentacion y de no servir en Windows 8 seguramente te dara la alternativa para ese S.O..
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_doctor

Hola Eternal estoy intentando usar la api Win32_NetworkAdapter y según estaba leyendo para usar las api hay que inicializar los servicios COM pero tengo ratos de estar rompiendome la cabeza para validar si se ejecuta bien la función CoInitializeEx según la documentación si todo sale bien devuelve S_OK y hago algo así:

Código (cpp) [Seleccionar]
if(CoInitializeEx(0, COINIT_MULTITHREADED) != S_OK)
return NULL;


y al depurar siempre me da error de sintaxis en el if no se si es lo estresado que estoy pero no veo el error

Eternal Idol

Ese codigo compila, no se que estaras haciendo, asegurate que guardaste los cambios y de ultima recompila ... ni se que IDE usas asi que es dificil adivinar.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_doctor

#7
Ya encontré el error era cosa del compilador gracias




Hola Eternal he revisado la documentación del enlace que puso el amigo ecfisa y según lo que ahí describen no es posible desconectar la tarjeta de red de forma real usando la api de windows y sugieren un método usando la interfaz de red shell copie el código e hice la implementación pero no me desconecta la tarjeta de red estoy usando windows 8 voy a poner el código, si me puedes ayudar te lo agradezco o no se si es verídica la información de ese enlace que explican que no es posible desconectar la tarjeta de red usando la api de windows.

Código (cpp) [Seleccionar]
bool DisableConecction(LPCWSTR nameConecction)
{

bool result = false;

CoInitialize(0);

typedef void (_stdcall * LPNcFreeNetconProperties) (NETCON_PROPERTIES* pProps);
HMODULE hmod = LoadLibrary(L"netshell.dll");

if(!hmod)
return false;

LPNcFreeNetconProperties NcFreeNetconProperties =
        (LPNcFreeNetconProperties)GetProcAddress(hmod, "NcFreeNetconProperties");

if(!NcFreeNetconProperties)
return false;

INetConnectionManager * pMan = 0;

    HRESULT hres = CoCreateInstance(CLSID_ConnectionManager,
                                    0,
                                    CLSCTX_ALL,
                                    __uuidof(INetConnectionManager),
                                    (void**)&pMan);

if(SUCCEEDED(hres))
{
IEnumNetConnection * pEnum = 0;

hres = pMan->EnumConnections(NCME_DEFAULT, &pEnum);

if(SUCCEEDED(hres))
{
INetConnection * pCon = 0;
ULONG count;
bool done = false;

while(pEnum->Next(1, &pCon, &count) == S_OK && !done)
{
NETCON_PROPERTIES * pProps = 0;

hres = pCon->GetProperties(&pProps);

if(SUCCEEDED(hres))
{
if(wcscmp (pProps->pszwName, L"Ethernet") == 0) //Aqui lo puse estático ya que este es el nombre que tiene para mi computadora.
{
result = (pCon->Disconnect() == S_OK);
done = true;
}
NcFreeNetconProperties (pProps);
}
pCon->Release();
}
pEnum->Release();
}
pMan->Release();
}
FreeLibrary(hmod);

CoUninitialize();

return result;
}

Eternal Idol

Sinceramente no se de donde sacas eso, se hace como dice ahi con la Device Installation API. Por logica ningun objeto COM va a poder hacer magia si el S.O. no le provee la funcionalidad ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_doctor

#9
Hola Eternal pues he vuelto con lo de usar la Win API y pues según revisando la documentación de MSDN pues he implementado un código pero he quedado bloqueado para poder ejecutar el método Disable de la WIN32_NetworkAdapter que se supone es para desconectar la tarjeta de red, no se si una vez inicializado el COM y obtener los permisos debo recorrer la clase o como te agradecería si me ayudas te dejo el código que he escrito hasta ahora:

Código (cpp) [Seleccionar]
HRESULT hres;

//Initialize COM

if (CoInitializeEx(0, COINIT_MULTITHREADED) != S_OK)
{
CoUninitialize();
return false;
}

// Set general COM security levels --------------------------
 
if (CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL) != S_OK)
{
CoUninitialize();
return false;
}

//Obtain the initial locator to WMI

IWbemLocator *pLoc = NULL;

if (CoCreateInstance (CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc) != S_OK)
{
CoUninitialize();
return false;
}

// Connect to WMI through the IWbemLocator::ConnectServer method

IWbemServices *pSvc = NULL;

hres = pLoc->ConnectServer (_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);

if (FAILED (hres))
{
pLoc->Release();
CoUninitialize();
return false;
}

// Set security levels on the proxy

if (CoSetProxyBlanket (pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE) != S_OK)
{
pSvc->Release();
pLoc->Release();
CoUninitialize();
return false;
}

// set up to call the Win32_NetworkAdapter::Disable method

BSTR MethodName = SysAllocString (L"Disable");
BSTR ClassName = SysAllocString (L"Win32_NetworkAdapter");

IWbemClassObject* pClass = NULL;
hres = pSvc->GetObject (ClassName, 0, NULL, &pClass, NULL);

IWbemClassObject* pInParamsDefinition = NULL;
hres = pClass->GetMethod (MethodName, 0, &pInParamsDefinition, NULL);