Désactiver / activer par programmation l’interface réseau

J’essaie de trouver une solution pour activer / désactiver par programmation la carte réseau – j’ai fait beaucoup de recherches et rien ne semble être une solution viable dans les environnements XP et Vista. Ce dont je parle, c’est que si vous êtes allé dans le Panneau de configuration ‘Connexions réseau’, cliquez avec le bouton droit de la souris sur l’un et sélectionnez Activer ou Désactiver. Idéalement, je voudrais utiliser une bibliothèque, mais si le pire vient au pire, je suppose que je pourrais appeler une application en ligne de commande, mais c’est le pire des cas. Voici ce que j’ai essayé jusqu’ici et où / pourquoi ils ont échoué:

Ce post précédent:

Comment activer / désactiver par programmation des interfaces réseau? (Windows XP)

Répertorie quelques méthodes – la première utilise netsh, qui semble être identique à la fonction IPHelper SetIfEntry (). Le problème est que cela définit l’interface comme étant activée ou désactivée par l’administrateur, et non comme la fonction activée / désactivée normale, de sorte qu’elle n’arrête pas réellement la carte réseau.

Une autre solution proposée consiste à utiliser WMI et en particulier la classe Win32_NetworkAdapter, qui possède une méthode d’activation et de désactivation:

http://msdn.microsoft.com/en-us/library/aa394216(VS.85).aspx

Très bien non? Fonctionne bien dans Vista, ces méthodes n’existent pas dans une installation XP normale …

Une autre suggestion consiste à utiliser DevCon, qui utilise réellement SetupAPI, en particulier SetupDiSetClassInstallParams () avec DICS_ENABLE. Après avoir passé d’innombrables heures avec cette classe merveilleuse et essayé d’activer / désactiver le périphérique au niveau global ainsi qu’au niveau de la configuration spécifique (et à chaque combinaison), cela ne fonctionne pas non plus de manière constante, parfois même très bien, mais d’autres fois Désactiver le périphérique dans le Gestionnaire de périphériques, mais le laisser en place et opérationnel dans les Connexions réseau.

J’ai ensuite essayé d’utiliser l’interface INetConnection, en particulier INetConnection-> Connect / Disconnect:

http://msdn.microsoft.com/en-us/library/aa365084(VS.85).aspx

Mais je n’ai jamais pu obtenir que cela ait un effet sur les connexions sur mes boîtes de test Vista ou XP.

Enfin, j’ai trouvé ce script C # appelé ToggleNic:

http://channel9.msdn.com/playground/Sandbox/154712/

Ce qui semble passer par le Shell pour provoquer le comportement du clic droit. La limitation (au moins de cette implémentation) est qu’elle ne fonctionne pas (sans modification) sur des systèmes non anglais, avec lesquels je dois travailler. Pour être juste, cette solution semble la plus viable, mais ma connaissance de C # est faible et je n’ai pas pu trouver si l’API utilisée est disponible en C ++.

Toute aide ou idée serait grandement appréciée – ou des idées sur la façon d’accomplir ce que le script togglenic fait en C ++. Merci!

Après avoir testé plus de plates-formes et d’autres approches, j’ai essentiellement abandonné cette fonctionnalité (du moins pour mes besoins). Le problème pour moi est que je veux avoir quelque chose qui fonctionne dans 90% des cas, et la réalité est que, avec tout ce que je pourrais trouver, cela se rapprocherait de 70%. L’ironie, c’est que c’est en fait tout simplement flou par la méthode Windows normale. Pour ceux qui veulent encore emprunter ce chemin périlleux, voici ce que j’ai trouvé:

Parmi les méthodes directes de l’API décrites ci-dessus, celle qui fonctionnait le mieux consistait à utiliser SetupAPI (SetupDiSetClassInstallParams) – le plus gros problème que je rencontrais est que parfois, cela nécessiterait un redémarrage et qu’aucune modification ne serait nécessaire. travailler jusqu’à ce que cela se produise. La seule autre chose à prendre en compte lors de son utilisation est qu’il existe deux profils pour les périphériques, vous devez donc les basculer tous les deux dans certains cas. Le DDK contient la source de l’outil devcon, qui vous montre exactement comment tout faire. Cela a finalement semblé être le plus proche du clic droit, mais il a toujours montré un comportement étrange que Network Connections n’a pas. Cette approche semblait fonctionner environ 70% du temps (à la fois dans les tests et sur les systèmes de test).

Du sharepoint vue du hack total, le meilleur que j’ai trouvé n’utilisait pas la technique utilisée par ToggleNIC, mais utilisait plutôt le logiciel IShellFolder – cela vous permet d’utiliser GetCommandSsortingng, qui est indépendant du langage. Le problème avec ceci est que sous XP, GetCommandSsortingng ne renvoie rien (oh joy), mais il semble que les identifiants de menu pour ‘enable’ et ‘disable’ étaient cohérents (respectivement 16 et 17), donc si j’échouais à GetCommandSsortingng , Je suis juste revenu aux identifications de menu. Pour basculer, appelez simplement InvokeCommand soit avec la chaîne si elle en a renvoyé une, soit avec l’ID de menu si ce n’est pas le cas. Le problème était que, comme pour Windows, parfois, cela ne fonctionnait pas, et cela ne vous donnait aucune indication sur ce qui se passait ou pourquoi cela avait échoué. Cette approche semblait également fonctionner environ 70% du temps, mais il était beaucoup plus difficile de dire si quelque chose n’allait pas, et le texte “Interface d’activation …” s’ouvrait.

J’espère que cela aidera quelqu’un d’autre – et si quelqu’un réussit à trouver un autre moyen qui fonctionne dans plus de situations, j’adorerais l’entendre!

Essayez le code C ++ ” Interfaces réseau Shell ” ici . Cela devrait fonctionner sous XP et supérieur.

Après de nombreuses recherches, j’ai commencé à creuser dans DEVCON. Après avoir réalisé que ces méthodes devaient être lisibles, j’ai fait une petite recherche et j’ai trouvé ceci: http://www.codeproject.com/KB/cs/HardwareHelper.aspx

Cela m’a aidé à résoudre le problème de l’activation et de la désactivation de l’adaptateur TAP depuis OpenVPN.

'========================================================================== ' 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); 

ToggleNic utilise Shell32 via COM. Dans c cela utilise les librairies standards “SHLOBJ.H” “SHELLAPI.H” et la classe IShellDispatch.

Trouvé cette solution qui est essentiellement l’automatisation du clic droit: http://www.wilderssecurity.com/showthread.php?t=265836 Fonctionne à la fois sur Windows XP et Windows 7

Il y en a aussi un écrit par Novell, qui est un wrapper au-dessus de DevCon: http://www.novell.com/communities/node/2338/network-configuration-command-line-control