Monitor mit SSH aktivieren

Monitor mit SSH aktivieren

Nachdem ich es monatelang aufgegeben habe, möchte ich die Idee, die so unglaublich einfach erscheint, noch einmal aufgreifen. Ich möchte ein Skript haben, das meine Monitore aufweckt, nachdem sie in den Ruhezustand geschickt wurden. Ich habe fast jeden Ansatz ausprobiert, der mir eingefallen ist. Kann mich bitte jemand davor bewahren, einen Hund zu adoptieren, der eine knochenförmige Bluetooth-Maus apportiert und sie dabei hin und her wackelt (ja, so verzweifelt bin ich)

Was ich bisher getan habe:

1) OpenSSH auf der Remote-Win10-Maschine installieren (funktioniert)

2)Bekommendie interaktive Windows-Sitzung, um Autorität über die eigentliche Sitzung zu haben:

FOR /F "usebackq tokens=4" %s IN (`tasklist /nh /fo table /fi "imagename eq explorer.exe"`) DO ...

3a) Starten einer dervieleProgramme, die Windows wach halten. Diese funktionieren nicht, weil sie nie von psexec oder Powershell gestartet werden. Oder zumindest werden sie nicht angezeigt und tun nichts, wenn sie ausgeführt werden. Das gilt für jeden Prozess, den ich zu starten versuche.

3b) Verwenden Sie SendMessagees wie ich, um es in den Ruhezustand zu versetzen:

psexec -accepteula -nobanner -d -i %%s -w "%windir%" powershell (Add-Type '[DllImport(\"user32.dll\")]^public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,-1)

Wenn Sie als letzten Parameter 2 übergeben, funktioniert das perfekt, um den Monitor auszuschalten. Wenn Sie etwas anderes übergeben (z. B. -1 für EIN), passiert nichts.

3c) Jetzt versuche ich verzweifelt, eineSimulation von Mauswackeln/Tastendrückenusw.:

 FOR /F "usebackq tokens=4" %%s IN (`tasklist /nh /fo table /fi "imagename eq explorer.exe"`) DO psexec -accepteula -nobanner -d -i %%s -w "%windir%" powershell (Add-Type '[DllImport(\"user32.dll\")]^public static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, int dwExtraInfo);' -Name user32 -PassThru)::mouse_event(1,40,0,0,0)

Funktioniert bei lokaler Ausführung mit erhöhten Rechten. Bei Verwendung mit SSH wird Powershell kurz angezeigt. Es erfolgt kein Wackeln mit der Maus.

3d) Verwenden Sie das gute alte nircmd.exe-Dienstprogramm „Monitor aus“ oder ähnliche spezielle Dienstprogramme zum Einschalten des Monitors. Gleiches Ergebnis wie bei 3a)

Viele der verlinkten Threads bieten angebliche Lösungen, aber keine davon funktioniert bei mir. Der einzige Unterschied, den ich zwischen der lokalen Ausführung des Skripts und der Ausführung über SSH sehe, ist, dass es eine Ausgabe in der Art von

powershell started on <mywin10pc> with process ID xxxxx

Ansonsten kann ich nicht sagen, was los ist. Ich setze am Ende der Skripte ein „echo 0“, um zu prüfen, ob sie ausgeführt wurden oder nicht. Es gibt mir immer die 0. Hat jemand eine Idee, was ich übersehe? Besonders 3b) ist für mich seltsam, da es funktioniert, um den Monitor in den Ruhezustand zu versetzen.

Antwort1

Das Problem ist, dass das Aufwecken des Monitors und das Versetzen des Computers in einen aktiven Zustand zwei verschiedene Dinge sind. Senden von -1 zum Aufwecken des Monitorstutwecken Sie das Display. Leider reicht es nicht aus, auch den Computer zu wecken. Dafür können Sie verwenden SetThreadExecutionState. Hier ist ein funktionierendes Batch-Beispiel:

@ECHO OFF

:: gather session handle
FOR /F "usebackq tokens=4" %%s IN (`tasklist /nh /fo table /fi "imagename eq explorer.exe"`) DO SET hsession=%%s

:: wake display
psexec -accepteula -nobanner -d -i %hsession% -w "%windir%" powershell -NoProfile -NoLogo -Command "(Add-Type '[DllImport(\"user32.dll\")]public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,-1)"
CALL :wait 2

:: reactivate session
psexec -accepteula -nobanner -d -i %hsession% -w "%windir%" powershell -NoProfile -NoLogo -Command "$x=Add-Type '[DllImport(\"kernel32.dll\")]public static extern void SetThreadExecutionState(uint esFlags);' -name System -namespace Win32 -passThru;$x::SetThreadExecutionState([uint32]\"0x03\");Sleep 5;$x::SetThreadExecutionState([uint32]\"0x40\");"
CALL :wait 2
GOTO:EOF

:wait
SET dowait=%~1
IF "%dowait%"=="" SET dowait=10
ping -n %dowait% 127.0.0.1 >NUL
GOTO:EOF

In manchen Umgebungen ist es möglich, nur die SetThreadExecutionStateBefehle zu verwenden, aber bei meinen Tests ist dies nicht 100 % zuverlässig. Außerdem werden dadurch keine Geräte geweckt, die dies nicht unterstützen.

Antwort2

Vielleicht denken Sie wirklich zu viel darüber nach. Möchten Sie die Monitore einfach nur wach halten? Oder möchten Sie, dass sie sich erst einschalten, nachdem sie ausgeschaltet wurden? Ich habe ein Programm namensWackelmausin der Vergangenheit. Es bewegt die Maus einfach nach einer von Ihnen angegebenen Dauer 1 Pixel nach links und rechts. Sie bemerken die Bewegung nicht, wenn Sie die Maus tatsächlich verwenden, aber die Bildschirme bleiben aktiv (und haben den zusätzlichen Vorteil, dass Sie in den meisten Instant Messaging-Anwendungen wie Lync oder Slack als aktiv angezeigt werden).

verwandte Informationen