Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

PowerShell로 로컬 및 원격 사용자 데스크톱 스크린샷 캡처하는 방법

한 헬프데스크 지원팀이 원격 컴퓨터에서 사용자 데스크톱 화면을 빠르게 캡처할 수 있는 PowerShell 스크립트 작성을 요청해 왔습니다. 핵심 조건은 헬프데스크 담당자가 SCCM, 원격 지원(Remote Assistance), RDP 세션 섀도잉 같은 그래픽 기반 원격 지원 도구를 사용하지 않고도 작업을 완료해야 한다는 것이었습니다.

이 글에서는 먼저 로컬 컴퓨터에서 PowerShell로 스크린샷을 찍는 방법을 알아보고, 이어서 원격 컴퓨터나 RDS 서버에 접속 중인 사용자 데스크톱의 스크린샷을 가져오는 방법까지 단계별로 살펴보겠습니다.

PowerShell을 이용한 스크린샷 캡처

가장 먼저 로컬 컴퓨터에서 PowerShell로 스크린샷을 캡처하는 방법부터 알아보겠습니다. 현재 데스크톱 화면을 캡처하려면 .NET의 내장 클래스인 System.Windows.Forms를 활용하면 됩니다. 아래는 제가 작성한 PowerShell 스크립트입니다.

$Path = "C:\ScreenCapture"
# 스크린샷 저장용 폴더가 없으면 새로 생성
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)

이 스크립트는 다음과 같은 순서로 동작합니다. 먼저 스크린샷을 저장할 디렉터리가 있는지 확인하고 없으면 생성합니다. 그다음 현재 화면 해상도를 가져와 활성 화면 전체를 캡처한 뒤 PNG 파일로 저장합니다. 저장 경로에는 UNC 경로(공유 네트워크 폴더)도 지정할 수 있습니다. 편의를 위해 파일명에는 컴퓨터 이름, 사용자 이름, 날짜 및 시간이 자동으로 포함되므로 누가 언제 캡처한 이미지인지 쉽게 구분할 수 있습니다.

스크립트를 실행한 후 지정한 디렉터리에 PNG 파일이 정상적으로 생성되었는지 확인해 보세요.

배치 파일(.bat)에서 이 PowerShell 스크립트를 호출하려면 아래 명령어를 사용하면 됩니다. 이 방식을 사용하면 PowerShell 실행 정책(Execution Policy) 설정을 별도로 변경할 필요가 없습니다.

powershell.exe -executionpolicy bypass -file c:\ps\CaptureLocalScreen.ps1

PowerShell 스크립트를 편집할 때는 PowerShell ISE보다 Visual Studio Code를 사용하는 것을 추천합니다. 문법 강조, IntelliSense, 확장 기능 면에서 훨씬 유리하기 때문입니다.

또한 GPO(그룹 정책)를 활용하면 도메인의 모든 사용자 데스크톱에 이 스크립트 바로 가기를 배포하고 단축키(hotkey)까지 할당할 수 있습니다. 이렇게 구성해 두면 애플리케이션에서 오류나 문제가 발생했을 때 사용자가 할당된 단축키만 누르면 되고, 해당 순간의 데스크톱 스크린샷이 자동으로 헬프데스크 공유 폴더에 저장됩니다.

원격 컴퓨터의 데스크톱 스크린샷을 PowerShell로 캡처하는 방법

다음 과제는 PowerShell을 사용해 원격 컴퓨터에서 사용자 데스크톱의 스크린샷을 가져오는 것입니다. 대상은 Windows 10이 설치된 독립 실행형 컴퓨터일 수도 있고, RDS(원격 데스크톱 서비스) 서버일 수도 있습니다.

RDS 서버에서 사용자 데스크톱에 그래픽 도구로 연결하는 일반적인 방법은 RDP 세션 섀도잉(Shadow Session)이지만, 여기서는 이러한 도구 없이 스크린샷만 가져오는 시나리오를 다룹니다.

RDS 서버(또는 동시 RDP 연결이 허용된 Windows 데스크톱)에서 데스크톱 스크린샷을 얻으려면 먼저 원격 컴퓨터에서 해당 사용자의 세션 ID를 확인해야 합니다. 아래 PowerShell 스크립트에 원격 컴퓨터/서버 이름과 사용자 계정을 지정하세요.

$ComputerName = "nld-rds1"
$RDUserName = "h.jansen"
$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 스크립트 파일은 공유 네트워크 폴더에 저장해 두는 것이 좋습니다. 그런 다음 CaptureLocalScreen.ps1 파일을 열어 저장 경로를 아래와 같이 수정합니다.

$Path = \\nld-fs01\Screen\Log

이렇게 하면 사용자들의 스크린샷이 모두 이 폴더에 저장됩니다. 해당 폴더에는 도메인 그룹 Authenticated Users에 쓰기 권한을 부여해야 합니다.

사용자 세션 ID를 확보했다면, 이제 PsExec 도구를 사용해 원격으로 사용자 세션에 연결하여 스크립트를 실행할 수 있습니다.

.\PsExec.exe -s -i $usersessID \\$ComputerName powershell.exe -executionpolicy bypass -WindowStyle Hidden -file "\\nld-fs01\Screen\CaptureLocalScreen.ps1"

이 명령을 실행하면 헬프데스크 담당자는 자신의 컴퓨터에서 스크립트를 실행하는 것만으로 원격 컴퓨터의 현재 데스크톱 스크린샷을 지정된 디렉터리에서 확인할 수 있습니다. 그래픽 원격 지원 도구에 접속할 필요 없이, 사용자가 겪고 있는 화면의 문제를 즉시 파악해 신속하게 대응할 수 있다는 점이 이 방식의 가장 큰 장점입니다.