[英]Programmatically disable/enable network interface
我正在嘗試提出一種以編程方式啟用/禁用網卡的解決方案 - 我已經做了大量研究,在XP和Vista環境中似乎都沒有什么可行的解決方案。 我所說的是如果你進入控制面板的“網絡連接”,右鍵單擊一個並選擇啟用或禁用。 理想情況下我想使用一個庫,但如果情況變得更糟,我想我可以調用命令行應用程序,但這絕對是最糟糕的情況。 這是我到目前為止所嘗試的以及他們失敗的地點/原因:
這篇上一篇文章:
如何以編程方式啟用/禁用網絡接口? (Windows XP)
列出了幾種方法 - 第一種是使用netsh,它看起來與使用IPHelper函數SetIfEntry()相同。 這樣做的問題是它將接口設置為啟用或禁用管理,而不是正常啟用/禁用,因此它實際上不會關閉NIC。
建議的另一個解決方案是使用WMI,特別是Win32_NetworkAdapter類,它具有啟用和禁用方法:
http://msdn.microsoft.com/en-us/library/aa394216(VS.85).aspx
好吧? 在Vista中工作正常,這些方法在普通的XP安裝中不存在...
另一個建議是使用DevCon,它真正使用SetupAPI,特別是SetupDiSetClassInstallParams()和DICS_ENABLE。 在這個精彩的課程花了無數個小時后,嘗試在全局級別以及特定配置級別(以及每個組合)中禁用/啟用設備,它也不能始終如一地工作 - 有時工作正常,但其他時間在設備管理器中禁用該設備,但仍在網絡連接中將其保留並運行。
然后我嘗試使用INetConnection接口,特別是INetConnection-> Connect / Disconnect:
http://msdn.microsoft.com/en-us/library/aa365084(VS.85).aspx
但我無法讓這對我的Vista或XP測試盒上的連接產生任何影響。
最后,我發現這個名為ToggleNic的C#腳本:
http://channel9.msdn.com/playground/Sandbox/154712/
看起來它正以某種方式通過Shell以有效地導致右鍵單擊行為。 限制(至少是這個實現)是因為它在非英語系統上不起作用(沒有修改),我需要我的工作。 公平地說,這個解決方案看起來是最可行的,但我對C#的熟悉程度很低,我無法找到它使用的API是否在C ++中可用。
任何幫助或見解都將非常感激 - 或者關於如何完成togglenic腳本在C ++中的功能的想法。 謝謝!
在更多平台和更多方法上進行測試之后,我基本上放棄了這個功能(至少對我而言)。 對我來說,問題在於我希望能夠在90%以上的情況下使用某些東西,現實情況是,我能想出的一切,接近70%。 具有諷刺意味的是,它實際上與普通的Windows方法一樣片狀。 對於那些仍然希望走下這條危險道路的人來說,這就是我發現的:
在上面描述的API直接方法中,最一致的方法是使用SetupAPI(SetupDiSetClassInstallParams) - 我遇到的最大問題是,有時它會進入需要重新啟動的狀態,並且不會進行任何更改工作直到那件事發生。 使用它時唯一需要注意的是設備有兩個配置文件,因此在某些情況下需要切換它們。 DDK包含devcon工具的源代碼,它可以准確地顯示如何執行所有操作。 這最終看起來最接近右鍵,但它仍然表現出一些網絡連接沒有的奇怪行為。 這種方法似乎在70%的時間內起作用(在測試和測試系統中)。
從整個hack方法來看,我發現的最好的不是使用ToggleNIC所做的技術,而是使用IShellFolder的東西 - 這允許你使用與語言無關的GetCommandString。 這個問題是在XP下GetCommandString沒有返回任何東西(哦歡樂),但確實看起來'enable'和'disable'的菜單ID是一致的(分別為16和17),所以如果我沒有GetCommandString ,我剛回到菜單ID。 要切換,只需使用字符串調用InvokeCommand(如果返回一個字符串),或者調用菜單ID(如果沒有)。 這個問題就像普通的Windows方式一樣,有時它不起作用,它也沒有給你任何指示正在發生的事情或它失敗的原因。 這種方法似乎在70%的時間內都有效,但是如果出現問題則更難判斷,加上正常的“啟用接口......”文本會彈出。
希望這可以幫助其他人 - 如果有人設法找到另一種在更多情況下工作的方式,我很樂意聽到它!
經過多次搜索,我開始深入研究DEVCON。 在意識到這些方法必須是可以發現之后我做了一點搜索並找到了這個: http : //www.codeproject.com/KB/cs/HardwareHelper.aspx
它幫助解決了我至少從OpenVPN啟用和禁用TAP適配器的問題。
'==========================================================================
' 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);
代碼-嘗試“ 果殼網接口 ” C ++ 在這里 。 這應該在XP及更高版本下工作。
找到這個基本上是右鍵自動化的解決方案: http : //www.wilderssecurity.com/showthread.php? t = 265836適用於Windows XP和Windows 7
還有一個由Novell編寫,它是DevCon上面的一個包裝器: http ://www.novell.com/communities/node/2338/network-configuration-command-line-control
ToggleNic通過COM使用Shell32。 在c中,它使用標准庫“SHLOBJ.H”“SHELLAPI.H”和類IShellDispatch。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.