Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

PowerShellでユーザーのデスクトップ画面をリモートでキャプチャする方法

ヘルプデスクのサポートチームから、リモートコンピューター上のユーザーデスクトップのスクリーンショットを素早く取得できるPowerShellスクリプトの作成を依頼されました。主な条件は、ヘルプデスク担当者がSCCM、リモートアシスト、RDPセッションシャドウイングなどのグラフィカルなリモートサポートツールを使ってユーザーのPCに接続してはいけない、という点です。

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ファイルが作成されることを確認してください。利便性のため、PNGファイル名にはコンピューター名、ユーザー名、日時が含まれるようになっています。

バッチファイルからPSスクリプトを呼び出したい場合は、次のコマンドを使用します(この場合、PowerShellの実行ポリシー設定を変更する必要はありません)。

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

PowerShellスクリプトの編集には、PowerShell ISEよりもVisual Studio Codeを使用するのがおすすめです。

さらに、GPO(グループポリシー)を作成すれば、ドメイン内のすべてのユーザーのデスクトップにこのPowerShellスクリプトへのショートカットを配置し、呼び出し用のホットキーを割り当てることもできます。こうしておくと、アプリで問題やエラーが発生した際、ユーザーは割り当てられたホットキーを押すだけでよく、そのユーザーのデスクトップのスクリーンショットが自動的にヘルプデスクの共有フォルダーへ送信されます。

PowerShellでリモートコンピューターのデスクトップスクリーンショットを取得するには?

次のタスクは、PowerShell経由でリモートコンピューター上のユーザーデスクトップのスクリーンショットを取得することです。対象はWindows 10のスタンドアロンPCでも、RDSサーバーでも構いません。

なお、グラフィカルツールでRDSサーバー上のユーザーデスクトップに接続する場合の推奨方法は、Shadow RDPセッションです。

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"

これで、ヘルプデスク担当者は自分のコンピューターからスクリプトを実行できるようになり、リモートコンピューターの現在のデスクトップのスクリーンショットが指定されたディレクトリに自動的に保存されます。

  1. Macでスクリーンショットを撮る方法 – キーボードショートカットで画面キャプチャを簡単に作成

    Macでは、ほんの数回のキー入力だけで、画面の一部または全体を簡単にキャプチャできます。 スクリーンショットはさまざまな場面で活躍します。たとえばブログ記事を書いているとき、自分の主張を分かりやすく伝える画像を使いたい場合などに非常に便利です。 このガイドでは、シンプルかつスピーディーなキーボードショートカットを使ってスクリーンショットを撮る方法を紹介します。 さらに記事の最後には、画面キャプチャの選択肢をぐっと広げてくれる便利な機能もご紹介します。 それでは始めましょう! Macでスクリーンショットを撮る基本の方法 Macでスクリーンショットを撮るには、次のキーを同時に押し続けます:Comm

  2. Macでスクリーンショットを撮る方法!覚えておきたいキーボードショートカット完全ガイド

    WindowsからMacに乗り換えたばかりの方は、Macでのスクリーンショットの撮り方に戸惑うかもしれません。確かに、MacのキーボードにはPrint Screenキーがありません。しかし、代わりに使えるキーボードショートカットがいくつも用意されています。正しいショートカットを使えば、画面全体、単一のウィンドウ、あるいは画面の一部だけを自由にキャプチャできます。 macOS Mojave以降にアップグレードしている場合は、「スクリーンショット」アプリを使って画面のさまざまな部分をキャプチャしたり、画面の動画録画まで行えます。このアプリは「アプリケーション」フォルダ内の「ユーティリティ」セクシ