Сделать скриншот рабочего стола пользователя скриптом PowerShell

Сотрудники службы техподдержки пользователей попросили написать PowerShell скрипт, позволяющий быстро получить скриншот рабочего стола пользователя с удаленного компьютера. При этом сотрудник HelpDesk не должен подключаться к компьютеру пользователя через графические средства удаленной поддержки (SCCM, Remote Assistance, теневую RDP сессию и т.д.).

Получить скриншот экрана пользователя в скрипте PowerShell

Для получения текущего изображения экрана пользователя можно использовать встроенный .NET класс System.Windows.Forms. Следующий PowerShell скрипт создаст локальную папку для хранения снимков экрана, определит текущее разрешение графической среды и сохранит содержимое экрана в PNG файл.

$Path = "C:\ps\screenshots"
# Проверяем, что каталог для хранения скриншотов создан, если нет - создаем его
If (!(test-path $path)) {
New-Item -ItemType Directory -Force -Path $path
}
Add-Type -AssemblyName System.Windows.Forms
$screen = [Windows.Forms.SystemInformation]::VirtualScreen
# Получаем разрешение экрана
$image = New-Object System.Drawing.Bitmap($screen.Width, $screen.Height)
# Создаем графический объект
$graphic = [System.Drawing.Graphics]::FromImage($image)

$point = New-Object System.Drawing.Point(0, 0)
$graphic.CopyFromScreen($point, $point, $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($graphic, $cursorBounds)
$screen_file = "$Path\" + $env:computername + "_" + $env:username + "_" + "$((get-date).tostring('yyyy.MM.dd-HH.mm.ss')).png"
# Сохранить скриншот в PNG файл
$image.Save($screen_file, [System.Drawing.Imaging.ImageFormat]::Png)
# Очистка памяти
$graphic.Dispose()
$image.Dispose()

Скрипт PS-Capture-Local-Screen.ps1 доступен в нашем репозитории на GitHub.

Запустите PowerShell скрипт и проверьте, что в указанном каталоге (можно указать UNC путь к сетевой папке) появился PNG файл со снимком вашего рабочего стола в момент запуска скрипта. Для удобства имя PNG файла содержит имя компьютера, пользователя, текущую дату и время.

PowerShell скрипт сохраняет в файл скриншот экрана пользователя

Скрипт захватит на скриншоте в том числе положение курсора мыши.

Если на компьютере используются несколько мониторов, в снимок экрана попадут все рабочие столы активных мониторов (не только основного).

Чтобы создавать скриншоты экрана каждые несколько секунд, нужно поместить код скрипта в цикл while:

while($true){
{ SCRIPT }

sleep(60) # Пауза 60 секунд
}

Для вызова этого PowerShell скрипта из планировщика задач или BAT файла сценария, используйте такую команду (в этом случае не придется изменять настройки PowerShell ExecutionPolicy):

powershell.exe -executionpolicy bypass -file c:\ps\PS-Capture-Local-Screen.ps1

С помощью GPO можно поместить ярлык на этот PowerShell скрипт на рабочие столы пользователей и назначить горячие клавиши для его вызова. Теперь при появлении какой-то проблемы или ошибки в любом приложении пользователю достаточно нажать назначенную комбинацию клавиш. В результате в сетевой папке HelpDesk появится скриншот рабочего стола пользователя.

Как получить скриншот рабочего стола с удаленного компьютера из PowerShell?

Этот PowerShell скрипт можно использовать для получения скриншот рабочего стола пользователя на удаленном рабочей станции или сервере.

Если нужно получить скриншот рабочего стола с RDS сервера (или десктопной Windows , на которой разрешены множественные RDP подключения), сначала нужно получить ID сессии пользователя на удаленном компьютере.

Чтобы получить список сессий пользователей на удаленном компьютере, выполните команду:

qwinsta /server:msk-rds1

qwinsta - список сессий на удаленном компьютере

На удаленном компьютере должно быть включено правило Windows Firewall, разрешающее доступ по 445 порту (правило File and Printer Sharing (SMB-In)). Правило брандмауэра можно включить через GPO.

В данном случае пользователь выполнил вход на консоль (сессия 1).

Скопируйте файл PS-Capture-Local-Screen.ps1 в сетевой каталог и отредактируйте в нем путь, чтобы он сохранял скриншоты в сетевую папку (предоставьте права записи в эту папку для пользователей):

$Path = \\server1\Screen\Log

Теперь с помощью утилиты PsExec можно выполнить PowerShell скрипт получения скриншота для пользователя по ID его сессии ( 1 в нашем примере).

.\PsExec.exe -s -i 1 \\wks333 powershell.exe -executionpolicy bypass -WindowStyle Hidden -file "\\s-fs01\scripts\PS-Capture-Local-Screen.ps1"

PsExec.exe - создать скриншот экрана сессии пользователя на удаленном компьютере

Строка powershell.exe exited on wks333 with error code 0 указывает, что скрипт был выполнен успешно.

Теперь, сотрудники HelpDesk могут запустить эту команду со своего компьютера, и в указанном сетевом каталоге появится скриншот изображения рабочего стола пользователя удаленного компьютера.

PowerShell: сделать скриншот окна активного приложения

Рассмотренный выше скрипт помещает в PNG файл содержимое всех мониторов пользователя. Можно делать снимок только открытого окна приложения, с котороым работает пользователь в данный момент.
В GitHub также загружен обновленный скрипт PS-Capture-Current-App-Screen.ps1, позволяющий сделать в сесии пользователя скриншот только содержимого окна активного приложения.


Предыдущая статья Следующая статья


Комментариев: 16 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)