Скріншот робочого столу користувача через PowerShell

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

зміст:

  • Створюємо скріншот засобами PowerShell
  • Як отримати скріншот робочого столу з віддаленого комп'ютера з PowerShell?

Створюємо скріншот засобами PowerShell

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

$ Path = "C: \ ps \ screenshots"
# Перевіряємо, що каталог для зберігання скріншотів створено, якщо немає - створюємо його
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: \ ps \ PS-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 = \\ server1 \ Screen \ Log

У цей каталог будуть збережуться скріншоти користувачів. Надайте права на запис в цей каталог для доменної групи Authenticated Users.

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

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

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