c++ - msdos - Deshabilitar/habilitar programáticamente la interfaz de red
habilitar adaptador wifi desde cmd (7)
Después de probar en más plataformas y más enfoques, básicamente he renunciado a esta funcionalidad (al menos para mis propósitos). El problema para mí es que quiero tener algo que funcione en más del 90% de las situaciones, y la realidad es que con todo lo que se me ocurre, está cerca del 70%. Lo irónico es que en realidad es tan inestable a través del método normal de Windows. Para aquellos que todavía quieren seguir este camino peligroso, esto es lo que encontré:
De los métodos directos de la API descritos anteriormente, el que funcionó de manera más consistente fue el uso de SetupAPI (SetupDiSetClassInstallParams): el mayor problema que encontré con esto es que a veces obtendría un estado en el que requeriría un reinicio y ningún cambio Trabajar hasta que eso pasara. La única otra cosa que debe tener en cuenta al usar esto es que hay dos perfiles para dispositivos, por lo que debe alternarlos en algunos casos. El DDK contiene la fuente de la herramienta devcon, que le muestra exactamente cómo hacerlo todo. En última instancia, parecía que era lo más parecido a hacer clic con el botón derecho, pero aún mostraba algún comportamiento extraño que no hizo Network Connections. Este enfoque pareció funcionar aproximadamente el 70% del tiempo (en ambas pruebas y en sistemas de prueba).
Desde el enfoque de pirateo total, lo mejor que encontré fue no usar la técnica que ToggleNIC, sino usar el elemento IShellFolder: esto te permite usar GetCommandString, que es independiente del idioma. El problema con esto es que bajo XP GetCommandString no devuelve nada (oh, alegría), pero parecía que las ID de menú para "habilitar" y "deshabilitar" eran consistentes (16 y 17 respectivamente), por lo que si fallaba en GetCommandString , Acabo de volver a caer a los identificadores de menú. Para alternar, simplemente llame a InvokeCommand con la cadena si devolvió una, o con el ID de menú si no lo hizo. El problema con esto fue que, al igual que la forma normal de Windows, a veces no funciona, ni te da ninguna indicación de lo que está pasando o por qué falló. Este enfoque parecía funcionar aproximadamente el 70% del tiempo también, pero era mucho más difícil decir si algo iba mal, más el texto normal de "Interfaz de habilitación ..." aparecería.
Esperemos que esto ayude a cualquier otra persona, y si alguien logra encontrar otra forma que funcione en más situaciones, ¡me encantaría escucharla!
Estoy tratando de encontrar una solución para habilitar / deshabilitar programáticamente la tarjeta de red. He investigado un montón y nada parece ser una solución viable tanto en entornos XP como Vista. A lo que me refiero es si ingresó a las ''Conexiones de red'' del Panel de control, hizo clic derecho en una y seleccionó habilitar o deshabilitar. Idealmente, me gustaría usar una biblioteca, pero en el peor de los casos supongo que podría recurrir a una aplicación de línea de comandos, pero ese es el peor de los casos. Esto es lo que he intentado hasta ahora y dónde / por qué fallaron:
Este post anterior:
¿Cómo habilitar / deshabilitar programáticamente las interfaces de red? (Windows XP)
Enumera un par de métodos: el primero es usar netsh, que parece ser lo mismo que usar la función IPHelper SetIfEntry (). El problema con esto es que configura la interfaz como Administrativamente habilitada o deshabilitada, no como la habilitación / deshabilitación normal, por lo que en realidad no apaga la NIC.
Otra solución propuesta es usar WMI y en particular la clase Win32_NetworkAdapter, que tiene un método de Habilitar y Deshabilitar:
http://msdn.microsoft.com/en-us/library/aa394216(VS.85).aspx
Gran derecho Funciona bien en Vista, esos métodos no existen en una instalación normal de XP ...
Otra sugerencia es usar DevCon, que realmente usa SetupAPI, en particular SetupDiSetClassInstallParams () con DICS_ENABLE. Después de pasar innumerables horas con esta clase maravillosa, y tratar de deshabilitar / habilitar el dispositivo tanto a nivel global como a nivel de configuración específica (y cada combinación), tampoco funciona de manera consistente, a veces funciona bien, pero otras veces deshabilitar el dispositivo en el Administrador de dispositivos, pero aún dejarlo en funcionamiento y en las conexiones de red.
Luego intenté usar la interfaz INetConnection, específicamente INetConnection-> Conectar / Desconectar:
http://msdn.microsoft.com/en-us/library/aa365084(VS.85).aspx
Pero nunca pude lograr que esto tuviera ningún efecto en las conexiones en mis cajas de prueba de Vista o XP.
Finalmente, encontré este script de C # llamado ToggleNic:
http://channel9.msdn.com/playground/Sandbox/154712/
Lo que parece que está pasando por el Shell de alguna manera para causar efectivamente el comportamiento del clic derecho. La limitación (al menos de esta implementación) es que no funciona (sin modificaciones) en sistemas que no están en inglés, con los que necesito trabajar con los míos. Para ser justos, esta solución parece la más viable, pero mi familiaridad con C # es baja y no pude encontrar si la API que está usando está disponible en C ++.
Cualquier ayuda o información sería muy apreciada, o ideas sobre cómo lograr lo que hace el script togglenic en C ++. ¡Gracias!
Encontré esta solución que es básicamente la automatización del clic derecho: http://www.wilderssecurity.com/showthread.php?t=265836 Funciona tanto en Windows XP como en Windows 7
También hay uno escrito por Novell, que es un envoltorio sobre DevCon: http://www.novell.com/communities/node/2338/network-configuration-command-line-control
Pruebe el código C ++ de " Interfaces de red de shell " here . Esto debería funcionar bajo XP y superior.
ToggleNic utiliza Shell32 a través de COM. En c esto se usa por las bibliotecas estándar "SHLOBJ.H" "SHELLAPI.H" y la clase IShellDispatch.
después de mucho buscar comencé a profundizar en DEVCON. Después de darme cuenta de que esos métodos tenían que ser pinvokables, hice una pequeña búsqueda y encontré esto: http://www.codeproject.com/KB/cs/HardwareHelper.aspx
Me ayudó a resolver mi problema de habilitar y deshabilitar el adaptador TAP de OpenVPN al menos.
''==========================================================================
'' NAME: 1unconnectedNIC.vbs
''
'' COMMENT: This file will disable and rename the unconnected NIC on the
'' local server.
''
'' Usage:
'' cscript 1unconnectedNIC.vbs
'' Alex John
''==========================================================================
strComputer = "."
Set objShell = CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!//" & strComputer & "/root/cimv2")
Set colAdapters = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter where NetConnectionStatus = ''7''" )
''For every adapter that is disconnected (has a red X by it)
For Each objAdapter in colAdapters
Wscript.Echo "Net Connection ID: " & objAdapter.NetConnectionID
Wscript.Echo "....Disabling NIC"
''Disable the NIC
objShell.Run "netsh interface set interface name=" & chr(34) & objAdapter.NetConnectionID & chr(34) & " admin=disabled", 0, true
Wscript.Echo "....NIC Disabled"
WScript.Sleep 10000
''Rename the NIC
Wscript.Echo "....Renaming NIC to ''Not Used''"
objShell.Run "netsh interface set interface name=" & chr(34) & objAdapter.NetConnectionID & chr(34) & " newname=" & chr(34) & "Not Used" & n & chr(34), 0, true
Next
Wscript.Echo "Finished"
ManagementClass managementClass = new ManagementClass("Win32_NetworkAdapter");
ManagementObjectCollection mgmtObjectColl = managementClass.GetInstances();
ManagementObject myObject = null;
foreach (ManagementObject mgmtObject in mgmtObjectColl)
{
if (mgmtObject["NetConnectionID"] != null && mgmtObject["NetConnectionID"].Equals("Local Area Connection"))
{
Console.WriteLine("found");
myObject = mgmtObject;
object result = mgmtObject.InvokeMethod("Disable", null);
}
//Console.WriteLine("{0}, {1}", mgmtObject["Name"], mgmtObject["NetConnectionID"]);
}
object result3 = myObject.InvokeMethod("Enable", null);