Zrzut ekranu pulpitu użytkownika za pomocą programu PowerShell

Personel pomocy technicznej poprosił o napisanie skryptu PowerShell, aby szybko uzyskać zrzut ekranu pulpitu użytkownika ze zdalnego komputera. Jednocześnie pracownik HelpDesk nie powinien być podłączony do komputera użytkownika za pomocą graficznych narzędzi zdalnego wsparcia (SCCM, Pomoc zdalna, sesja Shadow itp.).

Treść

  • Utwórz zrzut ekranu za pomocą PowerShell
  • Jak uzyskać zrzut ekranu pulpitu ze zdalnego komputera z PowerShell?

Utwórz zrzut ekranu za pomocą PowerShell

Najpierw dowiemy się, jak zrobić zrzut ekranu bieżącego ekranu na komputerze lokalnym z PowerShell. Aby uzyskać obraz pulpitu, użyjemy wbudowanej klasy .NET - System.Windows.Forms. Mam taki skrypt PowerShell:

$ Path = "C: \ ps \ screenshots"
# Sprawdź, czy katalog do przechowywania zrzutów ekranu został utworzony, jeśli nie, utwórz go
If (! (Test-path $ path))
Nowy element -ItemType Katalog -Force -Path $ ścieżka

Add-Type -AssemblyName System.Windows.Forms
$ screen = [System.Windows.Forms.Screen] :: PrimaryScreen.Bounds
# Uzyskaj rozdzielczość ekranu
$ image = New-Object System.Drawing.Bitmap ($ screen.Width, $ screen.Height)
# Utwórz obiekt graficzny
$ 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] :: Pozycja, [System.Windows.Forms.Cursor] :: Current.Size)
# Pobierz zrzut ekranu
[System.Windows.Forms.Cursors] :: Default.Draw ($ graphic, $ cursorBounds)
$ screen_file = "$ Path \" + $ env: nazwa_komputera + "_" + $ env: nazwa użytkownika + "_" + "$ ((get-date) .tostring ('rrrr.MM.dd-GG.mm.ss „)). png”
# Zapisz zrzut ekranu do pliku png
$ image.Save ($ screen_file, [System.Drawing.Imaging.ImageFormat] :: Png)

Skrypt PS-Capture-Local-Screen.ps1 jest dostępny w moim repozytorium na GitHub.

Ten skrypt tworzy katalog do przechowywania zrzutów ekranu, uzyskuje bieżącą rozdzielczość ekranu, odbiera obrazy obszaru roboczego i zapisuje go w pliku png.

Uruchom określony skrypt PowerShell i sprawdź, czy plik png pojawia się w określonym katalogu (możesz określić ścieżkę UNC do folderu sieciowego) wraz ze zrzutem ekranu pulpitu w momencie uruchomienia skryptu. Dla wygody nazwa pliku png zawiera nazwę komputera, użytkownika, bieżącą datę i godzinę.

Jeśli chcesz użyć wywołania tego skryptu PS ze skryptów, użyj tego polecenia (w tym przypadku nie musisz zmieniać ustawień programu PowerShell ExecutionPolicy):

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

Do edycji skryptów PowerShell wolę używać programu Visual Studio Code zamiast Powershell ISE.

Skrót do tego skryptu PowerShell można umieścić za pomocą obiektu GPO na komputerach stacjonarnych wszystkich użytkowników domeny i przypisać skróty, aby go wywołać. Teraz, gdy występuje problem lub błąd w dowolnej aplikacji, użytkownik musi po prostu nacisnąć przypisaną kombinację klawiszy. W rezultacie zrzut ekranu pulpitu użytkownika pojawia się w folderze sieciowym HelpDesk.

Jak uzyskać zrzut ekranu pulpitu ze zdalnego komputera z PowerShell?

Następnym zadaniem jest użycie programu PowerShell, aby uzyskać zrzut ekranu pulpitu użytkownika na zdalnym komputerze / serwerze. Może to być osobny komputer z systemem Windows 10 lub serwer RDS.

Preferowanym sposobem graficznego łączenia się z pulpitem użytkowników na serwerze RDS jest Remote Desktop Shadowing.

Jeśli chcesz uzyskać zrzut ekranu pulpitu z serwera RDS (lub pulpitu Windows, na którym dozwolonych jest wiele połączeń RDP), najpierw musisz uzyskać identyfikator sesji użytkownika na komputerze zdalnym. W poniższym skrypcie musisz podać nazwę zdalnego serwera i konta użytkownika.

$ ComputerName = "msk-rds1"
$ RDUserName = "avivanov"
$ quser = (((zapytanie użytkownika / serwera: $ nazwa_komputera) -replace '^>', ") -replace '\ s 2,', ',' | ConvertFrom-Csv)
$ usersess = $ quser | gdzie $ _. NAZWA UŻYTKOWNIKA - podobnie jak $ RDUserName - i $ _. STATE -eq „Aktywny”
$ usersessID = $ usersess.ID

Jeśli używasz skryptu do robienia zrzutów ekranu ze zdalnych komputerów z jednym użytkownikiem, numerem sesji będzie zawsze 1. Zastąp poprzedni blok odpytywania serwera RDS przez $ usersessID = 1.

Dla wygody musisz zapisać plik ze skryptem PowerShell, aby pobrać zrzut ekranu do katalogu sieciowego. Aby to zrobić, edytuj skrypt PS-Capture-Local-Screen.ps1, zmień ścieżkę na:

$ Path = \\ server1 \ Screen \ Log

Zrzuty ekranu użytkowników zostaną zapisane w tym katalogu. Przyznaj dostęp do zapisu do tego katalogu dla grupy domen Użytkownicy uwierzytelnieni.

Po uzyskaniu identyfikatora sesji użytkownika możesz zdalnie połączyć się z jego sesją za pomocą PsExec i uruchomić skrypt:

.\ PsExec.exe -s -i $ nazwa_użytkownika \\ $ nazwa_komputera powershell.exe -wykonanie polityki obwodnicy -WindowStyle Hidden -file "\\ server1 \ Screen \ PS-Capture-Local-Screen.ps1"

Teraz pracownik HelpDesk może uruchomić ten skrypt ze swojego komputera, a zrzut ekranu bieżącego obrazu pulpitu użytkownika komputera zdalnego pojawi się w określonym katalogu.