Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

การจับภาพหน้าจอ Desktop ของผู้ใช้ด้วย PowerShell

ทีม HelpDesk ขอให้เขียนสคริปต์ PowerShell เพื่อจับภาพหน้าจอ Desktop ของผู้ใช้จากคอมพิวเตอร์ระยะไกลได้อย่างรวดเร็ว เงื่อนไขหลักคือ พนักงาน HelpDesk ไม่ควรเชื่อมต่อกับคอมพิวเตอร์ของผู้ใช้ผ่านเครื่องมือ Remote Support แบบกราฟิก (SCCM, Remote Assistance, Remote Desktop Session Shadowing, เป็นต้น)

การจับภาพหน้าจอ (Screenshot) โดยใช้ PowerShell

ก่อนอื่น เรามาเรียนรู้วิธีจับภาพหน้าจอบนคอมพิวเตอร์ Local ด้วย PowerShell เพื่อจับภาพ Desktop ปัจจุบัน คุณสามารถใช้ Class .NET Built-in ชื่อ System.Windows.Forms ผมได้สคริปต์ PowerShell ดังนี้:

$Path = "C:\ScreenCapture"
# ตรวจสอบว่า Directory สำหรับเก็บ Screenshot ถูกสร้างแล้ว ถ้ายัง ให้สร้างขึ้นมา
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 Object
$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"
# บันทึก Screenshot เป็นไฟล์ PNG
$image.Save($screen_file, [System.Drawing.Imaging.ImageFormat]::Png)

สคริปต์ PowerShell นี้สร้าง Directory สำหรับเก็บ Screenshot รับความละเอียดหน้าจอปัจจุบัน จับภาพ Workspace ปัจจุบัน และบันทึกเป็นไฟล์ PNG รันสคริปต์และตรวจสอบว่าไฟล์ png ปรากฏใน Directory ที่ระบุ (คุณสามารถระบุ UNC Path ไปยัง Shared Network Folder ได้) พร้อม Screenshot ของ Desktop ของคุณ เพื่อความสะดวก ชื่อไฟล์ PNG จะมีชื่อคอมพิวเตอร์ ชื่อผู้ใช้ วันที่และเวลาปัจจุบัน

หากคุณต้องการเรียกสคริปต์ PS จาก Batch File ให้ใช้คำสั่งนี้ (ในกรณีนี้ คุณไม่ต้องเปลี่ยนแปลง PowerShell Execution Policy):

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

การจับภาพหน้าจอ Desktop ของผู้ใช้ด้วย PowerShell

สำหรับการแก้ไขสคริปต์ PowerShell ผมชอบใช้ Visual Studio Code แทน Powershell ISE

คุณสามารถสร้าง GPO เพื่อวาง Shortcut ของสคริปต์ PowerShell บน Desktop ของผู้ใช้โดเมนทั้งหมด และกำหนด Hotkeys เพื่อเรียกใช้ ตอนนี้ เมื่อมีปัญหาหรือข้อผิดพลาดในแอปใดๆ ผู้ใช้เพียงแค่กด Hotkeys ที่กำหนด แล้ว Screenshot ของ Desktop ผู้ใช้จะปรากฏใน Shared Folder ของ HelpDesk

วิธีจับภาพ Desktop Screenshot จากคอมพิวเตอร์ระยะไกลด้วย PowerShell

งานต่อไปคือการรับ Screenshot ของ Desktop ผู้ใช้บนคอมพิวเตอร์ระยะไกลผ่าน PowerShell อาจเป็นคอมพิวเตอร์ Standalone ที่รัน Windows 10 หรือ RDS Server

วิธีที่แนะนำในการเชื่อมต่อกับ User Desktop บน RDS Server โดยใช้เครื่องมือกราฟิกคือ Shadow RDP Session

หากคุณต้องการรับ Desktop Screenshot จาก RDS Server (หรือ Desktop Windows ที่อนุญาตหลายการเชื่อมต่อ RDP พร้อมกัน) คุณต้องหา User Session 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

หากคุณใช้สคริปต์เพื่อรับ Screenshot จากคอมพิวเตอร์ระยะไกลที่มีผู้ใช้เพียงคนเดียว หมายเลข Session จะเป็น 1 เสมอ แทนที่บล็อกการ Query RDS Server ก่อนหน้าด้วย $usersessID = 1

เพื่อความสะดวก ให้บันทึกไฟล์สคริปต์ PowerShell ไว้ที่ Shared Network Folder แล้วแก้ไขไฟล์ CaptureLocalScreen.ps1 และเปลี่ยนเส้นทางเป็น:

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

User Screenshots จะถูกบันทึกในโฟลเดอร์นี้ ให้สิทธิ์ Write ให้โฟลเดอร์นี้แก่กลุ่มโดเมน Authenticated Users

หลังจากได้ User Session ID แล้ว คุณสามารถเชื่อมต่อกับ User Session แบบ Remote โดยใช้เครื่องมือ PsExec และรันสคริปต์:

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

จากนั้น สมาชิกทีม HelpDesk สามารถรันสคริปต์จากคอมพิวเตอร์ของเขา และ Screenshot ของ Desktop ปัจจุบันของคอมพิวเตอร์ระยะไกลจะปรากฏใน Directory ที่ระบุ