Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Windows

Как из назначенного задания сделать скриншот экрана независимо от пользователя? : Windows

29.03.2024 4:20


03.02.2021 17:13
OlegON
 
Итак, задача, есть назначенное задание от администратора и необходимо делать снимок экрана, независимо от того, какой пользователь залогинен. Сейчас, получается, вместо снимка экрана получается черный квадрат или тут
https://olegon.ru/showthread.php?t=33853
просто
Код:
Исключение при вызове "CopyFromScreen" с "3" аргументами: "Неверный дескриптор" 
строка:14 знак:1
+ $gfx.CopyFromScreen([Drawing.Point]::Empty, [Drawing.Point]::Empty, $ ...     
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException   
    + FullyQualifiedErrorId : Win32Exception
как я понимаю, при запуске где-либо, кроме того пользователя, который в данный момент за консолью, создается отдельная виртуальная консоль. В Linux можно переключаться между ними, используя переменную $DISPLAY, а как быть в Windows?
04.02.2021 10:41
OlegON
 
пока придумал только регулярное задание для залогиненного пользователя в "Назначенные задания" с nircmd.
Но хотелось бы разобраться, как получить доступ к обычному экрану...
04.02.2021 15:52
OlegON
 
Да вот же хрень... Это задание работает не для любого юзера, судя по всему, а только для собственника задания...
04.02.2021 17:16
vdm
 
Из того что видел - везде пишут, что процесс-скриншотер должен запускаться в сессии того юзера, экран которого нужно получить.
И для этого используют запуск через psexec -i ID_сессии.
ID можно получить через query session. Для "экрана монитора" попробовать 0 или 1.
Если без доп. программ, то процесс должен сам влезать в чужую сессию (м.б. доступно только сервисам?), там уже чистое програмирование.
04.02.2021 17:22
OlegON
 
Да, я уже так и делал, psexec -i -s и снимает текущую консольную сессию, но (!) только при удаленном подключении, локальное почему-то вешается...
В итоге заработало пока обычное периодическое задание, от имени группы Администраторы (в задании "От имени"). От системы, например, показывает опять черный экран.
01.09.2021 18:19
OlegON
 
В общем, сначала у меня был вариант такой
Код:
C:\PerfLogs\Admin\psexec \\localhost -i -s -u olegon -p password -e -d -h -realtime -accepteula -nobanner powershell -NoLogo -NoProfile -NonInteractive -WindowStyle hidden -InputFormat none -ExecutionPolicy Bypass -File C:\PerfLogs\Admin\Script.ps1
%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
и скрипт
Код:
$Path = "C:\PerfLogs\Admin\"
Add-Type -AssemblyName System.Windows.Forms 
$ScreenBounds = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds
$Image = New-Object System.Drawing.Bitmap($screenBounds.Width, $ScreenBounds.Height) 
$CopyScreen = [System.Drawing.Graphics]::FromImage($Image)
$Point = New-Object System.Drawing.Point(0, 0)
$CopyScreen.CopyFromScreen($Point,[Drawing.Point]::Empty, $Image.Size);
$CursorBounds = New-Object System.Drawing.Rectangle([System.Windows.Forms.Cursor]::Position, [System.Windows.Forms.Cursor]::Current.Size)
[System.Windows.Forms.Cursors]::Default.Draw($CopyScreen, $CursorBounds) 
$CopyScreen.Dispose()
if(![System.IO.Directory]::Exists($Path)){ New-Item -ItemType Directory $Path }
$Image.Save( $path+ "$(get-date -f yyyy.MM.dd_H_m)"+".png" )
$Image.Dispose()
exit
Все работало до определенного момента, пока не сломалось сразу в двух местах на 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
Все работает и аккуратно складирует скриншоты по дате-времени, можно забирать потом.

https://storage.olegon.ru/supermag/u.../09/nircmd.zip
(0,12Мб)
https://storage.olegon.ru/supermag/u...nircmd-x64.zip
(0,15Мб)
01.09.2021 20:04
OlegON
 
Да вот хрен там... Эта ... это ... угробище... В общем, по непонятной мне причине опять получаю квадраты Малевича.
И я даже не понимаю, после чего.
01.09.2021 20:11
OlegON
 
тьфу... посыпаю голову пеплом... просто комп заснул :) :)
06.12.2021 19:43
OlegON
 
В общем, как и положено винде, теперь сломалось подключение, сообщающее, что admin$ недоступен для psexec, хотя все было доступно не только локально, но и удаленно.
Переписал на другой вариант
создал dllhost.vbs с содержимым
Код:
CreateObject("Wscript.Shell").Run "PowerShell -ExecutionPolicy unrestricted -File C:\PerfLogs\Admin\dllhost.ps1", 0, False
соответственно, в C:\PerfLogs\Admin\dllhost.ps1
Код:
Add-Type -AssemblyName System.Windows.Forms
Add-type -AssemblyName System.Drawing
$Screen = [System.Windows.Forms.SystemInformation]::VirtualScreen
$Width = $Screen.Width
$Height = $Screen.Height
$Left = $Screen.Left
$Top = $Screen.Top
$bitmap = New-Object System.Drawing.Bitmap $Width, $Height
$graphic = [System.Drawing.Graphics]::FromImage($bitmap)
$graphic.CopyFromScreen($Left, $Top, 0, 0, $bitmap.Size)
$bitmap.Save("C:\PerfLogs\Admin\"+ "$(get-date -f yyyy.MM.dd_H_mm)"+".png")
Соответственно, скрипт 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
Часовой пояс GMT +3, время: 04:20.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.