Екранна снимка на потребителския десктоп чрез PowerShell

Персоналът за техническа поддръжка поиска да напише скрипт на PowerShell, за да получите бързо екранна снимка на работния плот на потребителя от отдалечен компютър. В същото време служителят на HelpDesk не трябва да се свързва с компютъра на потребителя чрез графични инструменти на отдалечена поддръжка (SCCM, отдалечена помощ, сесия на сянка и др.).

Съдържание:

  • Създайте екранна снимка с помощта на PowerShell
  • Как да получите екранна снимка на работния плот от отдалечен компютър от PowerShell?

Създайте екранна снимка с помощта на PowerShell

Първо ще измислим как да направим екранна снимка на текущия екран на локалния компютър от PowerShell. За да получим изображението на работния плот, ще използваме вградения клас .NET - System.Windows.Forms. Получих такъв скрипт на PowerShell:

$ Path = "C: \ ps \ screenshots"
# Проверете дали директорията за съхранение на екранни снимки е създадена, ако не, създайте я
If (! ($ Path test))
New-Item -ItemType Directory -Force -Path $ path

Add-Type -AssemblyName System.Windows.Forms
$ screen = [System.Windows.Forms.Screen] :: PrimaryScreen.Bounds
# Получете разделителна способност на екрана
$ image = Система за нов обект.Начертаване на карта ($ screen.Width, $ screen.Height)
# Създайте графичен обект
$ graphics = [System.Drawing.Graphics] :: FromImage ($ изображение)
$ point = Нов обект System.Drawing.Point (0, 0)
$ graphics.CopyFromScreen ($ point, $ point, $ image.Size);
$ cursorBounds = New-Object System.Drawing.Rectangle ([System.Windows.Forms.Cursor] :: Позиция, [System.Windows.Forms.Cursor] :: Current.Size)
# Вземете екранна снимка
[System.Windows.Forms.Cursors] :: Default.Draw ($ graphics, $ cursorBounds)
$ screen_file = "$ Path \" + $ env: име на компютър + "_" + $ env: потребителско име + "_" + "$ ((дата на получаване) .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 и проверете дали png файл се появява в указаната директория (можете да зададете пътя на UNC до мрежовата папка) със скрийншот на вашия работен плот по време на изпълнение на скрипта. За удобство името на 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 връзки), първо трябва да получите идентификационния номер на сесията на потребителя на отдалечения компютър. В следния скрипт трябва да посочите името на отдалечения сървър и потребителския акаунт.

$ ComputerName = "msk-rds1"
$ RDUserName = "avivanov"
$ quser = (((запитване потребител / сървър: $ ComputerName) -заменете '^>', ") -замени '\ s 2,', ',' | Преобразуване от Csv)
$ usersess = $ quser | където $ _. USERNAME -подобен $ RDUserName -и $ _. ДЪРЖАВА -eq "Active"
$ usersessID = $ usersess.ID

Ако използвате скрипта за вземане на екрани от отдалечени компютри с един потребител, номерът на сесията винаги ще бъде 1. Заменете предишния блок на анкетата на RDS сървъра с $ usersessID = 1.

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

$ Path = \\ server1 \ Екран \ Дневник

Снимките на екрана на потребителите ще бъдат записани в тази директория. Дайте достъп за писане до тази директория за групата домейни Удостоверени потребители.

След като получите идентификационния номер на сесията на потребителя, можете дистанционно да се свържете с неговата сесия чрез PsExec и да стартирате скрипта:

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

Сега служител на HelpDesk може да стартира този скрипт от своя компютър и екранната снимка на текущото изображение на работния плот на потребителя на отдалечения компютър ще се появи в указаната директория.