Seite 1 von 1
Netzwerkverbindung beenden
Verfasst: Dienstag 12. Juli 2022, 17:13
von pythonstarter
Hallo,
ich würde gerne mit einen Python-Script all' meine Netzwerkverbindungen disablen bzw. enablen (Windows 10). Der Grund hierfür ist, dass, wenn meine Verbindung zum Server wegbricht, von meiner Software immer versucht wird den Server irgendwie zu erreichen. Dies führt dann dazu, dass mein Programm defacto in einen Freeze-Zustand geht. Wenn ich alle Verbindungen beende, kann ich mit meiner lokalen Datenreplikation weiterarbeiten.
Hat jemand hierfür eine Idee? Ich habe bisher nur Beispiele über subprocess und os gefunden. Aber in den Beispielen wurde immer nur das WLAN disabled. Ich weiß aber erst mal nicht ob der Rechner über LAN oder WLAN verbunden ist...
Kann mir jemand hierfür Hilfestellung geben? Vielen Dank schon mal im Voraus.
Re: Netzwerkverbindung beenden
Verfasst: Dienstag 12. Juli 2022, 17:24
von __deets__
Wuerde ich aber tatsaechlich ueber os bzw. besser subprocess machen. Siehe zB
https://superuser.com/questions/1689648 ... windows-10 - wenn du das mit echten win32 API calls machen willst, hast du eine *Menge* Arbeit vor dir.
Re: Netzwerkverbindung beenden
Verfasst: Dienstag 12. Juli 2022, 18:09
von pythonstarter
DAnke schon mal.
Mit subprocess.check_output('wmic nic get name, index') erhalte ich ein <class 'bytes'>
b'Index Name \r\r\n0 Microsoft Kernel Debug Network Adapter \r\r\n1 Realtek PCIe GbE Family Controller \r\r\n\r\r\n'
aber hiermit kann ich jetzt nix anfangen. Denn ich müsste ja nun via strip() oder ähnlichem die unerwünschten Zeichen tilgen. Geht aber leider nicht, da strip() nicht auf ein bytes anwendbar ist.
Re: Netzwerkverbindung beenden
Verfasst: Dienstag 12. Juli 2022, 18:15
von __deets__
Dann dekodierst du die Bytes zu einem String, und schon geht es.
Re: Netzwerkverbindung beenden
Verfasst: Mittwoch 13. Juli 2022, 14:32
von DeaD_EyE
Encoding vorgeben, dann musst du nicht decodieren.
Hier mal ein Beispiel mit netsh.
Code: Alles auswählen
import time
import subprocess
def get_interfaces():
si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
stdout = subprocess.check_output(["netsh", "interface", "show", "interface"], encoding="utf8", startupinfo=si)
return [stripped_line.split(maxsplit=3)[-1] for line in stdout.splitlines()[3:] if (stripped_line := line.strip())]
def _interface(name, action):
si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
return subprocess.call(["netsh", "interface", "set", "interface", f'name={name}', f"admin={action}"], startupinfo=si) == 0
def disable_interface(name):
return _interface(name, "disable")
def enable_interface(name):
return _interface(name, "enable")
for nic in get_interfaces():
print(nic)
if "eth" in nic.lower():
print(" >>> Deaktiviere", nic)
disable_interface(nic)
time.sleep(5)
print(" >>> Aktiviere", nic)
enable_interface(nic)
Nachteil: Der Python-Interpreter muss dann mit Administrator-Rechten laufen. Ansonsten fehlt die Berechtigung.
WMIC ist veraltet.
Code: Alles auswählen
C:\Windows\system32>wmic
wmic:root\cli>?
? - Alias wurde nicht gefunden.
wmic:root\cli>help
help - Alias wurde nicht gefunden.
wmic:root\cli>/?
WMIC ist veraltet.
[Globale Parameter] <Befehl>
...
Wenn man das vernünftig haben will, löst man das Problem bei der Ursache und trennt nicht einfach die Netzwerkverbindung.
Auch das Parsen der Ausgabe von Befehlen kann schon bei unterschiedlichen Sprachen und Versionen zu Problemen führen.
Unter Linux bekommt man von bestimmten Tools eine Warnung, dass man das Parsen der Ausgabe unterlassen sollte, da sich die Ausgabe auch mal beim nächsten Update verändern kann.