elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [DUDA] Habilitar/Deshabilitar adaptador de red
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [DUDA] Habilitar/Deshabilitar adaptador de red  (Leído 2,847 veces)
DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
[DUDA] Habilitar/Deshabilitar adaptador de red
« en: 8 Agosto 2015, 16:37 pm »

Vengo hoy con una duda para ver si me pueden guiar en la dirección correcta.

Estoy haciendo unas prueba y necesito usando .NET habilitar y deshabilitar un adaptador de red.

Hasta ahora, utilizando la clase NetworkInterface dentro de System.Net.NetworkInformation.

Hice esto para obtener los nombres de los adaptadores y su dirección MAC (registrados en Windows)

Código
  1. public static List<string> GetDevices()
  2. {
  3.  List<string> nDevicesList = new List<string>();
  4.  
  5.  foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
  6.  {
  7.    PhysicalAddress address = nic.GetPhysicalAddress();
  8.  
  9.    if((nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel) && !string.IsNullOrEmpty(address.ToString()))
  10.      nDevicesList.Add("Mac: {0} NetAdapter: {1}", address.ToString(), nic.Description);
  11.  }
  12.  
  13. return nDevicesList;
  14.  
  15. }

Hasta ahí todo bien.

El problema ahora es que quiero poder seleccionar un adaptador y hacerle como un Reset, o sea, deshabilitarlo y luego habilitarlo.

Después de buscar información, me encontré con una manera de hacerlo utilizando la clase WMI -> Win32_NetworkAdapter, que además de estar deprecada, para los sistemas operativos Windows 2003, Windows XP, Windows 2000 y Windows NT 4.0 no tiene disponible los métodos Enable y Disable.

Lo cual no me será factible para esos SO.

Como alternativa a esta clase deprecada está la MSFT_NetAdapter pero tampoco, pues el menor cliente soportado es Windows 8.

También estuve leyendo sobre una forma de hacerlo utilizando netsh e hice esto:

Código
  1. static void Enable(string interfaceName)
  2.        {
  3.            ProcessStartInfo psi = new ProcessStartInfo("netsh", "interface set interface \"" + interfaceName + "\" enable");
  4.            Process p = new Process();
  5.            p.StartInfo = psi;
  6.            p.Start();
  7.        }
  8.  
  9.        static void Disable(string interfaceName)
  10.        {
  11.            ProcessStartInfo psi = new ProcessStartInfo("netsh", "interface set interface \"" + interfaceName + "\" disable");
  12.            Process p = new Process();
  13.            p.StartInfo = psi;
  14.            p.Start();
  15.        }

Lo cual no se si lo habré programado bien, pero no me funcionó (ni en Windows 8.1 ni en Windows XP SP2)

Luego me encontré con una clase en CodeProject:

http://www.codeproject.com/Articles/21503/Hardware-Helper-Library-for-C

La cual lista todos los dispositivos en el administrador de dispositivos (solo funciona en Windows XP), utilizando hooks a nivel de sistema. Esta clase esta pensada pensada para recibir notificaciones de los eventos de añadir y quitar dispositivos, y tiene la funcionalidad de habilitarlos o desahibilitarlos.

Nota: Esta clase tiene un poco de unamanged code con el cual no estoy familiarizado (aún)

Imagino que puedo hacer un cross-reference con el método que hice para saber los adaptadores de red y solo capturar esos utilizando esta clase, pero todavía me queda el problema de que debo tener código para distintas versiones de Windows.

¿Que debería hacer?
¿Hacer código para distintas versiones de Windows?
¿Existe alguna vía de habilitar/deshabilitar los adaptadores de red de alguna manera que funcione en todos los SO? (me da a que no, pero quizás me puedan corroborar o refutar mi idea?

Agradezco cualquier sugerencia/idea/crítica.

Salu2s

Edito:
PD: También sé que está la utilidad devcon.exe, pero quiero evitar esto por ahora.


« Última modificación: 8 Agosto 2015, 17:01 pm por DarK_FirefoX » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.809



Ver Perfil
Re: [DUDA] Habilitar/Deshabilitar adaptador de red
« Respuesta #1 en: 8 Agosto 2015, 21:21 pm »

1. ¿La aplicación es solamente para ti?, ya que en ese caso te podrías conformar con cualquier solución aunque no funcione en "X" S.O, por eso lo pregunto.

2. Por lo que leí investigando un poco, son los desarrolladores del driver quienes deciden si implementar los métodos Enable y Disable, pero la posibilidad de que no lo hagan es muy, muy pequeña (¿mala suerte?).

3. He generado una class que sirve como wrapper de la class Win32_NetworkAdapter de W.M.I utilizando la herramienta mgmtclassgen.exe de la SDK de Windows, y me he dado cuenta que aparte de Enable y Disable, puedes invokar un método llamado Reset, el cual imagino que reiniciará el dispositivo, aunque en mi caso parece no estar implementado, pero en tu adaptador de red tal vez si.

4. Sinceramente dudo mucho que los métodos Enable/Disable o Reset de la class MSFT_NetAdapter hagan algo distinto a lo que hace W.M.I.

5. Si realmente necesitas una solución genérica entonces, al parecer puedes usar en combinacion estas definiciones de la WinAPI:
Using Device Installation Functions - MSDN
Win32 API function to programmatically enable/disable device - StackOverFlow

No lo he puesto en práctica, pero al parecer sería más o menos así:
1) Get a handle to a device info set using SetupDiGetClassDevs - this will get all devices in a class.
2) Get device info data for each device in the class using SetupDiEnumDeviceInfo
3) Get the device instance id for each device using the device info data from (2) and SetupDiGetDeviceInstanceId.
4) Fill in a structure to say you want a property change and call SetupDiSetClassInstallParams. This sets the property in the device info set.
5) Call SetupDiCallClassInstaller to get the installer to make the changes stick.

Otra solución genérica, sería invocar los comandos o verbos "Enable" o "Disable" en "X" conexión, para esto solamente necesitas averiguar el CLSID del directorio virtual de las conexiones de red.

Esta solución me gusta más por que aparte de que no implica P/Invoking, está más enfocada al problema ...es decir, a las conexiones de red, peeeeero... no es del todo funcional.

Código
  1.        Dim connectionName As String = "VMware Network Adapter VMnet1"
  2.  
  3.        Dim shellApp As New Shell32.Shell()
  4.        Dim networkConnectionsFolder As Shell32.Folder = shellApp.NameSpace("::{7007ACC7-3202-11D1-AAD2-00805FC1270E}") ' Para Windows 8.1 x64
  5.  
  6.        For Each folderItem As Shell32.FolderItem In networkConnectionsFolder.Items()
  7.  
  8.            Dim deviceName As String = networkConnectionsFolder.GetDetailsOf(folderItem, 2)
  9.            Dim status As String = networkConnectionsFolder.GetDetailsOf(folderItem, 2)
  10.  
  11.            If folderItem.Name.Equals(connectionName, StringComparison.OrdinalIgnoreCase) Then
  12.                folderItem.InvokeVerb("Disable")
  13.                folderItem.InvokeVerb("Enable")
  14.            End If
  15.  
  16.        Next

El código de arriba requiere una referencia COM a Microsoft Shell Controls And Automation.

El código no está pulido, despues de activar o desactivar la conexión, no se puede hacer lo opuesto, habría que investigar el por qué.

Los CLSIDs de las distintas versiones de Windows los puedes encontrar investigando en Google, o con la librería Windows API Code Pack de Microsoft, en la propiedad "ParsingName", testeando en cada OS.

He intentado reproducir el código de arriba con la librería de Microsoft, ya que es mucho más util se mire por donde se mire, aparte de tener muchos más miembros, no es necesario andarse con CLSIDS hardcodeadas y tiene un sistema de propiedades mucho más sofisticado, pero me ha sido imposible averiguar como invokar un verb.

PD: Se que no es mucha ayuda el último código, ya que está incompleto ...no es del todo funcional, pero de todas formas supongo que con la primera solución de la WinAPI vas a tener suficiente para hacer lo que necesitas.

Saludos


« Última modificación: 8 Agosto 2015, 21:24 pm por Eleкtro » En línea

DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: [DUDA] Habilitar/Deshabilitar adaptador de red
« Respuesta #2 en: 9 Agosto 2015, 02:57 am »

1. ¿La aplicación es solamente para ti?, ya que en ese caso te podrías conformar con cualquier solución aunque no funcione en "X" S.O, por eso lo pregunto.

Bueno, la verdad que quizás no sea para mi solo, en principio si, pero me gustaria que funcionara al menos en Windows XP, Windows 7 y Windows 8/8.1.

2. Por lo que leí investigando un poco, son los desarrolladores del driver quienes deciden si implementar los métodos Enable y Disable, pero la posibilidad de que no lo hagan es muy, muy pequeña (¿mala suerte?).

También había leído esto, pero en los temas que leí (que al parecer no eran modernos) los usuarios hablaban pobremente de esto, de tal manera que no muchos desarrolladores implementaban estos métodos.

4. Sinceramente dudo mucho que los métodos Enable/Disable o Reset de la class MSFT_NetAdapter hagan algo distinto a lo que hace W.M.I.

Prácticamente hacen lo mismo, solo que de igual manera no me sirve para los OS anteriores.

5. Si realmente necesitas una solución genérica entonces, al parecer puedes usar en combinacion estas definiciones de la WinAPI:
Using Device Installation Functions - MSDN
Win32 API function to programmatically enable/disable device - StackOverFlow

No lo he puesto en práctica, pero al parecer sería más o menos así:
Otra solución genérica, sería invocar los comandos o verbos "Enable" o "Disable" en "X" conexión, para esto solamente necesitas averiguar el CLSID del directorio virtual de las conexiones de red.

Esta solución me gusta más por que aparte de que no implica P/Invoking, está más enfocada al problema ...es decir, a las conexiones de red, peeeeero... no es del todo funcional.

Código
  1.        Dim connectionName As String = "VMware Network Adapter VMnet1"
  2.  
  3.        Dim shellApp As New Shell32.Shell()
  4.        Dim networkConnectionsFolder As Shell32.Folder = shellApp.NameSpace("::{7007ACC7-3202-11D1-AAD2-00805FC1270E}") ' Para Windows 8.1 x64
  5.  
  6.        For Each folderItem As Shell32.FolderItem In networkConnectionsFolder.Items()
  7.  
  8.            Dim deviceName As String = networkConnectionsFolder.GetDetailsOf(folderItem, 2)
  9.            Dim status As String = networkConnectionsFolder.GetDetailsOf(folderItem, 2)
  10.  
  11.            If folderItem.Name.Equals(connectionName, StringComparison.OrdinalIgnoreCase) Then
  12.                folderItem.InvokeVerb("Disable")
  13.                folderItem.InvokeVerb("Enable")
  14.            End If
  15.  
  16.        Next

El código de arriba requiere una referencia COM a Microsoft Shell Controls And Automation.

El código no está pulido, despues de activar o desactivar la conexión, no se puede hacer lo opuesto, habría que investigar el por qué.

Los CLSIDs de las distintas versiones de Windows los puedes encontrar investigando en Google, o con la librería Windows API Code Pack de Microsoft, en la propiedad "ParsingName", testeando en cada OS.

He intentado reproducir el código de arriba con la librería de Microsoft, ya que es mucho más util se mire por donde se mire, aparte de tener muchos más miembros, no es necesario andarse con CLSIDS hardcodeadas y tiene un sistema de propiedades mucho más sofisticado, pero me ha sido imposible averiguar como invokar un verb.

PD: Se que no es mucha ayuda el último código, ya que está incompleto ...no es del todo funcional, pero de todas formas supongo que con la primera solución de la WinAPI vas a tener suficiente para hacer lo que necesitas.

Saludos

Voy a revisar todo esto que me pusiste en un rato y después te digo, quizás esto me da un pie de inicio para ir en el buen camino, muchas gracias por la elaborada respuesta.

Si se te ocurre otra cosa o tienes alguna otra sugerencia no dudes en postearla, será bienvenida!

Ya te diré luego como me fue.

Salu2s

PD: Una vez que logre terminar esto vendré con otra duda para la misma aplicación :P
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
habilitar/deshabilitar conexion de red
Programación General
xkiz ™ 0 3,882 Último mensaje 11 Septiembre 2010, 08:02 am
por xkiz ™
habilitar o deshabilitar adaptador de red [Win32_NetworkAdapter]
Programación Visual Basic
xkiz ™ 3 5,542 Último mensaje 12 Septiembre 2010, 15:15 pm
por skapunky
Habilitar picture y deshabilitar? TRUE FALSE?
Programación Visual Basic
usuario oculto 3 2,069 Último mensaje 27 Octubre 2011, 16:00 pm
por usuario oculto
Habilitar/Deshabilitar TouchPad en WINDOWS 7
Windows
moji87 1 25,297 Último mensaje 14 Febrero 2012, 19:06 pm
por Randomize
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines