ネットワーク インターフェイスをプログラムで有効/無効にするにはどうすればよいですか?(Windows XP)
-
01-07-2019 - |
質問
Windows XP のスクリプトからネットワーク インターフェイスを完全に有効または無効にする必要があります。私はPythonのソリューションを探していますが、一般的な方法(たとえば、WMI、netshのコマンドライン、Windowsコールなど)は歓迎されており、調整されます。ありがとう。
解決
NetSHインターフェイスの使用インターフェイスを使用します[name =] ifname [[admin =] enabled | disabled [connect =] connected | disconnected [newname =] newName
外側の括弧内にすべてを含めてみてください。netsh インターフェイス セット インターフェイス名 = "名前" admin=disabled connect=切断 newname="名前"
この MS KB ページも参照してください。 http://support.microsoft.com/kb/262265/どちらの提案にも従うことができます。アダプターを無効にするには、ハードウェア デバイスを参照する方法を決定する必要があります。コンピュータ上に同じ名前のアダプタが複数存在しない場合は、インターフェイスの説明を省略できる可能性があります (または PCI ID が適切に機能します)。その後、devcon (無効|有効) を使用します。Devcon は、デバイス マネージャーのアドオン コンソール インターフェイスです。
他のヒント
これまでのところ、次の Python ソリューションを見つけました。
>>> import wmi; c=wmi.WMI()
>>> o=c.query("select * from Win32_NetworkAdapter where NetConnectionID='wifi'")[0]
>>> o.EnableDevice(1)
(-2147217407,)
私の知る限り、これは一般的な WMI エラー 0x80041001 に変換されます。権限がある可能性があります。
この .VBS スクリプトをインターネットで見つけました。この目的のために NETSH を動作させることができないマシンでも実際に動作できるというすばらしい利点があります。
Const ssfCONTROLS = 3
sConnectionName = "Local Area Connection"
sEnableVerb = "En&able"
sDisableVerb = "Disa&ble"
set shellApp = createobject("shell.application")
set oControlPanel = shellApp.Namespace(ssfCONTROLS)
set oNetConnections = nothing
for each folderitem in oControlPanel.items
if folderitem.name = "Network Connections" then
set oNetConnections = folderitem.getfolder: exit for
end if
next
if oNetConnections is nothing then
msgbox "Couldn't find 'Network Connections' folder"
wscript.quit
end if
set oLanConnection = nothing
for each folderitem in oNetConnections.items
if lcase(folderitem.name) = lcase(sConnectionName) then
set oLanConnection = folderitem: exit for
end if
next
if oLanConnection is nothing then
msgbox "Couldn't find '" & sConnectionName & "' item"
wscript.quit
end if
bEnabled = true
set oEnableVerb = nothing
set oDisableVerb = nothing
s = "Verbs: " & vbcrlf
for each verb in oLanConnection.verbs
s = s & vbcrlf & verb.name
if verb.name = sEnableVerb then
set oEnableVerb = verb
bEnabled = false
end if
if verb.name = sDisableVerb then
set oDisableVerb = verb
end if
next
'debugging displays left just in case...
'
'msgbox s ': wscript.quit
'msgbox "Enabled: " & bEnabled ': wscript.quit
'not sure why, but invokeverb always seemed to work
'for enable but not disable.
'
'saving a reference to the appropriate verb object
'and calling the DoIt method always seems to work.
'
if bEnabled then
' oLanConnection.invokeverb sDisableVerb
oDisableVerb.DoIt
else
' oLanConnection.invokeverb sEnableVerb
oEnableVerb.DoIt
end if
'adjust the sleep duration below as needed...
'
'if you let the oLanConnection go out of scope
'and be destroyed too soon, the action of the verb
'may not take...
'
wscript.sleep 1000
MSDN では、RAS API 以外にインターフェイスを制御するための基本的な API が見つからないようですが、非ダイヤルアップ接続には適用されないと思います。あなた自身が提案しているように、netsh がオプションになる可能性があります。おそらく、プログラムによるインターフェイスも備えています。 http://msdn.microsoft.com/en-us/library/ms708353(VS.85).aspx
純粋な Python になりたい場合は、一連のパイプを開いて netsh プロセスと通信することもできます。
これはVB.Netです
Dim objectQuery As New ObjectQuery("SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionId IS NOT NULL")
Dim searcher As New ManagementObjectSearcher(scope, objectQuery)
Dim os As ManagementObject
Dim moColl As ManagementObjectCollection = searcher.Get()
Dim _list As String = ""
For Each os In moColl
Console.WriteLine(os("NetConnectionId"))
Next os
これにより、コンピュータ上のすべてのインターフェイスが取得されます。次に、 netsh を実行して無効にすることができます。
NetSHインターフェイスセットインターフェイスが無効になっています
の 開発コン このツールは NIC を制御できますが、インターフェイスを直接制御することはできません。これは、デバイス マネージャー アプレットのコマンド ライン バージョンです。
devcon disable (id or portion of name)
devcon enable (id or portion of name)
WMI の使用が必要になる場合があります。これは良い出発点として役立つかもしれません。http://msdn.microsoft.com/en-us/library/aa394595.aspx