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

PowerShell Windows

Сотрудники службы техподдержки пользователей попросили написать 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 и запустить скрипт:

Читайте также:
Способы устранения ошибки 2148204812

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

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

Оцените статью
( Пока оценок нет )
Поделиться с друзьями
Информационный блог про Windows
Добавить комментарий