TL;DR

Everyone names five sources of execution evidence. There are thirteen classes.

Ask a SOC analyst which sources show that code ran and the answer is nearly always Sysmon 1, Security 4688, Prefetch and maybe Amcache. None of it is wrong, and it is five artifacts. This reference groups 157 event IDs, counted per channel, and 14 on-disk artifacts into thirteen classes by the question each source answers: was a process created, what did it do, what did it connect to, which script ran, what installed or persisted it, what a security control decided, what crashed, what the system inventoried, and who moved to this machine.

On a real host with no agent and no tuned audit policy, the sources nobody queries are often the only ones left. Three rules carry the method. Grade the channel and the provider and never the bare event ID, because Application 1000 is a crash under one provider and an attacker-controlled string under another. Tag every source by availability. Treat an absent source as a collection gap and not as a clean result. Collect the default-on, durable sources first, because they survive a cleared log.

Most SOC analysts I have interviewed or worked with stop after a few very well known event IDs or sources of execution evidence. Judging by the speed of the answer you can usually tell which ones come from personal experience and which come from a distant memory of a SANS poster or something similar.

The list is nearly always the same: Sysmon event ID 1, Security 4688, Prefetch, maybe Amcache. None of it is wrong.

It is also five artifacts, and the tables below list 157 event IDs, counted per channel, and 14 on-disk artifacts that bear on whether code ran. The gap is not trivia. On a real host, with no agent and no tuned audit policy, several of the sources nobody queries are the only ones still present.

This is the full enumeration, grouped the way I use it in an investigation. It is a reference rather than an argument, so it is long. The short version is the TL;DR above and the Key takeaways at the end.

How the classes are grouped

Not by which log a source lives in. By the question the source answers about execution. That is why Security 4688 and Sysmon 1 sit in the same class despite living in different logs and needing entirely different setup: they answer the same question, which is whether a process was created.

A source earns a place only if it anchors to a process, a path, or a command. Anchoring makes it attributable, not proof of a run: some sources below record execution, others an attempt, an installation or context, and the last column of each table says which.

Attestation strength and availability are tags on each source, not groupings. Keeping them as tags is what lets the classes stay clean.

The two rules that sit over all of it

Grade the channel and the provider, never the bare event ID. Application event 1000 is a crash under the Application Error provider and an attacker-controlled free-text string under the .NET Runtime provider. The number on its own tells you nothing. The unit of meaning is channel plus provider plus ID.

An absent source is a collection gap, not a clean result. If the channel was off, rolled, or never collected, the honest phrasing is low-confidence-clean with the gap named. Silence is a statement about your telemetry.

Availability: know what you have before you claim scope

Every source below carries one of four tags. This is the difference between a source you can count on and one you are hoping for.

TagMeaningAvailableWhat it containsWhat it proves
Defaulton by defaultDEFAULTPresent on a host nobody preparedThe backbone of a real investigation. Pull these first.
Configaudit or logging onCONFIGRequires an audit policy or a logging settingHigh value where enabled, absent where nobody thought about it.
Deployagent or policyDEPLOYRequires Sysmon, EDR, AppLocker or WDACThe best field fidelity available, and the least likely to be there.
Livereal-time onlyLIVEETW trace sessions and vendor consolesNothing after the fact unless a session was already running.

Attestation: what each source proves about a run

The Grade column says how directly a source shows that the named program executed. Where one row holds event IDs of different strength, the cell gives both.

GradeMeaningExample
AThe process start is recorded directlySysmon 1, Security 4688, Task Scheduler 129
BA necessary consequence of execution: the program had to run for this to existPrefetch, Application Error 1000, a Sysmon network connection
CConsistent with execution, but explainable without itJump Lists, a compatibility shim record, an AppLocker allow in audit mode
DPresence, installation, an attempt or context, not a runAmcache, ShimCache, service install 7045, a blocked launch

The grade belongs to the record, not to the mechanism behind it. The test for A is who wrote the record and when: the component that started the program, at the moment it started it, naming what it started. Sysmon 1 and Security 4688 come from process creation itself, Task Scheduler 129 and 200 from the scheduler as it launches a task’s action, Shell-Core 9707 from Explorer as it runs a startup command. For a script, the engine recording the code it is running meets the same test, which is why PowerShell 4103 and 4104 are A while 400, written by the engine about its own start, is B.

B is a record that exists only because the program ran, without being the start record: a crash, a Prefetch file, a network connection, a task action that completed, a process that ended. C is a record that execution would produce but something else could produce too. D shows something around the program, its presence, installation, an attempt or a block, and not a run.

Scheduled tasks and services show why the record decides. When the Task Scheduler launches an action it writes 129, with the image path and the process ID, so a task’s run reaches A on default logging. The Service Control Manager writes no such record for a service: its default events are installation (7045), configuration changes (7040) and failures (7000, 7009, 7023, 7031, 7034). The state-change event 7036 is documented, but on a Windows 11 26H2 host 26 days of System log held 676 Service Control Manager events and not one 7036. On a host without Security 4688 or Sysmon, a service that started cleanly and never failed leaves no default event-log record that it ran: its grade stops at B through a crash, or at D through its installation.

A grade says what one record proves on its own. Corroboration strengthens the conclusion, not the grade: Prefetch, BAM and Amcache together make a strong case for a run, and each keeps its own letter.

Class 1: direct process creation

The most direct evidence there is. Something recorded that a process came into existence. Read every create together with its command line and its parent, because a create with no ancestry is half a finding.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
Sysmon/Operational1, 5DEPLOYA (1), B (5)Image, CommandLine, hashes, parent image and parent command line, user, integrity level, ProcessGuidA process started and what launched it. Pair 1 with 5 for the lifetime.
Security4688, 4689, 4696CONFIGA (4688), B (4689, 4696)NewProcessName, PID, creator PID, token elevation, SID. Command line only with command-line auditing onThe same event with less in it. 4689 pairs by PID for runtime; 4696 records a primary token being assigned to a process.
Kernel-Process (ETW)1, 2LIVEA (1), B (2)Native ProcessStart and ProcessStopReal time only. Nothing to install, and almost never there after the fact.
Shell-Core9707, 9708, 62408, 62409DEFAULTA (9707, 62408), B (9708, 62409)Run, RunOnce and autostart command started then finished, with exe and PIDA default-on process-creation record most people never query.
AppModel-Runtime201DEFAULTACreated process N for a packaged app: PID, app, packageExecution of packaged and UWP applications.
EDR telemetryvendorDEPLOYAProcess, command line, hashes, parent chain, signer, userSysmon-grade detail with retention off the host, which on a long dwell case is often all that survives.

Shell-Core is the one I would point at. It is on by default, it names the executable and the PID, and it is absent from almost every answer I hear.

Class 2: what the live process did

Creation proves a launch. Sysmon is a strong source for what came after: most of its events carry the ProcessGuid of the process that caused them, so modules, files, registry changes and connections tie back to that launch. Sysmon is far more than event 1, and a poor configuration either drowns these in noise or omits them entirely.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
Sysmon7, 8, 10, 25DEPLOYBModules loaded with signature status, remote threads, handles into other processes with the GrantedAccess mask, and process tamperingWhat the process did to other processes and which code it loaded. The leads for sideloading, injection, LSASS access and hollowing, each read with the source process before it becomes a finding.
Sysmon2, 9, 11, 15, 23, 26DEPLOYBFile creates and stream hashes, creation-time changes, raw disk reads and file deletionsWhat the process did on disk: drops and staging, Mark of the Web, reads past file locks, timestamp changes and cleanup. Installers and sync clients produce most of these too, so the process decides it.

GrantedAccess on event 10 is the single field I would keep if I could keep only one. Read with the source image, it separates a process opening a handle to LSASS for a legitimate reason from one reading credentials out of it.

The persistence and command-and-control side

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
Sysmon12, 13, 14, 17, 18, 19, 20, 21DEPLOYBRegistry keys and values, named pipes created and connected, WMI event filter, consumer and bindingWhat the process set up to run again or to talk to others. Run keys, IFEO and COM hijacks land in 13, WMI subscriptions in 19 to 21, and pipe names are hunting clues for command-and-control frameworks.
Program-Telemetry500, 505DEFAULTCCompatibility fix applied to an executable, naming the fixThe application-side record of a compatibility fix being applied. Kernel-ShimEngine 3 and 4 record shims on drivers and devices, not applications.

Class 3: process to network and DNS

Two ways to attribute a connection to a process. Sysmon by deployment, the Windows Filtering Platform by audit policy. On a host without Sysmon, WFP is the only native process-to-network map you have.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
Sysmon3, 22DEPLOYBProcess, destination IP and port, resolved hostname, DNS query and resultsThe cleanest process-to-network attribution available.
Security (WFP)5156, 5157CONFIGBConnection permitted or blocked, with Process ID and application pathJoins to 4688 by Process ID, after converting: 4688 writes the PID in hex and 5156 in decimal. PIDs are reused, so join on host, PID and a bounded time window.
Security (WFP)5154, 5155CONFIGBAn application permitted or blocked from listening on a portThe backdoor and C2-listener tell, and low volume.
Security (WFP)5158, 5159CONFIGBBind to a local port, naming process and portPrecedes a listen.
Windows Firewall2004, 2005, 2006CONFIGBRule added, changed or deleted, including the modifying applicationAttacker firewall changes surface here by name. It shows the modifying application ran; the rule itself shows nothing more.

WFP is a firehose, thousands of events a minute on a domain controller. Collect it selectively. 5154 for listens and 5157 for blocks are the high-value, low-volume picks.

Class 4: script and command

PowerShell lives in two logs and you need both. The classic log tells you how PowerShell was launched and whether it arrived over WinRM. The operational log tells you what the script did. Query one and you get a quiet answer that is wrong.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
Windows PowerShell (classic)400, 403DEFAULTBEngine start and stop. HostApplication carries the invocation lineThe launch line, including cmd.exe, %COMSPEC% and -enc. HostName of ServerRemoteHost means it arrived remotely.
Windows PowerShell (classic)600DEFAULTBProvider lifecycleProvider WSMan Is Started is the remoting and lateral-movement tell.
Windows PowerShell (classic)800CONFIGAPipeline execution details, HostApplication, userInvocation detail, only with module logging on. A default session writes 400, 403 and 600, and no 800.
PowerShell/Operational4104CONFIGAScript block logging: the decoded blockThe deobfuscated command transcript, which is the one people know.
PowerShell/Operational4103, 4105, 4106CONFIGAModule logging, script block start and stopCommand invocation with parameters, and execution timing.
PowerShellCore/Operational4103, 4104DEPLOYAThe same IDs in a separate log for PowerShell 7pwsh does not write to the 5.1 logs. Query both or miss it entirely.
VBScript (Application)4096DEFAULTBVBScript engine invokedA .vbs ran. Deprecated, so worth a look when it appears.

WMI

WMI is a favorite for remote execution and for fileless persistence, and both land in one operational log that is on by default.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
WMI-Activity/Operational5857DEFAULTBProvider loaded, with its on-disk pathProvider hijacking.
WMI-Activity/Operational5858DEFAULTBOperation failure with ClientMachine, user, ClientProcessId and the query textThe query text of wmiexec-style reconnaissance.
WMI-Activity/Operational5859, 5860DEFAULTB5859: a provider registered a notification query. 5860: a temporary event consumer registered, with the query, user, client process and client machine5860 is a subscription held in memory by a running client, including a remote one. The permanent kind is 5861.
WMI-Activity/Operational5861DEFAULTDPermanent event consumer created, often with the command it will runThe only native record of WMI subscription persistence.

Class 5: persistence-linked launch, services

A service install is execution and persistence in the same record, and it is the classic remote-execution tell. 7045 is on by default, so pull it first.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
System7045DEFAULTDService installed: name, ImagePath, type, start type, accountThe loudest PsExec and remote-service signal. PSEXESVC, or a cmd /c or encoded ImagePath.
Security4697CONFIGDService installed, with the full image pathThe audited twin of 7045.
System7034, 7031DEFAULTBService crashed or terminated unexpectedly, with recovery actionA service ran and failed.
System7000, 7009DEFAULTDService failed to start or timed outAn attempted launch of the named image.
System7040DEFAULTDService start type changedTampering with defenses, for example a security service moved to disabled.

Class 6: persistence-linked launch, tasks and DCOM

Scheduled tasks write to both a Security log and an operational log, and the operational one is on by default. DCOM is the awkward case: lateral movement over DCOM has no single event.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
Security4698, 4699CONFIGDTask created or deleted, with the Actions XML in cleartextThe executable and arguments the task will run.
Security4700, 4701, 4702CONFIGDTask enabled, disabled or updatedChanges to existing persistence.
TaskScheduler/Operational106, 140, 141DEFAULTDTask registered, updated, deletedThe default-on twin of 4698.
TaskScheduler/Operational129DEFAULTACreated Task Process, naming the instance and PIDMaps directly onto a 4688 or Sysmon 1.
TaskScheduler/Operational200, 201DEFAULTA (200), B (201)Action started and completedThe difference between persistence that is armed and persistence that actually ran.
System (DCOM)10000, 10001DEFAULTDA DCOM server failed to start, with the command it tried, which carries -EmbeddingAn activation was attempted on this host and failed.
System (DCOM)10010, 10028DEFAULTD10010: a server did not register with DCOM in time. 10028: this host could not reach a remote computer while activating a CLSID, with the requesting PID and processFailed attempts. 10028 is written on the machine the attempt came from, and names the target and the process that tried.

Reconstruct DCOM movement from a process create, the -Embedding tell on the command line, and a Type 3 logon. All four events above record failures, so a DCOM move that worked leaves none of them. Treat 10016 as by-design noise; it is almost never what you are looking for.

Class 7: control adjudication

The highest field fidelity in the log, because a security control inspected the image before deciding. Path, hash and publisher in one record. Audit mode counts, which is the point most people miss. Read the outcome before the class name: allowed or audited means the control evaluated the image on its way to running or loading, blocked means an attempt was prevented, and a DLL rule concerns a load rather than a new process.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
AppLocker EXE and DLL8002, 8003, 8004DEPLOYC, D (8004)Allowed, audited or blocked, with path, hash, publisher, rule and SIDIn audit mode, 8002 and 8003 together log every file the policy evaluated: 8002 for files the rules allow, 8003 for files they would have blocked. 8004 is a block: the attempt is proven, the run is not.
AppLocker MSI and Script8005, 8006, 8007DEPLOYC, D (8007)The same for .msi and for .ps1, .vbs, .js, .cmd and .batScript execution with the same fidelity.
AppLocker Packaged app8020, 8021, 8022DEPLOYC, D (8022)Packaged app allowed, audited or blockedUWP execution adjudication.
CodeIntegrity (WDAC)3076, 3077DEPLOYB (3076), D (3077)Audit-mode or enforced block against App Control policyThe file failed policy, and the record names it. 3076 is audit mode, so the file still loaded; 3077 is enforced, so it did not.
CodeIntegrity (WDAC)3033, 3089DEPLOYDImage failed the signing level, with signature informationSigning detail for the blocked file.
Defender ASR1121, 1122DEPLOYBBlock or audit with rule GUID, path, process, target and parent command lineBehavioral and narrow. A 1121 means the blocked operation did not happen; the process that attempted it did run.
Defender AV1116, 1117DEFAULTDMalware detected and action taken, with file path and processOn by default, and frequently the only control record present.
SRP (Application)865, 866, 867, 868DEPLOYDSoftware Restriction Policy enforcementOlder estates only.

The standing recommendation I give is to run AppLocker or WDAC in audit mode. Most of the forensic value, none of the operational risk of blocking something the business needs.

Class 8: install, deploy and servicing

Installer and transfer subsystems place software, and sometimes run it, naming products, packages, URLs and paths as they do. A successful install shows installation, not that the program later ran.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
MsiInstaller1033, 1035DEFAULTDProduct installed or reconfigured: name, version, manufacturerWhat was installed through Windows Installer, not that it ran afterwards.
MsiInstaller11707, 11708DEFAULTDInstall completed, or failed and rolled backThe outcome of the install.
BITS-Client/Operational3DEFAULTDJob created: JobId, JobTitle, RemoteName URL, LocalNameA transfer job was created, with the source URL. Not that it completed or that anything ran.
BITS-Client/Operational59, 60, 16403DEFAULTCJob started, stopped, notifySetNotifyCmdLine runs a command from svchost, which is the abuse case.
AppXDeploymentServer400, 401, 404DEFAULTDPackaged app deployment, naming package and volume404 records a failed install attempt, which is still evidence.
AppXDeployment332, 603, 607DEFAULTDPackage deployment operation, start and resultPackaged app servicing.
Store (Install-Agent)2000DEFAULTDStore install activity naming process and moduleStore-sourced installs.
RestartManager10010DEFAULTBApplication holding files during install or update, with full pathNames running executables incidentally.

MSI events fire for Windows Installer packages. A plain .exe installer often logs nothing at all, so absence here is not evidence that nothing was installed.

Class 9: crash and fault derived

It ran because it broke. Weak attestation, on by default, and frequently the only surviving trace. Every one of these names a path.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
Application Error1000DEFAULTBFaulting application path, version, faulting module, exception code, PID, start timeA process existed and crashed, with its full path.
Application Hang1002DEFAULTBHanging application path, version, PIDA process existed and hung.
Windows Error Reporting1001DEFAULTBFault bucket and application pathPoints at the .wer files under ReportArchive and ReportQueue.
.NET Runtime1026, 1023DEFAULTBUnhandled managed exception with stack trace and assembly pathsA managed application ran and failed.
ESENT216, 325, 326, 327DEFAULTBDatabase attach, create and detach, with calling process, PID and database pathA 325 creating a new database at a non-standard path is the ntdsutil credential-theft signal.
Diagnostics-Performance101, 103, 203DEFAULTBApplication or service slow at boot or shutdown, with timingNames something that ran.

These are self-reported by the faulting subsystem, so corroborate them against Sysmon, Prefetch or Amcache before leaning on one.

Classes 10 and 11: compatibility, telemetry and self-reported

Execution inferred from a shim or inventory subsystem, plus the weakest tier of all: records an application wrote about itself. This is where the provider rule earns its keep.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
Program-Telemetry500, 505DEFAULTCCompatibility fix applied to an executable, with path and fixTelemetry-setting dependent, so absence proves nothing.
Program-Compatibility-Assistant17DEFAULTCShim engine names an executable that ranA default-on execution hint most estates never read.
Program-Inventory903, 904, 905 to 908DEFAULTDNew application installed, updated or removedInventory-level install record where populated. Enabled but empty on a Windows 11 26H2 host.
OAlerts300DEFAULTBOffice application prompt with file name and which Office appAn Office application ran and opened something.
.NET Runtime1000DEFAULTDArbitrary free text written by any applicationThe weakest record on this page. Any process can write any string here.
VSS (Application)8231DEFAULTBSnapshot creation initiated, with the requesting process command line and caller stackNames the program that asked for a shadow copy: vssadmin, wmic, ntdsutil or a tool copying a locked file. Context for ransomware or anti-forensic activity.
Vendor sourcesvariousDEFAULTCBackup, RMM, AV and database engines writing path-bearing entriesSelf-reported, rarely parsed, and often the only record of a niche application.

This is the concrete case for grading the provider. Application event 1000 is a crash under Application Error and an attacker-controlled string under .NET Runtime. And the provider name itself can be borrowed: on a Windows 11 test host, Windows PowerShell’s Write-EventLog, run elevated, wrote a .NET Runtime 1000 carrying arbitrary text. eventcreate.exe refuses the name of any installed provider, so it is the wrong tool to worry about. Corroborate before you cite.

Class 12: remote and lateral execution context

This class turns a process ran into a process ran because somebody moved to this box. RDP alone spans four logs across three machines.

Log or providerEvent IDsAvailableGradeWhat it containsWhat it proves
Security4624 Type 3, 4648CONFIGDInbound network logon; explicit credential useSMB, WMI, WinRM and service arrival. 4648 covers runas and PsExec -u.
Security5140, 5145CONFIGDShare access, with the relative target on 5145ADMIN$, IPC$ and C$ access, including the PSEXESVC pipe.
WinRM/Operational6, 91, 168, 169DEFAULTBWSMan shell created, with authentication and userThe WinRM and PowerShell remoting footprint, on by default.
TS-RemoteConnectionMgr1149DEFAULTDRDP connection with source IP and userA connection that passed NLA. Not yet a full logon.
Security4624 Type 10, 4778, 4779CONFIGDRDP interactive logon, session reconnect and disconnectUnder NLA a Type 3 is recorded first.
TS-LocalSessionManager21, 22, 24, 25DEFAULTD, B (22)RDP session logon, shell start, disconnect, reconnect, with source addressA source address of LOCAL is not RDP.
TS-RDPClient1024, 1102DEFAULTBOn the machine somebody connected FROM, naming the destinationThe pivot origin, which is the half people forget to collect.

Process ancestry is what ties arrival to execution: wsmprovhost.exe, PSEXESVC or w3wp.exe spawning cmd.exe.

Class 13: the on-disk cousins

Not event logs. Filesystem and registry artifacts that survive a cleared event log. Some record a run directly; others show that a file was present or that the shell met it, and the last column says which. In a compromise assessment I collect these first.

ArtifactWhere it livesAvailableGradeWhat it containsWhat it proves
PrefetchC:\Windows\PrefetchDEFAULTBExecution, run count, last eight run times, referenced filesStrong execution evidence, with no user attribution.
AmcacheAmcache.hveDEFAULTDPresence, key timestamps, SHA-1 of the first 30 MB (31,457,280 bytes), PE metadataPresence and identity of the binary, including after deletion. An entry alone is not execution: inventory scans add files that never ran.
ShimCacheSYSTEM AppCompatCacheDEFAULTDPath and last-modified time; no file size on Windows 10 and 11Recorded on enumeration. Presence is not execution. Pair it with Amcache or Prefetch.
SRUMSystem32\SRUDEFAULTBPer-application runtime and bytes sent and receivedBytes per application per interval: where an exfiltration volume estimate starts, though it does not record where the bytes went, and badly underused.
BAM and DAMSYSTEM bamDEFAULTBExecution keyed to the user SIDThe attribution Prefetch does not give you.
PCAAppCompat\PCADEFAULTBPcaAppLaunchDic path and the UTC time of its last GUI launch, PcaGeneralDb exit codeWindows 11 22H2 and Server 2025 onward. Records executables launched through the GUI, including from shares and USB. A launch by a Run key, a service, a task or a command line is not recorded, so the time is the last GUI launch, not the last execution, and a binary never opened from the GUI has no entry. Compared against Sysmon event 1 on the same Windows 11 host, the times matched for binaries opened from the GUI and were older for binaries that also start on their own.

Per-user launch and deleted binaries

ArtifactWhere it livesAvailableGradeWhat it containsWhat it proves
UserAssistNTUSER.DATDEFAULTBGUI-launched programs per user: run count, focus time, last runPer-SID attribution for interactive launches.
RecentApps and RunMRUNTUSER.DATDEFAULTCRecently run applications and Run-dialog historyWhat the user typed and launched.
Jump ListsRecent DestinationsDEFAULTCApplication execution and file interaction, with AppID mappingTies an application, through its AppID, to the documents it opened. Before a legal or disciplinary finding, check whether the user or the application opened each target and that the AppID maps to the program you think: an application can set its own AppID.
MUICacheUSRCLASS.DATDEFAULTBNames and descriptions of GUI programs run in the user's sessionA GUI program ran in that user's session. No time, nothing for programs without a window, and the session user is not necessarily the account the process ran as.
WER report filesReportArchive and ReportQueueDEFAULTBAppCrash and AppHang foldersConfirms a path executed before the crash time.
MPLogDefender SupportDEFAULTB, D (scan)Scan, cloud-lookup, detection and impact records, with file paths, hashes and the process image names involvedOften the deepest surviving record of a deleted binary. A detection or impact record names a process that ran; a scan or cloud-lookup record shows only that the file was present.
USN journal and $MFTNTFS metadataDEFAULTDDrop, rename, timestomp and deletion timingIndependent of the event log entirely.
ActivitiesCacheConnectedDevicesPlatformDEFAULTB (Windows 10 only)Windows 10 Timeline application and document usage, with start and end timesExecution with a duration attached, on Windows 10. Timeline was removed in Windows 11: on a Windows 11 26H2 host the database was still written but held no application-usage records.

Traps and blind angles

Each of these has ended a finding on cross-examination. Name the applicable gap before writing the words no evidence.

  • The bare event ID lies. Application 1000 is a crash or an implant string depending on the provider.
  • Most Security detail needs audit policy. 4688 command lines, 4697, 4698, WFP and 4104 are all off until somebody turns them on.
  • PowerShell splits across two logs, and PowerShell 7 splits into a third.
  • ShimCache is not execution. It records a path on enumeration.
  • Self-reported events are forgeable. Write-EventLog writes a classic Application event under an installed provider’s name, with any text.
  • Deliberate evasion exists. Security 1102 and System 104 wipe the trail, DCOM has no single event, and golden or silver tickets bypass the domain controller entirely.

The order I actually collect in

Ordered for a long-dwell compromise assessment. Default-on and durable first, because those sources survive clearing, give the longest lookback, and need nobody to have prepared anything.

  1. Prefetch, Amcache, SRUM, BAM, PCA, ShimCache
  2. Windows PowerShell classic 400, 600 and 800, plus Operational 4104
  3. System 7045, 7034 and 7040
  4. Shell-Core 9707, 9708, 62408 and 62409
  5. TaskScheduler 106, 129, 200 and 201, and DCOM 10000, 10001, 10010 and 10028
  6. WMI-Activity 5857 to 5861
  7. Application channel: 1000, WER, ESENT, MSI and Program-Telemetry
  8. Sysmon 1, 3, 5, 7, 8, 10, 11, 13, 22 and 25, and EDR
  9. AppLocker, WDAC and Defender ASR
  10. Security 4688, 4689, 4697, 4698 to 4702, 4648, 5140 and WFP

Kernel-Process ETW and EDR are live or console sources, not a retrospective evtx pull. Any channel that is absent is an unanswered question, and it belongs in the report as one.

What this note leaves out

Execution of libraries, webshells and injection techniques are their own subject and deserve their own post.

Recovering deleted records or files is not covered. In a high-profile investigation no stone should be left unturned, and carving deleted evidence is a separate discipline from knowing which sources exist.

Key takeaways

  1. Group sources by the question they answer, not by the log they live in. Security 4688 and Sysmon 1 sit in one class because both answer whether a process was created. A source earns a place only if it anchors to a process, a path or a command. Anchoring makes a source attributable; how strongly it shows execution varies by source.
  2. Grade the provider, not the ID. Channel plus provider plus ID is the unit of meaning. Application 1000 is a crash under Application Error and an attacker-controlled string under .NET Runtime, and Write-EventLog can write it under an installed provider's name, so corroborate self-reported events before citing them. When normalizing, keep the channel, provider name and GUID, event ID and version, computer, record ID and UTC time; dropping the provider turns an event back into an ambiguous number.
  3. Tag every source by availability before claiming scope. Most Security detail needs audit policy: 4688 command lines, 4697, 4698, WFP and 4104 are all off until somebody turns them on.
  4. Absence is a finding, so say low-confidence-clean and name the gap. Silence is a statement about telemetry. Without Class 1 covering the window you are missing at least one of the parent process, the command line, a complete timeline or who executed it.
  5. Sysmon is a class, not an event. Event 1 is the start; 3, 7, 8, 10, 13, 22 and 25 carry the rest. GrantedAccess on event 10, read with the source image, separates a legitimate handle to LSASS from credential theft.
  6. Query both PowerShell logs, and the PowerShell 7 log as well. The classic log shows how PowerShell was launched and whether it arrived over WinRM, and the operational log shows what the script did. Query one and the quiet answer is wrong.
  7. Collect the default-on, durable sources first. Prefetch, Amcache, SRUM, BAM, PCA and ShimCache survive clearing, give the longest lookback and need nobody to have prepared anything. ShimCache records a path on enumeration, which is not execution.
  8. Inventory the sources on day one and ask for more logging. Walk the list, see which sources exist and how far back each reaches, set expectations with the client, and have additional logging switched on and retained while the case is open.
  9. Scope the collection to the question. Sometimes a handful of events proves or dismisses what you were asked, and not every investigation needs the full execution chain.

References

Grouped by class. Vendor research appears only where the link points at an original discovery.

Method and audit policy

Classes 1 and 2, process creation and behavior

Class 3, network and DNS

Class 4, script and command

Classes 5 and 6, services, tasks and DCOM

Class 7, control adjudication

Class 8, install and servicing

Class 9, crash and fault

Classes 10 and 11, compatibility, telemetry and self-reported

Class 12, remote and lateral movement

Class 13, on-disk artifacts