PowerShell. Снимаем скриншоты

Не знаю для каких задач вам может пригодиться снимать с экрана скриншоты, но надеюсь что для абсолютно легальных.  Например для родительского контроля.
Родительский контроль это ведь легально, да?

Следующий скрипт захватывает изображение с экрана, вместе с курсором, и помещает в папку 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 для того что бы выполнить скрипт в активной на данный момент сессии.

Вместо ключа -s можно указать ключ -u и конкретизировать учетную запись, имеющую права администратора
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

2 мысли о “PowerShell. Снимаем скриншоты”

  1. Добрый день. Спасибо вам за ваш скрипт. А как можно дополнить скрипт что бы он проверял статус сессии, активно или отключено, что бы лишний скриншот не делал?
    Состояние можно проверить командой
    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}

Добавить комментарий

Ваш адрес email не будет опубликован.