Đội ngũ hỗ trợ HelpDesk yêu cầu viết kịch bản PowerShell để nhanh chóng chụp màn hình desktop của người dùng từ máy tính từ xa. Điều kiện chính là nhân viên HelpDesk không được kết nối đến máy tính của người dùng thông qua công cụ hỗ trợ từ xa đồ họa (SCCM, Remote Assistance, Remote Desktop Session Shadowing, v.v.).
Chụp màn hình bằng PowerShell
Trước hết, hãy tìm hiểu cách chụp màn hình trên máy tính cục bộ với PowerShell. Để chụp hình ảnh desktop hiện tại, bạn có thể sử dụng lớp .NET tích hợp System.Windows.Forms. Dưới đây là kịch bản PowerShell:
$Path = "C:\ScreenCapture"
# Đảm bảo thư mục lưu screenshot đã được tạo, nếu chưa thì tạo mới
If (!(test-path $path)) {
New-Item -ItemType Directory -Force -Path $path
}
Add-Type -AssemblyName System.Windows.Forms
$screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds
# Lấy độ phân giải màn hình hiện tại
$image = New-Object System.Drawing.Bitmap($screen.Width, $screen.Height)
# Tạo đối tượng đồ họa
$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)
# Chụp màn hình
[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"
# Lưu screenshot dưới dạng tệp PNG
$image.Save($screen_file, [System.Drawing.Imaging.ImageFormat]::Png)
Kịch bản PowerShell này tạo thư mục lưu screenshot, lấy độ phân giải màn hình hiện tại, chụp hình ảnh không gian làm việc hiện tại và lưu dưới dạng tệp PNG. Chạy kịch bản và kiểm tra xem tệp png có xuất hiện trong thư mục chỉ định (bạn có thể chỉ định đường dẫn UNC đến thư mục chia sẻ mạng) với screenshot desktop của bạn. Để tiện lợi, tên tệp PNG chứa tên máy tính, tên người dùng, ngày và giờ hiện tại.
Nếu bạn muốn gọi kịch bản PS từ tệp batch, hãy dùng lệnh sau (trong trường hợp này, bạn không cần thay đổi cài đặt PowerShell Execution Policy):
powershell.exe -executionpolicy bypass -file c:\ps\CaptureLocalScreen.ps1
Để chỉnh sửa kịch bản PowerShell, tôi thích dùng Visual Studio Code thay vì Powershell ISE.
Bạn có thể tạo GPO để đặt lối tắt cho kịch bản PowerShell lên desktop của tất cả người dùng miền và gán phím tắt để gọi nó. Bây giờ, khi sự cố hoặc lỗi xuất hiện trong bất kỳ ứng dụng nào, người dùng chỉ cần nhấn phím tắt đã gán. Sau đó, screenshot desktop người dùng sẽ xuất hiện trong thư mục chia sẻ của HelpDesk.
Cách chụp màn hình desktop từ máy tính từ xa bằng PowerShell?
Nhiệm vụ tiếp theo là lấy screenshot desktop của người dùng trên máy tính từ xa qua PowerShell. Có thể là máy tính độc lập chạy Windows 10 hoặc máy chủ RDS.
Cách ưa thích để kết nối với desktop người dùng trên máy chủ RDS bằng công cụ đồ họa là Shadow RDP Session.
Nếu bạn muốn lấy screenshot desktop từ máy chủ RDS (hoặc Windows desktop cho phép nhiều kết nối RDP đồng thời), trước tiên bạn phải lấy ID phiên người dùng trên máy tính từ xa. Chỉ định tên máy tính/máy chủ từ xa và tài khoản người dùng trong kịch bản PowerShell sau:
$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
Nếu bạn dùng kịch bản để lấy screenshot từ máy tính từ xa chỉ có một người dùng, số phiên sẽ luôn là 1. Thay thế khối truy vấn RDS server trước đó bằng $usersessID = 1.
Để tiện lợi hơn, lưu tệp kịch bản PowerShell vào thư mục chia sẻ mạng. Sau đó chỉnh sửa tệp CaptureLocalScreen.ps1 và thay đổi đường dẫn thành:
$Path = \\nld-fs01\Screen\Log
Screenshot người dùng sẽ được lưu vào thư mục này. Cấp quyền ghi cho thư mục cho nhóm miền Authenticated Users.
Sau khi đã có ID phiên người dùng, bạn có thể kết nối từ xa với phiên người dùng bằng công cụ PsExec và chạy kịch bản:
.\PsExec.exe -s -i $usersessID \\$ComputerName powershell.exe -executionpolicy bypass -WindowStyle Hidden -file "\\nld-fs01\Screen\CaptureLocalScreen.ps1"
Sau đó, thành viên đội HelpDesk có thể chạy kịch bản từ máy tính của mình, và screenshot desktop hiện tại của máy tính từ xa sẽ xuất hiện trong thư mục chỉ định.