
Es gibt viele Lösungen, um die Anzeige lokal auf einem Windows10-Rechner auszuschalten. Sie alle haben die Form der folgenden SendMessage-Zeile. Es gibt auch kleine ausführbare Dateien wie nircmd, die dies tun. Es scheint jedoch einige Einschränkungen zu geben, wenn diese über OpenSSH ausgeführt werden. Da mein OpenSSH so konfiguriert ist, dass es genau dieselben Anmeldeinformationen wie mein lokaler Benutzer verwendet, kann ich nicht wirklich herausfinden, warum nichts passiert. Die PS-Skriptversionen geben eine einfache 1 zurück, und Lösungen wie nircmd geben einfach gar nichts zurück. Nicht einmal einen Fehler. Irgendeine Ahnung, was hier passieren könnte und wie man es zum Laufen bringt?
Beispielskript:
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,2)
edit: vielleicht sollte ich das noch hinzufügennircmdOptionen wie Ton stumm schalten funktionieren problemlos.
Antwort1
Dies liegt daran, dass die interaktive Windows-Sitzung nicht die aktuelle Sitzung ist und daher nicht in einem Kontext ausgeführt wird, in dem das physische Display aktiv verbunden ist. Sound und andere Funktionen sind zwar aktiv, aber das Display ist an eine Sitzung gebunden. Sie können sich entweder interaktiv anmelden oder etwas wie psexec verwenden, um den Powershell-Prozess im Kontext des Benutzers auszuführen. Wenn Sie mit der Verwendung von psexec einverstanden sind, können Sie Folgendes verwenden:
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 int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)
Sie benötigen hierfür allerdings psexec.
Wenn mehr als eine interaktive Sitzung vorhanden ist, wird sie mehr als einmal ausgeführt.
Beim Ausführen im Stapel müssen Sie beide %s durch %%s ersetzen.
Dies ist der Teil, der die interaktive Sitzung sammelt:
FOR /F "usebackq tokens=4" %s IN (`tasklist /nh /fo table /fi "imagename eq explorer.exe"`) DO echo %s
Folgendes kann in eine Batchdatei kopiert und von einem Terminalemulator ausgeführt werden.
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 -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,2)"
)
Der einzige Unterschied besteht darin, dass es sich jeweils %s
um Änderungen handelte %%s
.
Beachten Sie, dass die interaktive Ausführung auf dem Computer, auf dem Sie die Anzeigen deaktivieren möchten, wahrscheinlich fehlschlägt. Dies liegt daran, dass Ihre interaktive Sitzung noch aktiv ist.
Zum Aktivieren Ihrer Bildschirme können Sie Folgendes verwenden (getestet und funktioniert auf mehreren meiner Geräte):
:: 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