🔧 Recipe · Troubleshooting & Diagnostics
Diagnose a Slow Windows Workstation
Systematically identify and resolve performance issues on an end-user Windows PC
Complexity
Intermediate
Impact
troubleshooting + endpoint + performance + windows + helpdesk
Context
Why This Matters
Slow workstation complaints are one of the most common helpdesk tickets. The root cause can range from trivial (too many browser tabs, pending updates) to serious (failing disk, malware, memory leak in a line-of-business app). A structured diagnostic approach saves time, avoids unnecessary re-imaging, and produces evidence you can share with the user or escalate to vendor support.
Run this recipe when:
- A user reports their PC is slower than usual today or over the past few days.
- Login, boot, or application launch times have noticeably increased.
- Fans are running loudly, the machine feels hot, or Task Manager shows sustained high CPU/disk/memory.
This recipe focuses on Windows 10/11 workstations managed in a corporate environment. It collects telemetry first, analyzes bottlenecks second, and recommends remediation last — so you never apply a fix before you understand the cause.
Expected Outcomes
After completing this recipe you will have:
- A snapshot of current CPU, memory, disk, GPU, and network utilization.
- A list of the top resource-consuming processes and startup apps.
- Disk health (SMART) status and free-space assessment.
- Recent Windows Update, driver, and reliability history.
- Malware / Defender scan results.
- A documented root cause (or a clear escalation path if hardware is suspect).
- Applied remediation and a verification that performance is restored.
Risks & Considerations
Warnings & Gotchas
- Don't reboot before collecting data. A reboot clears the evidence (running processes, event logs in memory, Task Manager history). Always snapshot first.
- Don't run aggressive "cleaners" or registry tools. They rarely fix real issues and often break managed configurations (GPO, Intune policy, AV exclusions).
- Beware of privacy. Process lists may reveal personal apps. Get user consent before remote sessions and avoid screenshotting personal content.
- SMART "OK" is not a guarantee. A drive can be failing even if SMART reports healthy. If disk latency is sustained above 50 ms, treat the drive as suspect.
- High memory use is not always bad. Windows deliberately fills RAM with cache. Focus on committed memory and paging activity, not just "% used."
- Compliance: If you find unauthorized software or signs of compromise, follow your incident-response policy before taking further action.
Required Permissions
| Permission | Why It's Needed |
|---|---|
| Local Administrator on the workstation | Required to read performance counters, query WMI/CIM, run Defender scans, and install updates. |
| Remote PowerShell (WinRM) or Intune device action rights | Needed to run diagnostics remotely without interrupting the user. |
| Microsoft Defender for Endpoint: Security Reader (optional) | To correlate the device's recent alerts, vulnerabilities, and device health. |
| Intune: DeviceManagementManagedDevices.Read.All (optional) | To pull device compliance, hardware inventory, and last sync status via Graph. |
The fastest way to get this done: just ask Dex. Copy the prompt below and paste it into your Dex conversation.
For IT Admins
Paste into Dex Pro
For End Users
How an employee would ask Dex for help
Step 1 — Interview the user (2 minutes)
Before touching the machine, ask:
- When did it start? (today / gradually / after an update)
- What's slow specifically? (boot, login, one app, everything)
- Any recent changes? (new software, VPN, docking station)
Step 2 — Open Task Manager and capture the baseline
Press Ctrl+Shift+Esc on the user's machine (or via a remote session).
- Click More details if collapsed.
- On the tab, sort by CPU, then Memory, then Disk. Note the top 3 in each.
- Switch to the tab and screenshot CPU, Memory, Disk, and Network graphs.
- Open the tab and note anything with High impact.
Step 3 — Check Resource Monitor for disk queue and latency
- Click Open Resource Monitor at the bottom of Task Manager's Performance tab.
- Go to the tab. Look at Response Time (ms). Sustained values over 25 ms indicate a bottleneck; over 100 ms suggests a failing drive.
Step 4 — Review Reliability Monitor for recent crashes
Run perfmon /rel from Start. Look for clusters of red X's in the last 7 days — these often reveal the trigger (driver, app crash, update).
Step 5 — Check disk health and free space
- Open . Ensure the system drive has at least 15% free.
- Open an elevated PowerShell and run
Get-PhysicalDisk | Select FriendlyName, MediaType, HealthStatus, OperationalStatus.
Step 6 — Verify Windows Update and driver status
Go to . Install pending updates. Then check for yellow warning icons.
Step 7 — Run a Microsoft Defender quick scan
Open . Escalate to a full scan if anything is found.
Step 8 — Remediate based on findings
- High CPU from a specific process: update or reinstall the app; check for a known bug.
- Memory pressure: close heavy apps; check if the machine meets the app's minimum RAM; consider a hardware upgrade.
- High disk latency + HDD: recommend SSD upgrade or device replacement.
- Too many startup apps: disable High-impact items the user doesn't need at boot.
- Malware detected: follow IR policy.
- Nothing obvious: reboot, then recheck. If it returns, collect a WPR trace and escalate.
Step 9 — Verify and document
Have the user try the slow workflow again. Record the root cause, remediation, and any follow-up (e.g., scheduled SSD upgrade) in the ticket.
Using Microsoft Graph to pull device context
Graph doesn't expose live performance counters, but it does provide the device posture signals an admin needs before remoting in: hardware specs, compliance state, last sync, pending updates, and Defender alerts. Combine these with the local diagnostics in the script section.
1. Get the managed device record
GET https://graph.microsoft.com/v1.0/deviceManagement/managedDevices?$filter=deviceName eq '{deviceName}'Response includes: osVersion, totalStorageSpaceInBytes, freeStorageSpaceInBytes, physicalMemoryInBytes, complianceState, lastSyncDateTime, id.
2. Get pending / failed updates for the device
GET https://graph.microsoft.com/beta/deviceManagement/managedDevices/{id}/windowsProtectionStateReturns real-time Defender state: signature version, last scan time, real-time protection enabled, and tamper protection status.
3. Get Defender for Endpoint alerts (if licensed)
GET https://graph.microsoft.com/v1.0/security/alerts_v2?$filter=contains(evidence/any(e: e/deviceName), '{deviceName}')&$top=254. Trigger a remote Defender quick scan
POST https://graph.microsoft.com/v1.0/deviceManagement/managedDevices/{id}/windowsDefenderScan
Content-Type: application/json
{
"quickScan": true
}5. Sync the device to pull latest policy / updates
POST https://graph.microsoft.com/v1.0/deviceManagement/managedDevices/{id}/syncDeviceAuth: Use an app registration with DeviceManagementManagedDevices.Read.All, DeviceManagementManagedDevices.PrivilegedOperations.All, and SecurityAlert.Read.All. Acquire a token via client-credentials flow and pass it as Authorization: Bearer {token}.
PowerShell diagnostic walkthrough
The downloadable script below runs a full diagnostic sweep. Here's what each section does and why:
Top processes by CPU, memory, and disk
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name, Id, CPU, WorkingSet64Shows the heaviest CPU consumers. Repeat sorting on WorkingSet64 for memory.
Disk health via SMART
Get-PhysicalDisk | Select-Object FriendlyName, MediaType, HealthStatus, OperationalStatus
Get-StorageReliabilityCounter -PhysicalDisk (Get-PhysicalDisk) | Select DeviceId, Temperature, ReadLatencyMax, WriteLatencyMaxFree disk space
Get-Volume | Where-Object DriveLetter | Select DriveLetter, FileSystemLabel,
@{n='FreeGB';e={[math]::Round($_.SizeRemaining/1GB,1)}},
@{n='FreePct';e={[math]::Round(($_.SizeRemaining/$_.Size)*100,1)}}Startup items and their impact
Get-CimInstance Win32_StartupCommand | Select Name, Command, Location, UserRecent reliability events (crashes, app hangs)
Get-WinEvent -LogName Application -MaxEvents 200 |
Where-Object { $_.LevelDisplayName -in 'Error','Critical' } |
Select TimeCreated, ProviderName, Id, Message -First 20Pending reboots and updates
Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired'Defender status
Get-MpComputerStatus | Select AMServiceEnabled, RealTimeProtectionEnabled,
AntivirusSignatureLastUpdated, QuickScanEndTime, FullScanEndTimeRun Start-MpScan -ScanType QuickScan if the last scan is stale.
Running the full script
Save the script below as Invoke-WorkstationDiagnostics.ps1. Run it elevated, locally or via Invoke-Command against a remote machine:
Invoke-Command -ComputerName PC-0123 -FilePath .\Invoke-WorkstationDiagnostics.ps1 -Credential (Get-Credential)The script writes a timestamped report to C:\Temp\ that you can attach to the ticket.
Next steps