About 20 years ago, after I found out that registry keys had last modified timestamps, I wrote a tool in C++ called regrecent which showed keys that had been modified in a given time window. If you can still find it, this tool does work today although being 32 bit will only show changes in Wow6432Node on 64 bit systems.
Whilst you might like to use Process Monitor, and before that regmon, or similar, to look for registry changes, that approach needs you to know that you need to monitor the registry so what do you do if you need to look back at what changed in the registry yesterday, when you weren’t running these great tools, because your system or an application has started to misbehave since then? Hence the need for a tool that can show you the timestamps, although you can actually do this from regedit by exporting a key as a .txt file which will include the modification time for each key in the output.
The PowerShell script I wrote to replace the venerable regrecent.exe, available here, can be used in a number of different ways:
The simplest form is to show keys changed in the last n seconds/minutes/hours/days/weeks/years by specifying the number followed by the first letter of the unit. For example, the following shows all keys modified in the last two hours:
.\Regrecent.ps1' -key HKLM:\System\CurrentControlSet -last 2h
We can specify the time range with a start date/time and an optional end date/time where the current time is used if no end is specified.
.\Regrecent.ps1' -key HKLM:\Software -start "25/01/17 04:05:00"
If just a date is specified then midnight is assumed and if no date is given then the current date is used.
We can also exclude (and include) a list of keys based on matching a regular expression to filter out (or in) keys that we are not interested in:
.\regrecent.ps1 -key HKLM:\System\CurrentControlSet -last 36h -exclude '\\Enum','\\Linkage'
Notice that we have to escape the backslashes in the key names above because they have special meaning in regular expressions. You don’t need to specify backslashes but then the search strings would match text anywhere in the key name rather than at the start (which may of course be what you actually want).
To specify a negation on the time range, so show keys not changed in the given time window, use the -notin argument.
If you want to capture the output to a csv file for further manipulation, use the following options:
.\regrecent.ps1 -key HKCU:\Software-last 1d -delimiter ',' -escape | Out-File registry.changes.csv -Encoding ASCIII
I hope you find this as useful as I do for troubleshooting.