Apague las pantallas Win10 a través de OpenSSH

Apague las pantallas Win10 a través de OpenSSH

Existen muchas soluciones para desactivar la visualización localmente en una máquina con Windows10. Todos ellos son alguna forma de la siguiente línea SendMessage. También hay pequeños ejecutables como nircmd que hacen esto. Sin embargo, parece haber alguna limitación al ejecutar cualquiera de ellos a través de OpenSSH. Dado que mi OpenSSH está configurado para usar exactamente las mismas credenciales que mi usuario local, no puedo entender por qué no sucede nada. Las versiones del script ps devuelven un 1 simple, y soluciones como nircmd simplemente no devuelven nada en absoluto. Ni siquiera un error. ¿Alguna idea de lo que podría pasar aquí y cómo hacerlo funcionar?

Guión de muestra:

powershell (Add-Type '[DllImport(\"user32.dll\")]^public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Nombre a -Pas)::SendMessage(- 1,0x0112,0xF170,2)

Fuente

Editar: tal vez debería agregar ese otronicmdopciones como silenciar audio funcionan sin ningún problema.

Respuesta1

Esto se debe a que la sesión interactiva de Windows no es la sesión actual, por lo que no se ejecuta en un contexto donde la pantalla física esté conectada activamente. El sonido y otras características sí lo son, pero la pantalla está vinculada a una sesión. Puede iniciar sesión de forma interactiva o utilizar algo como psexec para ejecutar el proceso de PowerShell en el contexto del usuario. Si está de acuerdo con el uso de psexec, puede usar esto:

 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)

Sin embargo, necesitarás psexec para esto.

Si hay más de una sesión interactiva, se ejecutará más de una vez.

Si ejecuta desde un lote, deberá reemplazar ambos %s con %%s.

Esta es la parte que recoge la sesión interactiva:

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

Lo siguiente se puede copiar en un archivo por lotes y ejecutar desde un emulador de terminal.

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)"
)

La única diferencia es que cada uno %scambió a %%s.

Tenga en cuenta que ejecutarlo de forma interactiva en la computadora en la que está intentando desactivar las pantallas PROBABLEMENTE FALLARÁ. Esto se debe a que su sesión interactiva aún está activa.

Para activar sus pantallas, puede usar lo siguiente (probado y funciona en varios de mis dispositivos):

:: 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

información relacionada