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

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

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

Создаем скриншот средствами PowerShell

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

$Path = "C:psscreenshots"
# Проверяем, что каталог для хранения скриншотов создан, если нет - создаем его
If (!(test-path $path)) {
New-Item -ItemType Directory -Force -Path $path
}
Add-Type -AssemblyName System.Windows.Forms
$screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds
# Получаем разрешение экрана
$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)

Данный скрипт создает каталог для хранения скриншотов, получает текущее разрешение экрана, получает изображения рабочей области и сохраняет его в png файл.

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

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

powershell.exe -executionpolicy bypass -file c:psPS-Capture-Local-Screen.ps1

d181d0bad180d0b8d0bdd188d0bed182 d180d0b0d0b1d0bed187d0b5d0b3d0be d181d182d0bed0bbd0b0 d0bfd0bed0bbd18cd0b7d0bed0b2d0b0d182d0b5d0bb 65d2258a0418b

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

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

Следующая задача – нужно через PowerShell получить скриншот рабочего стола пользователя на удаленном компьютере/сервере. Это может быть как отдельный компьютер с Windows 10, так и RDS сервер.

Предпочтительный способ графического подключения к рабочему столу пользователей на RDS сервере — Remote Desktop Shadowing.

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

$ComputerName = "msk-rds1"
$RDUserName = "avivanov"
$quser = (((query user /server:$ComputerName) -replace '^>', '') -replace 's{2,}', ',' | ConvertFrom-Csv)
$usersess=$quser | where {$_.USERNAME -like $RDUserName -and $_.STATE -eq "Active"}
$usersessID=$usersess.ID

Если вы используете скрипт для получения скриншотов экрана с удаленных компьютеров с одним пользователя, номер его сессии, всегда будет 1. Замените предыдущий блок опроса RDS сервера на
$usersessID = 1
.

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

$Path = server1ScreenLog

В этот каталог будут сохранятся скриншоты пользователей. Предоставьте права на запись в этот каталог для доменной группы Authenticated Users.

После того, как вы получили ID сессии пользователя, можно удаленно подключиться в его сессию через PsExec и запустить скрипт:

.PsExec.exe -s -i $usersessID $ComputerName powershell.exe -executionpolicy bypass -WindowStyle Hidden -file "server1ScreenPS-Capture-Local-Screen.ps1"

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

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