How to find what changed on a Windows server (and when)

A server that worked yesterday is crashing today, or something about it just looks wrong. The first question is always the same: what changed? Here is where to look, the commands that help, and why the manual route only gets you so far.

Event Viewer, PowerShell and Reliability Monitor windows pieced together by hand, beside a single list of changes since the last good scan
Piecing it together by hand, or one comparison.

Start with the timeline

Before running anything, pin down two times: when the problem was first noticed, and the last time everything is known to have worked. Every change between those two points is a suspect; everything outside them probably isn't. Write both down, and keep a note of everything you check.

If you suspect an attack rather than a faulty change, preserve the evidence first: isolate the machine rather than rebooting it, and take a snapshot or forensic scan before you start changing things. Our first-hour checklist covers that in more detail.

1. Reliability Monitor: the quick overview

Windows keeps a day-by-day record of application failures, Windows failures, and software and driver installs. It is the fastest way to see whether something was installed just before the problems started.

perfmon /rel

Its limit: it records only certain kinds of event. It won't show a changed configuration file, a new scheduled task or an edited registry setting.

2. Updates and installed software

Recent updates are a common cause of sudden problems. List installed updates, newest first:

Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 15

Also check Settings > Windows Update > Update history, and the installed programs list sorted by install date, for software that arrived around the same time.

3. Services and drivers

A new or changed service or driver is a frequent cause of both crashes and compromises. Windows logs new services in the System log as event 7045, and changes to how a service starts as event 7040:

Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045,7040} -MaxEvents 30 |
  Select-Object TimeCreated, Id, Message

To see what each service actually runs, and spot anything pointing somewhere unusual:

Get-CimInstance Win32_Service | Select-Object Name, StartMode, PathName | Sort-Object Name

And for drivers:

driverquery /v

4. Auto-starts and scheduled tasks

Programs set to start automatically are where both faulty software and attackers make themselves permanent. Check the common Run keys:

Get-ItemProperty 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Run'
Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run'

And scheduled tasks, looking for unfamiliar names or actions:

Get-ScheduledTask | Where-Object State -ne 'Disabled' |
  Select-Object TaskPath, TaskName, @{n='Action';e={$_.Actions.Execute}}

There are many more auto-start locations than these: Winlogon entries, Image File Execution Options, startup folders and services among them. These two are the most common, not the complete list.

5. Recently changed files

To list files modified in the last two days in a folder:

Get-ChildItem C:\Windows\System32 -File -ErrorAction SilentlyContinue |
  Where-Object LastWriteTime -gt (Get-Date).AddDays(-2) |
  Sort-Object LastWriteTime -Descending

This is useful, but it has three big limits: it is slow across a whole disk, it only shows files that still exist (not deleted ones), and it trusts the timestamps Windows reports, which an attacker can backdate. A file whose timestamps were faked won't appear at all.

6. Accounts, logons and cleared logs

If the change might not be accidental, check the Security log for accounts created (event 4720), accounts added to administrator groups (event 4732), remote desktop logons (event 4624 with logon type 10) and, most tellingly, the Security log being cleared (event 1102):

Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4720,4732,1102} -MaxEvents 30 |
  Select-Object TimeCreated, Id, Message

If the logs were cleared or auditing was switched off, these checks come back empty, and an empty result looks just like "nothing happened".

Why the manual route only gets you so far

The fix is to have a record of the machine from before the problem, and compare against it.

Where Tracknosis fits

Tracknosis is a lightweight agent for Windows that does that comparison for you. It reads every file and registry record directly from the disk, compares each scan with the last, and gives you one list of what changed, when, and how risky it is:

Find what changed in minutes, not hours

Request a guided trial: we install Tracknosis with you on one of your Windows machines and walk you through your first results.

Request a guided trial Get the first-hour checklist