Screenshot uživatelské plochy přes PowerShell

Zaměstnanci technické podpory požádali o napsání skriptu PowerShell, aby rychle získali snímek obrazovky uživatele ze vzdáleného počítače. Zároveň by zaměstnanec HelpDesk neměl být připojen k počítači uživatele pomocí grafických nástrojů vzdálené podpory (SCCM, Vzdálená pomoc, Shadow session atd.).

Obsah:

  • Vytvořte screenshot pomocí PowerShell
  • Jak získat screenshot obrazovky ze vzdáleného počítače od PowerShell?

Vytvořte screenshot pomocí PowerShell

Nejprve si ukážeme, jak pořídit snímek obrazovky aktuální obrazovky v místním počítači z prostředí PowerShell. Pro získání obrazu plochy použijeme vestavěnou třídu .NET - System.Windows.Forms. Mám takový skript PowerShell:

$ Path = "C: \ ps \ screenshots"
# Zkontrolujte, zda byl vytvořen adresář pro ukládání screenshotů, pokud ne, vytvořte jej
If (! (Test-path $ path))
New-Item -ItemType Directory -Force -Path $ path

Add-Type -AssemblyName System.Windows.Forms
$ screen = [System.Windows.Forms.Screen] :: PrimaryScreen.Bounds
# Získat rozlišení obrazovky
$ image = New-Object System.Drawing.Bitmap ($ screen.Width, $ screen.Height)
# Vytvořte grafický objekt
$ 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)
# Získat snímek obrazovky
[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 "
# Uložit snímek do souboru png
$ image.Save ($ screen_file, [System.Drawing.Imaging.ImageFormat] :: Png)

Skript PS-Capture-Local-Screen.ps1 je k dispozici v mém úložišti na GitHubu.

Tento skript vytváří adresář pro ukládání screenshotů, získává aktuální rozlišení obrazovky, přijímá obrázky pracovního prostoru a ukládá je do souboru png.

Spusťte určený skript PowerShell a ověřte, že v zadaném adresáři (můžete zadat cestu UNC k síťové složce) se v době spuštění skriptu objevil soubor png se snímkem obrazovky vaší plochy. Pro zjednodušení název souboru png obsahuje název počítače, uživatele, aktuální datum a čas.

Pokud chcete použít volání tohoto skriptu PS ze skriptů, použijte tento příkaz (v tomto případě nemusíte měnit nastavení PowerShell ExecutionPolicy):

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

Pro úpravy skriptů PowerShell raději používám Visual Studio Code místo Powershell ISE.

Zkratka tohoto skriptu PowerShell může být umístěna prostřednictvím GPO na stolních počítačích všech uživatelů v doméně a svázat horké klávesy pro jeho vyvolání. Nyní, když se v jakékoli aplikaci vyskytne problém nebo chyba, stačí uživatel stisknout přiřazenou kombinaci kláves. Výsledkem je, že se v síťové složce HelpDesk zobrazí screenshot plochy uživatele.

Jak získat screenshot obrazovky ze vzdáleného počítače od PowerShell?

Dalším úkolem je použít PowerShell k získání snímku obrazovky uživatele na vzdáleném počítači / serveru. Může to být samostatný počítač se systémem Windows 10 nebo server RDS.

Upřednostňovaným způsobem grafického připojení k ploše uživatelů na serveru RDS je stínování vzdálené plochy.

Pokud chcete získat screenshot obrazovky ze serveru RDS (nebo desktop Windows, na kterém je povoleno více připojení RDP), musíte nejprve získat ID relace uživatele na vzdáleném počítači. V následujícím skriptu je třeba zadat název vzdáleného serveru a uživatelského účtu.

$ ComputerName = "msk-rds1"
$ RDUserName = "avivanov"
$ quser = (((uživatel dotazu / server: $ ComputerName) -replace '^>', ") -replace '\ s 2,', ',' | ConvertFrom-Csv)
$ usersess = $ quser | kde $ _. USERNAME - jako $ RDUserName - a $ _. STATE -eq "Active"
$ usersessID = $ usersess.ID

Pokud pomocí skriptu snímáte screenshoty ze vzdálených počítačů u jednoho uživatele, bude číslo relace vždy 1. Nahraďte předchozí blok ankety RDS serverem $ usersessID = 1.

Pro větší pohodlí je třeba soubor uložit pomocí skriptu PowerShell, aby se snímek obrazovky dostal do síťového adresáře. Chcete-li to provést, upravte skript PS-Capture-Local-Screen.ps1, změňte cestu na:

$ Path = \\ server1 \ Screen \ Log

Screenshoty uživatelů budou uloženy do tohoto adresáře. Udělte přístup pro zápis do tohoto adresáře pro skupinu domén Authenticated Users.

Jakmile získáte ID relace uživatele, můžete se vzdáleně připojit k jeho relaci pomocí programu PsExec a spustit skript:

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

Nyní může zaměstnanec HelpDesk spustit tento skript ze svého počítače a v zadaném adresáři se zobrazí snímek aktuálního obrazu plochy uživatele vzdáleného počítače..