18

ネットワークカードをプログラムで有効/無効にする解決策を考え出そうとしています-たくさんの調査を行いましたが、XP環境とVista環境の両方で実行可能な解決策はないようです. 私が話しているのは、コントロール パネルの [ネットワーク接続] に移動し、いずれかを右クリックして、有効または無効のいずれかを選択した場合です。理想的にはライブラリを使用したいのですが、最悪の場合はコマンドライン アプリを呼び出すことができると思っていましたが、それは絶対に最悪のケースです。これまでに試したことと、失敗した場所/理由は次のとおりです。

この前の投稿:

ネットワークインターフェイスをプログラムで有効/無効にする方法は? (Windows XP)

いくつかの方法をリストします。1 つ目は netsh を使用する方法です。これは、IPHelper 関数 SetIfEntry() を使用するのと同じように見えます。これの問題は、インターフェイスを通常の有効/無効ではなく、管理上有効または無効に設定するため、NIC を実際にシャットダウンしないことです。

提案されている別の解決策は、WMI と、特に Enable および Disable メソッドを持つ Win32_NetworkAdapter クラスを使用することです。

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

いいでしょ?Vista では正常に動作しますが、これらの方法は通常の XP インストールには存在しません...

もう 1 つの提案は、SetupAPI を実際に使用する DevCon を使用することです。具体的には、DICS_ENABLE を指定した SetupDiSetClassInstallParams() を使用します。この素晴らしいクラスで数え切れないほどの時間を費やし、グローバル レベルと特定の構成レベル (およびすべての組み合わせ) の両方でデバイスを無効/有効にしようとした後、一貫して機能しません。デバイス マネージャーでデバイスを無効にしますが、ネットワーク接続ではデバイスを稼働させたままにします。

次に、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/

これは、右クリックの動作を効果的に引き起こすために、何らかの方法でシェルを通過しているように見えます。(少なくともこの実装の) 制限は、英語以外のシステムでは (変更なしでは) 動作しないことです。公平を期すために、このソリューションが最も実行可能のように見えますが、C# に精通していないため、使用している API が C++ で使用できるかどうかを確認できませんでした。

トグルニック スクリプトが C++ で行うことを達成する方法についてのアイデアや、ヘルプや洞察をいただければ幸いです。ありがとう!

4

7 に答える 7

6

より多くのプラットフォームとより多くのアプローチでテストした後、私は基本的にこの機能をあきらめました (少なくとも私の目的のために)。私にとっての問題は、90% 以上の状況で機能するものが欲しいということです。現実には、私が思いつくすべての状況で 70% 近くになります。皮肉なことに、通常の Windows の方法と同じように不安定です。この危険な道をまだ進みたい人のために、私が見つけたものは次のとおりです。

上記の API ダイレクト メソッドの中で、最も一貫して機能するのは SetupAPI (SetupDiSetClassInstallParams) を使用する方法でした。そうなるまで働く。これを使用する際に注意すべきその他の唯一のことは、デバイスには 2 つのプロファイルがあるため、場合によっては両方を切り替える必要があることです。DDK には devcon ツールのソースが含まれており、すべてを行う方法を正確に示しています。これは最終的には右クリックに最も近いように見えましたが、それでもネットワーク接続では見られなかった奇妙な動作が見られました。このアプローチは、(テストとテスト システムの両方で) 約 70% の時間で機能するように見えました。

トータルハックアプローチから、私が見つけた最良の方法は、ToggleNIC が行った手法を使用するのではなく、代わりに IShellFolder のものを使用することでした。これにより、言語に依存しない GetCommandString を使用できます。これに関する問題は、XP では GetCommandString が何も返さないことです (うれしいです)。しかし、'enable' と 'disable' のメニュー ID は一貫しているように見えました (それぞれ 16 と 17)。 、メニュー ID に戻りました。トグルするには、文字列が返された場合は文字列を、返されなかった場合はメニュー ID を使用して InvokeCommand を呼び出すだけです。これに関する問題は、通常の Windows の方法と同様に、時々機能しないことであり、何が起こっているのか、なぜ失敗したのかを示すものでもありません。このアプローチも約 70% の確率で機能するように見えましたが、

願わくば、これが他の誰かの役に立てば幸いです。また、より多くの状況で機能する別の方法を見つけた人がいたら、ぜひ聞いてみたいです!

于 2009-05-18T21:44:56.897 に答える
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"
于 2010-09-30T18:10:41.010 に答える
1

多くの検索の後、私はDEVCONを掘り下げ始めました。それらのメソッドがピンボカブルでなければならないことに気付いた後、私は少し検索してこれを見つけました:http: //www.codeproject.com/KB/cs/HardwareHelper.aspx

少なくともOpenVPNからTAPアダプターを有効または無効にするという私の問題を解決するのに役立ちました。

于 2009-11-05T09:57:57.120 に答える
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);
于 2011-01-13T21:00:51.063 に答える
0

基本的に右クリックの自動化であるこのソリューションを見つけました:http://www.wilderssecurity.com/showthread.php?t=265836 Windows XPとWindows 7の両方で動作します

DevCon のラッパーである Novell によって作成されたものもあります: http://www.novell.com/communities/node/2338/network-configuration-command-line-control

于 2011-01-31T06:21:03.927 に答える
0

ToggleNic は COM 経由で Shell32 を使用します。c では、これは標準ライブラリ "SHLOBJ.H" "SHELLAPI.H" およびクラス IShellDispatch によって使用されます。

于 2009-05-18T08:12:22.343 に答える