SSH로 모니터 깨우기

SSH로 모니터 깨우기

몇 달 동안 포기한 후에 나는 믿을 수 없을 만큼 단순해 보이는 아이디어를 다시 살펴보고 싶습니다. 모니터가 절전 모드로 전환된 후 모니터를 깨우는 스크립트를 갖고 싶습니다. 제가 생각할 수 있는 거의 모든 접근 방식을 시도했습니다. 그 과정에서 뼈 모양의 블루투스 마우스를 가져오는 개를 입양하는 과정에서 누가 저를 입양하지 못하게 해주세요(예, 저는 너무나 절박합니다)

지금까지 내가 한 일:

1) 원격 Win10 시스템에 OpenSSH 설치(작동)

2)구하는실제 세션에 대한 권한을 갖는 대화형 Windows 세션:

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

3a) 다음 중 하나를 시작합니다.많은창을 깨운 프로그램을 유지하십시오. psexec 또는 powershell에 의해 실행되지 않기 때문에 작동하지 않습니다. 또는 적어도 실행하면 표시되지 않고 아무 작업도 수행되지 않습니다. 그것은 내가 시작하려고 하는 모든 프로세스에 대한 것입니다.

3b) SendMessage절전 모드로 보내기 위해 제가 하는 것처럼 사용하세요:

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)

마지막 매개변수로 2를 전달하면 모니터를 끄는 데 완벽하게 작동합니다. 다른 것을 전달하면(예: ON의 경우 -1) 아무 작업도 수행되지 않습니다.

3c) 이제 필사적으로 나는 다음과 같은 일을 하려고 노력합니다.마우스 흔들기/키 누르기 시뮬레이션등.:

 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)

높은 권한으로 로컬에서 실행되는 작업입니다. SSH와 함께 사용할 때 powershell이 ​​잠시 팝업됩니다. 마우스 흔들기를 수행하지 않습니다.

3d) 오래된 nircmd.exe 모니터를 끄거나 유틸리티를 켜는 유사한 전용 모니터를 사용합니다. 3a)와 동일한 결과

연결된 스레드 중 상당수가 해결책을 제시했지만 그 중 나에게는 효과가 없었습니다. 로컬에서 스크립트를 실행하는 것과 ssh를 통해 스크립트를 실행하는 것에서 눈에 띄는 유일한 차이점은 다음과 같은 출력이 있다는 것입니다.

powershell started on <mywin10pc> with process ID xxxxx

그 외에는 무슨 일이 일어나고 있는지 말할 방법이 없습니다. 실행 여부를 확인하기 위해 스크립트 끝에 echo 0을 넣었습니다. 그것은 항상 나에게 0을 줍니다. 누구든지 내가 무엇을 놓치고 있는지 아시나요? 특히 3b)는 모니터를 절전 모드로 보내는 데 작동하기 때문에 이상합니다.

답변1

문제는 모니터를 깨우는 것과 컴퓨터를 활성 상태로 설정하는 것이 서로 다른 두 가지라는 것입니다. 모니터를 깨우려면 -1을 보냅니다.하다디스플레이를 깨우세요. 안타깝게도 컴퓨터를 깨우는 것만으로는 충분하지 않습니다. 이를 위해 SetThreadExecutionState. 작업 배치 예는 다음과 같습니다.

@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

일부 환경에서는 명령만 사용하는 것이 가능 SetThreadExecutionState하지만 내 테스트에서는 100% 신뢰할 수 없습니다. 또한 이를 지원하지 않는 장치를 깨우지 않습니다.

답변2

당신은 이것을 정말로 지나치게 생각하고 있을 수도 있습니다. 모니터를 계속 깨우고 싶나요? 아니면 특별히 꺼진 후에만 켜지도록 하시겠습니까? 라는 프로그램을 사용했어요흔들기 마우스과거에. 지정한 기간 후에 마우스를 왼쪽과 오른쪽으로 1픽셀만 이동합니다. 실제로 마우스를 사용할 때는 움직임을 눈치채지 못하지만 화면을 활성 상태로 유지합니다(그리고 Lync 또는 Slack과 같은 대부분의 인스턴트 메시징 응용 프로그램에서 사용자를 활성 상태로 표시하는 추가 이점도 있습니다).

관련 정보