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も合わせて抽出すると、さらに実務で使える一覧になります。

コメント