Сотрудники службы техподдержки пользователей попросили написать 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)
Скрипт PS-Capture-Local-Screen.ps1 доступен в моем репозитории на GitHub.
Данный скрипт создает каталог для хранения скриншотов, получает текущее разрешение экрана, получает изображения рабочей области и сохраняет его в png файл.
Запустите указанный PowerShell скрипт и проверьте, что в указанном каталоге (можно укажать UNC путь к сетевой папке) появился png файл со скриншотом вашего рабочего стола в момент запуска скрипта. Для удобства имя png файла содержит имя компьютера, пользователя, текущую дату и время.
Если вы хотите использовать вызов данного PS скрипт из сценариев, используйте такую команду (в этом случае вам не придется изменять настройки PowerShell ExecutionPolicy):
powershell.exe -executionpolicy bypass -file c:psPS-Capture-Local-Screen.ps1
Для редактирования скриптов PowerShell я предпочитаю использовать Visual Studio Code вместо Powershell ISE.
Ярлык на данный 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 может запустить этот скрипт со своего компьютера, и в указанном каталоге появится скриншот текущего изображения рабочего стола пользователя удаленного компьютера.