Итак, задача, есть назначенное задание от администратора и необходимо делать снимок экрана, независимо от того, какой пользователь залогинен. Сейчас, получается, вместо снимка экрана получается черный квадрат или тут https://olegon.ru/showthread.php?t=33853
просто
как я понимаю, при запуске где-либо, кроме того пользователя, который в данный момент за консолью, создается отдельная виртуальная консоль. В Linux можно переключаться между ними, используя переменную $DISPLAY, а как быть в Windows?
пока придумал только регулярное задание для залогиненного пользователя в "Назначенные задания" с nircmd.
Но хотелось бы разобраться, как получить доступ к обычному экрану...
Из того что видел - везде пишут, что процесс-скриншотер должен запускаться в сессии того юзера, экран которого нужно получить.
И для этого используют запуск через psexec -i ID_сессии.
ID можно получить через query session. Для "экрана монитора" попробовать 0 или 1.
Если без доп. программ, то процесс должен сам влезать в чужую сессию (м.б. доступно только сервисам?), там уже чистое програмирование.
Да, я уже так и делал, psexec -i -s и снимает текущую консольную сессию, но (!) только при удаленном подключении, локальное почему-то вешается...
В итоге заработало пока обычное периодическое задание, от имени группы Администраторы (в задании "От имени"). От системы, например, показывает опять черный экран.
Все работало до определенного момента, пока не сломалось сразу в двух местах на Windows 10. Во-первых, почему-то вместо экрана стало снимать Малевича, а в варианте, когда что-то снимало, то PowerShell плевал на свои параметры и запускался мерзким черным окном консоли, раздражая сидящих за компом. Ни спрятанное, ни минимизированное, ничего не помогало.
Плюс к этому еще в psexec -i перестал определять консоль. То есть надо теперь определять за него. Собственно, родился скрипт (пришлось на неконсольную переехать, поскольку вылезание консоли в самом неожиданном месте я побороть так и не смог).
Код:
SET res=1
FOR /F "usebackq tokens=3 delims= " %%i IN (`query session console ^| find "console"`) DO (
SET res=%%i
goto printtemp
)
:printtemp
C:\PerfLogs\Admin\psexec \\localhost -i %res% -s -u olegon -p пароль -e -d -h -realtime -accepteula -nobanner C:\PerfLogs\Admin\nircmd.exe cmdwait 2000 savescreenshot "C:\PerfLogs\Admin\~$currdate.MM_dd_yyyy$-~$currtime.HH_mm_ss$.png"
%windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f
%windir%\System32\reg.exe add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
date /T>>C:\PerfLogs\Admin\log.dat
time /T>>C:\PerfLogs\Admin\log.dat
Все работает и аккуратно складирует скриншоты по дате-времени, можно забирать потом.
В общем, как и положено винде, теперь сломалось подключение, сообщающее, что admin$ недоступен для psexec, хотя все было доступно не только локально, но и удаленно.
Переписал на другой вариант
создал dllhost.vbs с содержимым
Соответственно, скрипт dllhost.vbs запускаю для залогиненного пользователя от группы Builtin\Администраторы, с максимальными правами и все такое... Работает. Пока.
Картинки потом собираю уже от себя, себе в /mnt/e/temp/manager1
Код:
smbclient '\\192.168.10.1\c$' 'password' -U olegon -c 'prompt OFF; recurse OFF; cd 'PerfLogs/Admin'; lcd /mnt/e/manager1; mget *.png; del *.png' 2>&1 &>/dev/null