Не знаю для каких задач вам может пригодиться снимать с экрана скриншоты, но надеюсь что для абсолютно легальных. Например для родительского контроля.
Родительский контроль это ведь легально, да?
Следующий скрипт захватывает изображение с экрана, вместе с курсором, и помещает в папку C:\Temp\Screenshot.
$Path = "C:\Temp\Screenshot\" 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); $СursorBounds = New-Object System.Drawing.Rectangle([System.Windows.Forms.Cursor]::Position, [System.Windows.Forms.Cursor]::Current.Size) [System.Windows.Forms.Cursors]::Default.Draw($CopyScreen, $СursorBounds) $CopyScreen.Dispose() if(![System.IO.Directory]::Exists($Path)){ New-Item -ItemType Directory $Path } $Image.Save( $path+ "$(get-date -f yyyy.MM.dd_h\h_m\m)"+".jpg" ) $Image.Dispose()
Для съемки экрана через заданные интервалы времени, код можно поместить в цикл while
while($true){ { SCRIPT } sleep(60) # Пауза в 60 секунд }
Не захватывать курсор
Если вам не нужен курсор на изображениях, то удалите из кода следующие строки
$СursorBounds = New-Object System.Drawing.Rectangle([System.Windows.Forms.Cursor]::Position, [System.Windows.Forms.Cursor]::Current.Size) [System.Windows.Forms.Cursors]::Default.Draw($CopyScreen, $СursorBounds)
Возможные проблемы
Exception calling "CopyFromScreen" with "3" argument(s): "Неверный дескриптор"
Если вы получаете такую ошибку, то скорее всего вы пытаетесь выполнить скрипт на удаленном компьютере.
Ошибка возникает потому, что переменная $Image не содержит значения, из-за того что вы не указываете для какого сеанса нужно выполнить код, а PowerShell не может определить монитор, с которого нужно выполнить захват изображения.
При этом в целевой папке создаются файлы с белым фоном и размером до 10кб.
Для успешного захвата изображения, используя PsExec, укажите ключи -s и -i для того что бы выполнить скрипт в активной на данный момент сессии.
psexec -i -s \\CompName powershell -nologo -WindowStyle hidden -inputformat none -ExecutionPolicy Bypass -file "C:\Temp\Script.ps1"
Что бы завершить выполнение удаленного процесса, выполните для целевого компьютера WMI команду:
wmic /node:CompName process where "ExecutablePath like '%power%'" delete
Добрый день. Спасибо вам за ваш скрипт. А как можно дополнить скрипт что бы он проверял статус сессии, активно или отключено, что бы лишний скриншот не делал?
Состояние можно проверить командой
query session /server:localhost
Я дописал немного ваш скрипт что бы для каждого пользователя создавалась папка, и скрин делался каждые 3 секунды. Но никак не могу сделать проверку на состояние сессии терминального пользователя.
while ($true) {
$date = Get-Date
$date = $date.ToString(«yyyy-MM-dd»)
$Path = «C:\Temp\Screenshot\$env:USERNAME\$date\»
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);
$СursorBounds = New-Object System.Drawing.Rectangle([System.Windows.Forms.Cursor]::Position, [System.Windows.Forms.Cursor]::Current.Size)
[System.Windows.Forms.Cursors]::Default.Draw($CopyScreen, $СursorBounds)
$CopyScreen.Dispose()
if(![System.IO.Directory]::Exists($Path)){ New-Item -ItemType Directory $Path }
$Image.Save( $path+ «$(get-date -f HH/mm/ss)»+».jpg» )
$Image.Dispose();
start-sleep 3}
Добрый день.
Не совсем понял с чем требуется помощь, но возможно вам поможет разобраться другая моя заметка про использование утилиты quser из powershell:
https://administra.top/powershell-upravlenie-terminalnymi-seansami/