2009-05-13 37 views
16

Tôi đang cố gắng đưa ra giải pháp để kích hoạt/vô hiệu hóa card mạng theo lập trình - Tôi đã thực hiện rất nhiều nghiên cứu và không có gì là giải pháp khả thi trong cả môi trường XP và Vista . Những gì tôi đang nói về là nếu bạn đi vào Control Panel 'Network Connections', nhấp chuột phải vào một và chọn kích hoạt hoặc vô hiệu hóa. Lý tưởng nhất là tôi muốn sử dụng một thư viện, nhưng nếu tồi tệ hơn đến tồi tệ hơn tôi nghĩ tôi có thể gọi ra một ứng dụng dòng lệnh, nhưng đó là trường hợp xấu nhất tuyệt đối. Đây là những gì tôi đã cố gắng cho đến nay và ở đâu/tại sao họ thất bại:Lập trình vô hiệu hóa/kích hoạt giao diện mạng

này bài trước:

How to programmatically enable/disable network interfaces? (Windows XP)

Lists một vài phương pháp - là người đầu tiên được sử dụng netsh, mà dường như là giống nhau khi sử dụng hàm IPHelper SetIfEntry(). Vấn đề với điều này là nó thiết lập giao diện như được kích hoạt hoặc vô hiệu hóa, không phải là bình thường được kích hoạt/vô hiệu hóa vì vậy nó không thực sự tắt NIC.

Một giải pháp đề xuất là sử dụng WMI và trong lớp Win32_NetworkAdapter Đặc biệt, trong đó có một Enable và Disable phương pháp:

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

lớn phải không? Hoạt động tốt trong Vista, những phương pháp này không tồn tại trong cài đặt XP bình thường ...

Một gợi ý khác là sử dụng DevCon, thực sự sử dụng SetupAPI, cụ thể là SetupDiSetClassInstallParams() với DICS_ENABLE. Sau khi chi tiêu vô số giờ với lớp tuyệt vời này, và cố gắng vô hiệu hóa/kích hoạt thiết bị ở cấp độ toàn cầu cũng như mức cấu hình cụ thể (và mọi kết hợp), nó không liên tục hoạt động - đôi khi hoạt động tốt, nhưng lần khác vô hiệu hóa thiết bị trong Trình quản lý Thiết bị, nhưng vẫn để thiết bị đó hoạt động trong Kết nối Mạng.

sau đó tôi đã cố gắng sử dụng giao diện INetConnection, cụ thể INetConnection-> Connect/Disconnect:

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

Nhưng tôi đã không bao giờ có thể có được điều này để có bất kỳ ảnh hưởng đến các kết nối ở hai Vista hoặc XP của tôi hộp kiểm tra.

Cuối cùng, tôi thấy điều này C# kịch bản gọi là ToggleNic:

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

Mà có vẻ như nó đang diễn ra thông qua việc Shell bằng cách nào đó để gây ra một cách hiệu quả các hành vi chuột phải. Hạn chế (ít nhất là việc thực hiện này) là nó không hoạt động (không sửa đổi) trên các hệ thống không phải tiếng Anh, mà tôi cần tôi làm việc. Để công bằng, giải pháp này trông giống như khả thi nhất, nhưng sự quen thuộc của tôi với C# là thấp và tôi không thể tìm thấy nếu API nó đang sử dụng có sẵn trong C + +.

Bất kỳ trợ giúp hoặc thông tin chi tiết nào sẽ được đánh giá rất nhiều - hoặc các ý tưởng về cách thực hiện những gì mà tập lệnh togglenic thực hiện trong C++. Cảm ơn!

Trả lời

5

Sau khi thử nghiệm trên nhiều nền tảng hơn và nhiều cách tiếp cận hơn, tôi về cơ bản đã từ bỏ chức năng này (ít nhất là cho mục đích của tôi). Vấn đề đối với tôi là tôi muốn có một cái gì đó hoạt động trong 90% + của các tình huống, và thực tế là với tất cả mọi thứ tôi có thể đưa ra, nó gần 70%. Điều mỉa mai là nó thực sự chỉ là flaky thông qua phương pháp Windows bình thường. Đối với những người vẫn muốn đi xuống con đường nguy hiểm này, đây là những gì tôi thấy:

Trong số các phương pháp trực tiếp API được mô tả ở trên, phương pháp làm việc nhất quán nhất là sử dụng SetupAPI (SetupDiSetClassInstallParams) - vấn đề lớn nhất tôi gặp phải với điều này là đôi khi nó sẽ nhận được trong một tiểu bang nơi nó sẽ yêu cầu khởi động lại và không có thay đổi sẽ làm việc cho đến khi điều đó xảy ra. Điều duy nhất cần lưu ý khi sử dụng điều này là có hai cấu hình cho các thiết bị, vì vậy bạn cần phải chuyển đổi chúng cả trong một số trường hợp. DDK chứa nguồn cho công cụ devcon, cho bạn thấy chính xác cách thực hiện mọi thứ. Điều này cuối cùng trông giống như nó là gần nhất để kích chuột phải, nhưng nó vẫn còn trưng bày một số hành vi kỳ lạ mà Network Connections đã không. Cách tiếp cận này dường như làm việc khoảng 70% thời gian (trong cả hai bài kiểm tra và trên các hệ thống kiểm tra).

Từ cách tiếp cận tổng hack, tốt nhất tôi thấy không sử dụng kỹ thuật mà ToggleNIC đã làm, mà thay vào đó sử dụng công cụ IShellFolder - điều này cho phép bạn sử dụng GetCommandString độc lập với ngôn ngữ. Vấn đề với điều này là dưới XP GetCommandString không trả lại bất cứ điều gì (oh joy), nhưng nó xuất hiện rằng ID của trình đơn cho 'enable' và 'disable' là nhất quán (16 và 17 tương ứng), vì vậy nếu tôi thất bại trong GetCommandString , Tôi vừa trở lại ID của trình đơn. Để Toggle, chỉ cần gọi InvokeCommand với một trong hai chuỗi nếu nó trả về một, hoặc ID trình đơn nếu nó không. Vấn đề với điều này là giống như cách Windows bình thường, đôi khi nó không hoạt động, nó cũng không cho bạn bất kỳ dấu hiệu nào về những gì đang xảy ra hoặc tại sao nó thất bại. Cách tiếp cận này dường như cũng hoạt động khoảng 70% thời gian, nhưng khó mà biết được có điều gì không ổn, cộng với văn bản "Bật giao diện ..." bình thường sẽ bật lên.

Hy vọng điều này sẽ giúp bất kỳ ai khác - và nếu có ai đó tìm cách khác hoạt động trong nhiều tình huống hơn, tôi rất muốn nghe nó!

+0

Tôi đã tìm thấy giải pháp ToggleNIC rất đáng tin cậy, nhưng thật thú vị, tôi chỉ thấy văn bản "Bật giao diện .." một số thời gian, điều này khá bực bội. – bjanaszek

1

Thử "Giao diện mạng vỏ" C++ - mã here. Điều này sẽ hoạt động dưới XP và cao hơn.

+1

Đó là giao diện INetConnection mà tôi đã đề cập ở trên - liên kết đó cho biết đó là API Shell, nhưng nó thực sự là một phần của Tường lửa kết nối Internet ... Như đã đề cập ở trên, nó có hai vấn đề - f irst là, nó không hoạt động (không xuất hiện để kích hoạt bất cứ điều gì), thứ hai là nó được thay thế bởi Windows Firewall API, mà không có chức năng tương tự. – Mark

0

ToggleNic sử dụng Shell32 thông qua COM. Trong c này sử dụng thư viện chuẩn "SHLOBJ.H" "SHELLAPI.H" và lớp IShellDispatch.

1

sau nhiều lần tìm kiếm tôi bắt đầu tìm hiểu về DEVCON. Sau khi nhận ra rằng những phương pháp đó phải được pinvokable tôi đã tìm kiếm một chút và tìm thấy điều này:

Nó giúp giải quyết vấn đề của tôi về việc kích hoạt và vô hiệu hóa bộ điều hợp TAP từ OpenVPN ít nhất.

1
'========================================================================== 
' 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" 
1
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ác vấn đề liên quan