Posnetek zaslona uporabniškega namizja prek PowerShell-a

Uslužbenci tehnične podpore so zahtevali, da napišejo skript PowerShell, da hitro odkrijete posnetek zaslona uporabniškega namizja iz oddaljenega računalnika. Hkrati uslužbenec HelpDesk ne sme biti povezan z uporabnikovim računalnikom prek grafičnih orodij oddaljene podpore (SCCM, oddaljena pomoč, seja Shadow itd.).

Vsebina:

  • Ustvarite posnetek zaslona s programom PowerShell
  • Kako dobiti zaslon namizja iz oddaljenega računalnika iz PowerShell-a?

Ustvarite posnetek zaslona s programom PowerShell

Najprej bomo ugotovili, kako narediti posnetek zaslona trenutnega zaslona na lokalnem računalniku iz PowerShell-a. Za pridobitev namizne slike bomo uporabili vgrajeni razred .NET - System.Windows.Forms. Imam takšen skript PowerShell:

$ Path = "C: \ ps \ posnetki zaslona"
# Preverite, ali je bil ustvarjen imenik za shranjevanje posnetkov zaslona, ​​če ni, ga ustvarite
Če (! (Testna pot $ pot))
Nov element-ImenikTypeType -Force -Path $ pot

Add-Type -AssemblyName System.Windows.Forms
$ screen = [System.Windows.Forms.Screen] :: PrimaryScreen.Bounds
# Pridobite ločljivost zaslona
$ image = Nov objektni sistem.Vlečenje.Bitmap ($ screen.Width, $ screen.Height)
# Ustvari grafični objekt
$ graphics = [System.Drawing.Graphics] :: FromImage ($ image)
$ point = Nov objektni sistem.Nišete.Point (0, 0)
$ graphic.CopyFromScreen ($ točka, $ točka, $ image.Size);
$ cursorBounds = New-Object System.Drawing.Rectangle ([System.Windows.Forms.Cursor] :: Položaj, [System.Windows.Forms.Cursor] :: Current.Size)
# Ustvari posnetek zaslona
[System.Windows.Forms.Cursors] :: Privzeto risanje ($ grafična, $ cursorBounds)
$ screen_file = "$ pot \" + $ env: ime računalnika + "_" + $ env: uporabniško ime + "_" + "$ ((datum-datum) .tostring ('yyyy.MM.dd-HH.mm.ss ')). png "
# Shrani posnetek zaslona v png datoteko
$ image.Save ($ screen_file, [System.Drawing.Imaging.ImageFormat] :: Png)

Skript PS-Capture-Local-Screen.ps1 je na voljo v mojem skladišču na GitHubu.

Ta skript ustvari imenik za shranjevanje posnetkov zaslona, ​​pridobi trenutno ločljivost zaslona, ​​prejme slike delovnega prostora in ga shrani v png datoteko.

Zaženite navedeni skript PowerShell in preverite, ali se je v določenem imeniku (lahko določite pot UNC do omrežne mape) v png datoteki prikazala png datoteka s posnetkom zaslona vašega namizja. Za udobje ime datoteke png vsebuje ime računalnika, uporabnika, trenutni datum in čas.

Če želite uporabiti klic tega skripta PS iz skriptov, uporabite ta ukaz (v tem primeru vam ni treba spremeniti nastavitev PowerShell ExecutionPolicy):

powershell.exe -executionpolicy bypass -file c: \ ps \ PS-Capture-Local-Screen.ps1

Za urejanje skriptov PowerShell raje uporabljam Visual Studio Code namesto Powershell ISE.

Bližnjico do tega skripta PowerShell lahko postavite prek GPO na namizja vseh uporabnikov domene in za povezovanje vročih tipk. Ko se v kateri koli aplikaciji pojavi težava ali napaka, mora uporabnik samo pritisniti dodeljeno kombinacijo tipk. Posledično se v omrežni mapi HelpDesk prikaže posnetek zaslona uporabniškega namizja.

Kako dobiti zaslon namizja iz oddaljenega računalnika iz PowerShell-a?

Naslednja naloga je, da s programom PowerShell dobite posnetek zaslona uporabniškega namizja na oddaljenem računalniku / strežniku. Lahko je bodisi ločen računalnik z Windows 10 ali strežnik RDS.

Najboljši način grafične povezave z namizjem uporabnikov na strežniku RDS je senčenje oddaljenega namizja.

Če želite dobiti namizje zaslona s strežnika RDS (ali namiznega sistema Windows, na katerem je dovoljeno več povezav RDP), morate najprej pridobiti ID seje uporabnika na oddaljenem računalniku. V naslednjem skriptu morate določiti ime oddaljenega strežnika in uporabniški račun.

$ ComputerName = "msk-rds1"
$ RDUserName = "avivanov"
$ quser = (((poizvedba uporabnik / strežnik: $ ComputerName) -replace '^>', ") -replace '\ s 2,', ',' | Pretvori iz Csv)
$ usersess = $ quser | kjer je $ _. USERNAME podobno $ RDUserName -and $ _. STATE -eq "Active"
$ usersessID = $ usersess.ID

Če uporabljate skript za snemanje posnetkov zaslona z oddaljenih računalnikov z enim uporabnikom, bo številka seje vedno 1. Zamenjajte prejšnji blok ankete strežnika RDS z $ usersessID = 1.

Za udobje morate datoteko shraniti s skriptom PowerShell, da posnamete posnetek zaslona v omrežni imenik. Če želite to narediti, uredite skript PS-Capture-Local-Screen.ps1, spremenite pot v:

$ Pot = \\ server1 \ Zaslon \ Dnevnik

Posnetki zaslona uporabnikov bodo shranjeni v ta imenik. Omogoči pisanje dostopa do tega imenika za skupino domen Pooblaščeni uporabniki.

Ko dobite ID seje uporabnika, se lahko z PsExec na daljavo povežete z njegovo sejo in zaženete skript:

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

Zdaj lahko uslužbenec HelpDeska zažene ta skript iz svojega računalnika in posnetek zaslona trenutne slike namizja uporabnika oddaljenega računalnika se prikaže v določenem imeniku.