Windows 11: Bei bestimmten Voraussetzungen automatisch den mobilen Hotspot einschalten

Bananenkrebs

Cadet 4th Year
Registriert
Okt. 2014
Beiträge
100
Moin Moin,

ich brauche mal ein paar Anregungen, wie ich folgendes Problem umsetze:

Ich möchte immer, wenn mein Notebook an ein Ladegerät angeschlossen ist und gleichzeitig eine LAN-Verbindung besteht, einen mobilen Hotspot freigeben.
Grund ist, dass die WLAN-Ausleuchtung überall im Haus in Ordnung ist, außer im Büro im Keller, wo aber Gigabit-LAN liegt und via USB-C-Dock bei meiner Anwesenheit auch mein ThinkPad angeschlossen ist.
Im Moment mache ich mir dann immer einen Hotspot an und bin somit auch auf dem Handy über WLAN-Telefonie erreichbar. Für alles, was ich sonst mit dem Handy mache, reicht das auch vollkommen aus und ich brauche nicht mehr, als das, was es jetzt ist.

Es geht mir nur darum, das Einschalten zu automatisieren. Bisher wäre mein Ansatz, das mit der Aufgabenplanung von Windows zu erledigen, nur konnte ich weder für "Gerät an Strom angeschlossen" noch für "Gerät an Netzwerk via Kabel" angeschlossen Ereignisse in der Ereignisanzeige finden. Überhaupt ist die Liste der Hardware-Ereignisse leer.

Hat jemand einen Ansatz?

Vielen Dank für jegliche Hilfe :)
 
Moinsen.
Stell am besten ein Accesspoint (Router) mit mehreren LAN-Ports auf, der vom Gigabit-LAN gespeist wird. Das geht ab 20 EUR und dein Thinkpad muss nicht laufen. Welchen Internetanschluss und welchen Router oder sonstige Netzwerkhardware hast du? Man würde passend zu Speedports oder Fritzboxen Geräte erhalten.

PS: Ja, das ist nicht die Antwort, die du hören wolltest. Ist aber am einfachsten. 🙂
 
  • Gefällt mir
Reaktionen: Bananenkrebs
Ich weiß, D-Lan wäre auch verfügbar über Fritz Powerline. Ich weiß auch, dass APs nur noch wenige Euros kosten und habe an wichtigeren Orten im Haus auch welche verteilt, aber für das ist alles sehr Overkill, dafür dass ich auf dem Handy ein wenig surfen kann und Anrufe durchkommen. Das ThinkPad ist ohnehin im Dock und der Hotspot funktioniert auch noch nach dem "Energie sparen" und im zugeklappten Zustand. Weiter schalte ich das Gerät nicht aus, ob mit oder ohne Hotspot.
Darum dachte ich, man könne nur das einschalten irgendwie automatisch machen.

Zu sonstiger Hardware: FritzBox, Powerline für die PCs im Haus und ein Repeater im EG sowie ein AP im ersten Stock. Das Haus ist wie gesagt bis auf den Keller sehr gut ausgestrahlt ;)
 
Das ließe sich bestimmt mit Autohotkey automatisieren, dass du regelmäßig guckst, mit welchem Lan du verbunden bist und ob du nicht auf Batterie läufst, dann führst du den Befehl zum Hotspot anschalten aus

Da müsstest du dich allerdings schon einarbeiten, das wird etwas Arbeit sein. Ich selbst habe gerade keinen Zugriff auf einen Windows PC, daher kann ich da auch nicht wirklich direkt helfen.
 
Guter Tipp, bin ich gar nicht drauf gekommen, dass sowas auch mit AHK geht. Nutze ich aber tagtäglich, allerdings auch hauptsächlich für Shortcuts :) Ich werde den Code hier zur Verfügung stellen, wenn ich etwas zum Laufen bekomme.
 
Lösung gefunden. Nicht mir AHK, weil ich keine Möglichkeit gefunden habe, so tief auf die Hardware zuzugreifen. Ich habe stattdessen Java missbraucht, die Konsole für mich zu bedienen.
Davon habe ich ein .jar gebaut und die liegt im Autostart Ordner. Das funktioniert bisher auch sehr zuverlässig.
Der "Spirit" von Java, auf allen Plattformen zu laufen ist natürlich gebrochen und der Hardcode-Anteil ist hoch, aber das soll ja auch nur auf meinem Rechner laufen ;)

Solle ich den Code noch editieren, werde ich das zeitnah hier nachtragen.

Für jegliche Verbesserungsvorschläge habe ich ein offenes Ohr. Ich bedanke mich an dieser Stelle noch einmal bei Wilhelm14 und Rumbah für die Denkanstöße!

package com.company;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.concurrent.TimeUnit;

/**
* @author Bananenkrebs
*
* Mit (angepassten) Scripts von:
* Elyasaf755 -> https://stackoverflow.com/questions...s-10-built-in-hotspot-by-cmd-batch-powershell
*/
public class Main {

/**
* Unter "ipconfig -all" angezeigte Beschreibung für Lan-Adapter
*/
private static String[] APPLICABLE_INTERFACES = new String[]{"Realtek(R) PCI(e) Ethernet Controller", "Lenovo USB Ethernet"};

/**
* Überschreibt Lan-Interfaces bei angabe oder startet Endlosschleife zur Prüfung
*/
public static void main(String[] args) throws IOException, InterruptedException {

if (args.length!=0){
APPLICABLE_INTERFACES = args;
}

while (true){
if((lanPresent() && acPowerPresent())){
Runtime.getRuntime().exec("powershell.exe" + " " + ".\\scripts\\start.ps1");
} else {
Runtime.getRuntime().exec("powershell.exe" + " " + ".\\scripts\\stop.ps1");
}
TimeUnit.SECONDS.sleep(30);
}

}

/**
* Prüft, ob eingegebene Interfaces (Parameter oder default-Werte) verbunden.
*/
private static boolean lanPresent() {
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while(interfaces.hasMoreElements()){
NetworkInterface temp = interfaces.nextElement();
if (temp.isUp()){
for (String applicableInterface : APPLICABLE_INTERFACES) {
if (temp.getDisplayName().equals(applicableInterface)) {
return true;
}
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return false;
}

/**
* Prüft, ob Ladegerät angeschlossen ist. Mögliche Modi:
* 1 {'Battery Power'}
* 2 {'AC Power'}
* 3 {'Fully Charged'}
* 4 {'Low'}
* 5 {'Critical'}
* 6 {'Charging'}
* 7 {'Charging and High'}
* 8 {'Charging and Low'}
* 9 {'Charging and Critical'}
* 10 {'Undefined'}
* 11 {'Partially Charged'}
* (Tabelle entnommen von https://powershell.one/wmi/root/cimv2/win32_battery)
*/
public static boolean acPowerPresent() throws IOException, InterruptedException {
Process p = Runtime.getRuntime().exec("powershell.exe (Get-WmiObject win32_battery).batterystatus");
TimeUnit.SECONDS.sleep(1);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
return br.readLine().equals("2");
}
}
[Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime] | Out-Null
Add-Type -AssemblyName System.Runtime.WindowsRuntime
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $.Name -eq 'AsTask' -and $.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]
Function Await($WinRtTask, $ResultType) {
$asTask = $asTaskGeneric.MakeGenericMethod($ResultType)
$netTask = $asTask.Invoke($null, @($WinRtTask))
$netTask.Wait(-1) | Out-Null
$netTask.Result
}
Function AwaitAction($WinRtAction) {
$asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $.Name -eq 'AsTask' -and $.GetParameters().Count -eq 1 -and !$_.IsGenericMethod })[0]
$netTask = $asTask.Invoke($null, @($WinRtAction))
$netTask.Wait(-1) | Out-Null
}

$connectionProfile = [Windows.Networking.Connectivity.NetworkInformation,Windows.Networking.Connectivity,ContentType=WindowsRuntime]::GetInternetConnectionProfile()
$tetheringManager = [Windows.Networking.NetworkOperators.NetworkOperatorTetheringManager,Windows.Networking.NetworkOperators,ContentType=WindowsRuntime]::CreateFromConnectionProfile($connectionProfile)

# Be sure to include Ben N.'s await for IAsyncOperation:
# https://superuser.com/questions/1341997/using-a-uwp-api-namespace-in-powershell

# Check whether Mobile Hotspot is enabled
$tetheringManager.TetheringOperationalState

# If Mobile Hotspot is off - turn it on.
# Start Mobile Hotspot
Await ($tetheringManager.StartTetheringAsync()) ([Windows.Networking.NetworkOperators.NetworkOperatorTetheringOperationResult])
[Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime] | Out-Null
Add-Type -AssemblyName System.Runtime.WindowsRuntime
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $.Name -eq 'AsTask' -and $.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]
Function Await($WinRtTask, $ResultType) {
$asTask = $asTaskGeneric.MakeGenericMethod($ResultType)
$netTask = $asTask.Invoke($null, @($WinRtTask))
$netTask.Wait(-1) | Out-Null
$netTask.Result
}
Function AwaitAction($WinRtAction) {
$asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $.Name -eq 'AsTask' -and $.GetParameters().Count -eq 1 -and !$_.IsGenericMethod })[0]
$netTask = $asTask.Invoke($null, @($WinRtAction))
$netTask.Wait(-1) | Out-Null
}

$connectionProfile = [Windows.Networking.Connectivity.NetworkInformation,Windows.Networking.Connectivity,ContentType=WindowsRuntime]::GetInternetConnectionProfile()
$tetheringManager = [Windows.Networking.NetworkOperators.NetworkOperatorTetheringManager,Windows.Networking.NetworkOperators,ContentType=WindowsRuntime]::CreateFromConnectionProfile($connectionProfile)

# Be sure to include Ben N.'s await for IAsyncOperation:
# https://superuser.com/questions/1341997/using-a-uwp-api-namespace-in-powershell

# Check whether Mobile Hotspot is enabled
$tetheringManager.TetheringOperationalState

# If Mobile Hotspot is on - turn it off.
# Stop Mobile Hotspot
Await ($tetheringManager.StopTetheringAsync()) ([Windows.Networking.NetworkOperators.NetworkOperatorTetheringOperationResult])
 
  • Gefällt mir
Reaktionen: Wilhelm14
Zurück
Oben