WindowsのRDP接続履歴をCSVに出力する方法|レジストリ(Servers/Default)をPowerShellで一覧化

Windowsでリモートデスクトップ(RDP)を使っていると「以前接続したIP/ホスト名を一覧で取り出したい」と思う場面があります。接続先はレジストリに残るため、PowerShellで列挙してCSVに出力すれば、棚卸しや監査、移行作業が一気に楽になります。

目次

RDP接続履歴はどこに残る?(Servers と Default の違い)

リモートデスクトップ接続(mstsc.exe)の履歴は、主に現在ログオンしているユーザーのレジストリ(HKCU)に保存されます。接続先を“一覧”で取り出すなら、まず押さえておきたいのが次の2か所です。

保存場所主な役割中身の例向いている用途
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers接続先ごとの情報(サーバー単位)サブキー名が接続先(IP/ホスト名)。値として UsernameHint など過去に接続したことがある接続先の棚卸し、ユーザー名ヒントの抽出
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default直近の接続先(MRU)MRU0, MRU1… といった値に接続先が入る「最後に接続した順」で直近の履歴を見たい(MRUリスト)
%USERPROFILE%\Documents\Default.rdp(環境により存在)最後に使った設定の保存full address:s:host:port、username:s:DOMAIN\user などレジストリに出ない“直前の設定”を確認したい

この記事では、質問にある Servers 配下(接続先のサブキー名がIP/ホスト名) を中心に、PowerShellでCSVへ出力する手順を整理します。必要に応じて Default(MRU) の抽出も紹介します。

目的別:どの履歴をどの方法で取る?(早見表)

「欲しいのが全件なのか、直近なのか」で見る場所が変わります。迷ったら、まずは Servers をCSV化しておくのが鉄板です。

目的参照先おすすめ出力備考
過去に接続したことがある接続先を網羅したいServers接続先(IP/ホスト名)の一覧CSVサブキー名が接続先。順序は保証されないので並べ替え推奨
どのユーザー名で接続していたかも見たいServers接続先 + UsernameHint のCSV保存されていない場合は空欄。環境差あり
「最近接続した順」で数件だけ欲しいDefault(MRU)MRU0〜の一覧CSV直近の参考。サーバー単位の詳細は持たない
棚卸し用に全部まとめて管理したいServers + Default統合CSV(Source列付き)重複は出てOK(出所を残す)か、一意化するか用途で選択

前提:この方法で取れる履歴・取れない履歴

  • 取れる:mstsc.exe を使って接続した先のうち、レジストリに記録された接続先(IP/ホスト名)
  • 取れる:Servers配下に保存されていれば、接続に使ったユーザー名ヒント(UsernameHint)
  • 取れない:厳密な「接続日時」「最終接続時刻」(レジストリに明確な時刻が無い/環境差が大きい)
  • 注意:Microsoft Store版の「Microsoft Remote Desktop」や「Windows App」等を使っている場合、保存場所が異なることがあります(本記事はmstsc.exe前提)

PowerShellでRDP接続先(IP/ホスト名)をCSVに出力する

Servers配下のサブキー名が接続先になっているため、PowerShellでキーを列挙してCSVに出力するのが最短です。まずは出力先フォルダを用意しておくとトラブルが減ります。

出力先フォルダを作成(例:C:\temp)

New-Item -ItemType Directory -Path "C:\temp" -Force | Out-Null

IP(接続先)だけをCSVに出力する例

質問のとおり、PSChildName を出力すればサブキー名(=接続先)が列として出せます。

$exportfile = "C:\temp\RDPhistory.csv"
$RDPhistory = Get-ChildItem "HKCU:\SOFTWARE\Microsoft\Terminal Server Client\Servers"
$RDPhistory |
  ForEach-Object { Get-ItemProperty $_.PsPath } |
  Select-Object PSChildName |
  Export-Csv -Path $exportfile -NoTypeInformation

補足:RDPでポートを指定している場合、接続先が server:3390 のように「ホスト名:ポート」の形で保存されることもあります。キー名をそのまま拾うため、CSVにも同じ形で出力されます。

UsernameHint(接続に使ったユーザー名)も一緒にCSVへ出力する

Servers配下の各サブキーには、環境によって UsernameHint が保存されます。例えば「DOMAIN\user」や「user@domain」などが入ることが多く、どのアカウントで接続していたか の手がかりになります。

$exportfile = "C:\temp\RDPhistory_with_user.csv"
$RDPhistory = Get-ChildItem "HKCU:\SOFTWARE\Microsoft\Terminal Server Client\Servers"
$RDPhistory |
  ForEach-Object { Get-ItemProperty $_.PsPath } |
  Select-Object PSChildName, UsernameHint |
  Export-Csv -Path $exportfile -NoTypeInformation

ポイントは次のとおりです。

  • PSChildName:レジストリのサブキー名(=接続先IP/ホスト名)
  • UsernameHint:保存されていれば接続ユーザー名のヒント(空の場合もあります)

実務向け:列名を整えて、文字コードも指定して出力する(おすすめ)

そのままでも動きますが、実務では「列名が分かりやすい」「ソートされている」「Excelで文字化けしにくい」形式が喜ばれます。以下は改善版の例です(読み取り専用 で安全に実行できます)。

$outDir = "C:\temp"
New-Item -ItemType Directory -Path $outDir -Force | Out-Null

$base = "HKCU:\Software\Microsoft\Terminal Server Client\Servers"
$exportFile = Join-Path $outDir "RDP_Servers_History.csv"

if (Test-Path $base) {
  Get-ChildItem $base | ForEach-Object {
    $p = Get-ItemProperty $_.PsPath
    [pscustomobject]@{
      Server       = $_.PSChildName
      UsernameHint = $p.UsernameHint
    }
  } |
    Sort-Object Server |
    Export-Csv -Path $exportFile -NoTypeInformation -Encoding UTF8
} else {
  Write-Warning "RDP履歴(Servers)が見つかりません: $base"
}

出力されるCSVのイメージ

Server,UsernameHint
10.0.0.10,DOMAIN\admin
fileserver01,corp\user01
rdp-gw.example.local,[email protected]

直近の接続先(MRU)も欲しい場合:Defaultキーから抽出する

「過去に一度でも接続した先」ではなく「最近使った順で数件欲しい」という場合は、...\Terminal Server Client\Default のMRUを抽出します。ここには MRU0、MRU1… といった値で接続先が入ります。

$outDir = "C:\temp"
New-Item -ItemType Directory -Path $outDir -Force | Out-Null

$defaultKey = "HKCU:\Software\Microsoft\Terminal Server Client\Default"
$exportFile = Join-Path $outDir "RDP_MRU_History.csv"

if (Test-Path $defaultKey) {
  $p = Get-ItemProperty $defaultKey

  $p.PSObject.Properties |
    Where-Object { $_.Name -match "^MRU\d+$" } |
    ForEach-Object {
      [pscustomobject]@{
        Order  = [int]($_.Name -replace "MRU","")
        Server = [string]$_.Value
      }
    } |
    Sort-Object Order |
    Export-Csv -Path $exportFile -NoTypeInformation -Encoding UTF8
} else {
  Write-Warning "RDP履歴(Default)が見つかりません: $defaultKey"
}

MRUは「最近使った順」を表すことが多いですが、環境や利用状況によって並びが想定と異なることもあります。棚卸し用途なら Servers と併用し、MRUは“直近の参考” として扱うのが安全です。

ServersとMRUをまとめて1つのCSVにする(管理用の一覧に便利)

監査や移行のときは「Servers(過去の接続先全体)」と「MRU(最近の接続先)」を一つにまとめておくと、作業メモとして使いやすくなります。次の例は、出所(Source)列を付けて1ファイルに統合します。

$outDir = "C:\temp"
New-Item -ItemType Directory -Path $outDir -Force | Out-Null
$exportFile = Join-Path $outDir "RDP_History_All.csv"

$items = @()

# Servers(接続先単位)
$serversKey = "HKCU:\Software\Microsoft\Terminal Server Client\Servers"
if (Test-Path $serversKey) {
  $items += Get-ChildItem $serversKey | ForEach-Object {
    $p = Get-ItemProperty $_.PsPath
    [pscustomobject]@{
      Source       = "Servers"
      Order        = ""
      Server       = $_.PSChildName
      UsernameHint = $p.UsernameHint
    }
  }
}

# Default(MRU)
$defaultKey = "HKCU:\Software\Microsoft\Terminal Server Client\Default"
if (Test-Path $defaultKey) {
  $p = Get-ItemProperty $defaultKey
  $items += $p.PSObject.Properties |
    Where-Object { $_.Name -match "^MRU\d+$" } |
    ForEach-Object {
      [pscustomobject]@{
        Source       = "MRU"
        Order        = [int]($_.Name -replace "MRU","")
        Server       = [string]$_.Value
        UsernameHint = ""
      }
    } |
    Sort-Object Order
}

$items |
  Sort-Object Source, Server |
  Export-Csv -Path $exportFile -NoTypeInformation -Encoding UTF8

「同じ接続先が重複して出る」ことは普通にあります。重複を許容して“出所の違い”を残すか、Sort-Object Server -Unique で一意化するかは、用途に合わせて選んでください。

別解:コマンドプロンプトでレジストリをテキスト出力(簡易)

PowerShellが使えない/使いたくない場合は、コマンドプロンプト(またはバッチ)でレジストリを出力する方法もあります。ただし、reg exportは「.reg形式」を吐き出すコマンドです。拡張子を.txtにしても中身はレジストリ書き出し形式なので、CSV化や整形には向きません。

reg exportで“吐き出すだけ”の例(質問にある形)

reg export "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Terminal Server Client\Servers" C:\temp\exportip.txt && type C:\temp\exportip.txt | findstr /i "key"

上の例は“まずファイルに落とす”という意味では手軽ですが、検索ワードは環境によってヒットしないことがあります。キー行を拾いたいなら、次のようにパス文字列で絞るほうが分かりやすいです。

reg export "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Terminal Server Client\Servers" C:\temp\exportip.reg /y && type C:\temp\exportip.reg | findstr /i /c:"Terminal Server Client\Servers"

reg queryで一覧表示する(画面/ログ用途)

reg query "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Terminal Server Client\Servers"

とはいえ“接続先だけを抜き出す”“CSVに整形する”まで自動化するなら、やはりPowerShellが一番確実です。監査・棚卸しのように再現性が求められる作業では、CSV出力までスクリプト化しておくのが安心です。

よくあるつまずきと対処

Serversキーが存在しない/空っぽだった

  • まだ一度もmstsc.exeで接続していない場合、履歴が作られていないことがあります。
  • 会社端末などで履歴の保存が制限されていたり、クリーナー/ポリシーで削除されている場合もあります。
  • 「Windows App」「Microsoft Remote Desktop」など別のクライアントを使っていると、そもそも Terminal Server Client 配下に残らないことがあります。

CSVをExcelで開くと文字化けする

  • PowerShellのバージョンや環境によって、CSVの既定エンコーディングが異なります。
  • 対策として、スクリプト側で -Encoding UTF8 を指定してください。
  • それでもうまくいかない場合は、Excelの「データ」→「テキスト/CSVから」で読み込み、文字コードを指定すると安定します。

ユーザー名が出ない(UsernameHintが空)

  • 接続時にユーザー名を保存していない、または別の方法(.rdpファイル等)で接続していると空になることがあります。
  • 接続先は分かっているので、棚卸し用途としては十分役に立ちます。ユーザー名も必要なら、MRUやDefault.rdpも合わせて確認してください。

この情報はどのユーザーの履歴?

ここで扱っているレジストリは HKCU(現在ログオン中のユーザー) の履歴です。別ユーザーの履歴が必要なら、そのユーザーでログオンして同じスクリプトを実行するのが基本です。

運用メモ:履歴を扱うときの注意点

  • RDP接続先のホスト名やIPは、社内ネットワーク構成の情報になり得ます。CSVを共有する場合は取り扱い範囲を明確にし、必要ならマスキングしてください。
  • UsernameHintには個人名やメールアドレスが含まれることがあります。監査目的であっても、最小限の共有に留めるのが安全です。
  • 本記事の手順は「読み取り(抽出)」のみですが、レジストリを編集・削除する場合はバックアップを取ってから実施してください。

まとめ:RDP履歴の一覧化はPowerShellが最短

RDP接続履歴(接続先のIP/ホスト名)は、HKCU:\Software\Microsoft\Terminal Server Client\Servers にサブキーとして残ります。PowerShellでサブキーを列挙し、必要なら UsernameHint も合わせてCSVへ出力すると、棚卸し・移行・監査の“証跡”として扱いやすくなります。直近の履歴が欲しい場合は ...\Default のMRUも合わせて抽出すると、さらに実務で使える一覧になります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次