Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - el_doctor

#31
Lo que estoy intentando hacer es llamar el método disable de la wmi networkAdapter desde un objeto COM




Es que según un ejemplo de la documentación MSDN hacen una llamada al método Create de Win32_Process y lo hacen usando un objeto COM y quería implentar esto mismo pero no lo tengo muy claro como es que lo podría usar para llamar el método Disable para Win32_NetworkAdapter el ejemplo que ponen es casi igual al que puse de iniciar el objeto com y obtener los permisos y la llamada al método la hacen así:

Código (cpp) [Seleccionar]
BSTR MethodName = SysAllocString(L"Create");
    BSTR ClassName = SysAllocString(L"Win32_Process");

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

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

    IWbemClassObject* pClassInstance = NULL;
    hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);

    // Create the values for the in parameters
    VARIANT varCommand;
    varCommand.vt = VT_BSTR;
    varCommand.bstrVal = L"notepad.exe";

    // Store the value for the in parameters
    hres = pClassInstance->Put(L"CommandLine", 0,
        &varCommand, 0);
    wprintf(L"The command is: %s\n", V_BSTR(&varCommand));

    // Execute Method
    IWbemClassObject* pOutParams = NULL;
    hres = pSvc->ExecMethod(ClassName, MethodName, 0,
    NULL, pClassInstance, &pOutParams, NULL);



Sabes si es viable lo que intento hacer Eternal y cómo podría hacerlo?
#32
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);

#33
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;
}
#34
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
#35
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
#36
He intentado utilizar la clase MSFT_NetAdapter para ver si es problema de la versión de Windows ya que estoy usando windows 8 lo he implementado igual que la clase "Win32_NetworkAdapter" pero en el foreach me da un error y me dice clase no válida alguien me puede decir por que el error? o es que en esta clase hay que hacerlo de otra forma, el código de la implementación es el siguiente:

Código (csharp) [Seleccionar]
const string adapterType = "802.3";
var query = new SelectQuery("MSFT_NetAdapter", "State=2 and NdisMedium='" + adapterType + "'");

           var searcher = new ManagementObjectSearcher(query);

           foreach (ManagementObject result in searcher.Get())
           {
               var state = result["State"];
               var ndisMedium = result["NdisMedium"];
               result.InvokeMethod("Disable", null);
               result.InvokeMethod("Lock", null);
             
           }


Si alguien puede ayudarme se los agradezco
#37
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
#38
Saludos gracias por tu observación Elecktro pero el problema no está en la consulta, ya que estoy usando SelectQuery este método acepta dos parámetros que son la clase que vas usar y la condición y por defecto el agrega a la consulta la instrucción Select * y Where si agregas where dentro del parámetro de condición te da un error en la consulta.

Referente a la clase que estoy usando uso la "Win32_NetworkAdapter" porque quiero que funcione tanto para windows xp como con windows 8 aunque estoy haciendo las pruebas con windows 8 no se si eso tiene que ver yo entendería que a pesar de ser obsoleta la clase puede funcionar en windows 8 pero tengo mis dudas en eso, o no se si es problemas de privilegios de administrador.
#39
Gracias  EleKtro H@cker, me ha servido la referencia.
#40
Saludos, estoy intentando desactivar la tarjeta de red usando una aplicación en C# pero no se si lo he hecho bien o me falta algo ya que al ejecutar el programa no me desactiva la tarjeta de red, estoy usando la clase Win32_NetworkAdapter y mi función queda así:

Código (csharp) [Seleccionar]
private void DisableNetworkByAdapterType(string adapterType)
       {

           var query = new SelectQuery("Win32_NetworkAdapter",
                                       "NetConnectionStatus=2 and AdapterType='" + adapterType + "'");

           var searcher = new ManagementObjectSearcher(query);

           foreach (ManagementObject result in searcher.Get())
           {
               result.InvokeMethod("Disable", null);
           }
       }


nota: el parámetro adapterType yo le mando "Ethernet 802.3"