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. If you want the short version, the last two sections are the ones to read.

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. Anything vaguer than that is context, not evidence of execution.

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.

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 IDsAvailableWhat it containsWhat it proves
Sysmon/Operational1, 5DEPLOYImage, 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, 4696CONFIGNewProcessName, 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, 2LIVENative ProcessStart and ProcessStopReal time only. Nothing to install, and almost never there after the fact.
Shell-Core9707, 9708, 62408, 62409DEFAULTRun, RunOnce and autostart command started then finished, with exe and PIDA default-on process-creation record most people never query.
AppModel-Runtime201DEFAULTCreated process N for a packaged app: PID, app, packageExecution of packaged and UWP applications.
EDR telemetryvendorDEPLOYProcess, 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 IDsAvailableWhat it containsWhat it proves
Sysmon7, 8, 10, 25DEPLOYModules 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, 26DEPLOYFile 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 IDsAvailableWhat it containsWhat it proves
Sysmon12, 13, 14, 17, 18, 19, 20, 21DEPLOYRegistry 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, 505DEFAULTCompatibility 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 IDsAvailableWhat it containsWhat it proves
Sysmon3, 22DEPLOYProcess, destination IP and port, resolved hostname, DNS query and resultsThe cleanest process-to-network attribution available.
Security (WFP)5156, 5157CONFIGConnection 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, 5155CONFIGAn application permitted or blocked from listening on a portThe backdoor and C2-listener tell, and low volume.
Security (WFP)5158, 5159CONFIGBind to a local port, naming process and portPrecedes a listen.
Windows Firewall2004, 2005, 2006CONFIGRule added, changed or deleted, including the modifying applicationAttacker firewall changes surface here by name.

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 IDsAvailableWhat it containsWhat it proves
Windows PowerShell (classic)400, 403DEFAULTEngine 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)600DEFAULTProvider lifecycleProvider WSMan Is Started is the remoting and lateral-movement tell.
Windows PowerShell (classic)800CONFIGPipeline execution details, HostApplication, userInvocation detail, only with module logging on. A default session writes 400, 403 and 600, and no 800.
PowerShell/Operational4104CONFIGScript block logging: the decoded blockThe deobfuscated command transcript, which is the one people know.
PowerShell/Operational4103, 4105, 4106CONFIGModule logging, script block start and stopCommand invocation with parameters, and execution timing.
PowerShellCore/Operational4103, 4104DEPLOYThe 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)4096DEFAULTVBScript 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 IDsAvailableWhat it containsWhat it proves
WMI-Activity/Operational5857DEFAULTProvider loaded, with its on-disk pathProvider hijacking.
WMI-Activity/Operational5858DEFAULTOperation failure with ClientMachine, user, ClientProcessId and the query textThe query text of wmiexec-style reconnaissance.
WMI-Activity/Operational5859, 5860DEFAULT5859: 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/Operational5861DEFAULTPermanent 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 IDsAvailableWhat it containsWhat it proves
System7045DEFAULTService installed: name, ImagePath, type, start type, accountThe loudest PsExec and remote-service signal. PSEXESVC, or a cmd /c or encoded ImagePath.
Security4697CONFIGService installed, with the full image pathThe audited twin of 7045.
System7034, 7031DEFAULTService crashed or terminated unexpectedly, with recovery actionA service ran and failed.
System7000, 7009DEFAULTService failed to start or timed outAn attempted launch of the named image.
System7040DEFAULTService 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 IDsAvailableWhat it containsWhat it proves
Security4698, 4699CONFIGTask created or deleted, with the Actions XML in cleartextThe executable and arguments the task will run.
Security4700, 4701, 4702CONFIGTask enabled, disabled or updatedChanges to existing persistence.
TaskScheduler/Operational106, 140, 141DEFAULTTask registered, updated, deletedThe default-on twin of 4698.
TaskScheduler/Operational129DEFAULTCreated Task Process, naming the instance and PIDMaps directly onto a 4688 or Sysmon 1.
TaskScheduler/Operational200, 201DEFAULTAction started and completedThe difference between persistence that is armed and persistence that actually ran.
System (DCOM)10000, 10001DEFAULTA DCOM server failed to start, with the command it tried, which carries -EmbeddingAn activation was attempted on this host and failed.
System (DCOM)10010, 10028DEFAULT10010: 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.

Log or providerEvent IDsAvailableWhat it containsWhat it proves
AppLocker EXE and DLL8002, 8003, 8004DEPLOYAllowed, 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.
AppLocker MSI and Script8005, 8006, 8007DEPLOYThe same for .msi and for .ps1, .vbs, .js, .cmd and .batScript execution with the same fidelity.
AppLocker Packaged app8020, 8021, 8022DEPLOYPackaged app allowed, audited or blockedUWP execution adjudication.
CodeIntegrity (WDAC)3076, 3077DEPLOYAudit-mode or enforced block against App Control policyThe file failed policy, and the record names it.
CodeIntegrity (WDAC)3033, 3089DEPLOYImage failed the signing level, with signature informationSigning detail for the blocked file.
Defender ASR1121, 1122DEPLOYBlock 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, 1117DEFAULTMalware detected and action taken, with file path and processOn by default, and frequently the only control record present.
SRP (Application)865, 866, 867, 868DEPLOYSoftware 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 run it, and they name products, packages, URLs and paths while doing so.

Log or providerEvent IDsAvailableWhat it containsWhat it proves
MsiInstaller1033, 1035DEFAULTProduct installed or reconfigured: name, version, manufacturerWhat was installed through Windows Installer.
MsiInstaller11707, 11708DEFAULTInstall completed, or failed and rolled backThe outcome of the install.
BITS-Client/Operational3DEFAULTJob created: JobId, JobTitle, RemoteName URL, LocalNameA background transfer, with the source URL.
BITS-Client/Operational59, 60, 16403DEFAULTJob started, stopped, notifySetNotifyCmdLine runs a command from svchost, which is the abuse case.
AppXDeploymentServer400, 401, 404DEFAULTPackaged app deployment, naming package and volume404 records a failed install attempt, which is still evidence.
AppXDeployment332, 603, 607DEFAULTPackage deployment operation, start and resultPackaged app servicing.
Store (Install-Agent)2000DEFAULTStore install activity naming process and moduleStore-sourced installs.
RestartManager10010DEFAULTApplication 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 IDsAvailableWhat it containsWhat it proves
Application Error1000DEFAULTFaulting application path, version, faulting module, exception code, PID, start timeA process existed and crashed, with its full path.
Application Hang1002DEFAULTHanging application path, version, PIDA process existed and hung.
Windows Error Reporting1001DEFAULTFault bucket and application pathPoints at the .wer files under ReportArchive and ReportQueue.
.NET Runtime1026, 1023DEFAULTUnhandled managed exception with stack trace and assembly pathsA managed application ran and failed.
ESENT216, 325, 326, 327DEFAULTDatabase 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, 203DEFAULTApplication 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 IDsAvailableWhat it containsWhat it proves
Program-Telemetry500, 505DEFAULTCompatibility fix applied to an executable, with path and fixTelemetry-setting dependent, so absence proves nothing.
Program-Compatibility-Assistant17DEFAULTShim engine names an executable that ranA default-on execution hint most estates never read.
Program-Inventory903, 904, 905 to 908DEFAULTNew application installed, updated or removedInventory-level install record.
OAlerts300DEFAULTOffice application prompt with file name and which Office appAn Office application ran and opened something.
.NET Runtime1000DEFAULTArbitrary free text written by any applicationThe weakest record on this page. Any process can write any string here.
VSS (Application)8231DEFAULTVolume Shadow Copy activityRansomware and anti-forensic context.
Vendor sourcesvariousDEFAULTBackup, 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 IDsAvailableWhat it containsWhat it proves
Security4624 Type 3, 4648CONFIGInbound network logon; explicit credential useSMB, WMI, WinRM and service arrival. 4648 covers runas and PsExec -u.
Security5140, 5145CONFIGShare access, with the relative target on 5145ADMIN$, IPC$ and C$ access, including the PSEXESVC pipe.
WinRM/Operational6, 91, 168, 169DEFAULTWSMan shell created, with authentication and userThe WinRM and PowerShell remoting footprint, on by default.
TS-RemoteConnectionMgr1149DEFAULTRDP connection with source IP and userA connection that passed NLA. Not yet a full logon.
Security4624 Type 10, 4778, 4779CONFIGRDP interactive logon, session reconnect and disconnectUnder NLA a Type 3 is recorded first.
TS-LocalSessionManager21, 22, 24, 25DEFAULTRDP session logon, shell start, disconnect, reconnect, with source addressA source address of LOCAL is not RDP.
TS-RDPClient1024, 1102DEFAULTOn 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 independently prove a run and, critically, survive a cleared event log. In a compromise assessment I collect these first.

ArtifactWhere it livesAvailableWhat it containsWhat it proves
PrefetchC:\Windows\PrefetchDEFAULTExecution, run count, last eight run times, referenced filesStrong execution evidence, with no user attribution.
AmcacheAmcache.hveDEFAULTPresence, key timestamps, SHA-1 of the first 31MB, PE metadataPresence and identity of the binary, including after deletion. An entry alone is not execution: inventory scans add files that never ran.
ShimCacheSYSTEM AppCompatCacheDEFAULTPath, size, last-modifiedRecorded on enumeration. Presence is not execution. Pair it with Amcache or Prefetch.
SRUMSystem32\SRUDEFAULTPer-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 bamDEFAULTExecution keyed to the user SIDThe attribution Prefetch does not give you.
PCAAppCompat\PCADEFAULTPcaAppLaunchDic 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 livesAvailableWhat it containsWhat it proves
UserAssistNTUSER.DATDEFAULTGUI-launched programs per user: run count, focus time, last runPer-SID attribution for interactive launches.
RecentApps and RunMRUNTUSER.DATDEFAULTRecently run applications and Run-dialog historyWhat the user typed and launched.
Jump ListsRecent DestinationsDEFAULTApplication execution and file interaction, with AppID mappingTies an application to the documents it touched.
MUICacheUSRCLASS.DATDEFAULTExecuted application names and descriptions per userA per-user execution name list.
WER report filesReportArchive and ReportQueueDEFAULTAppCrash and AppHang foldersConfirms a path executed before the crash time.
MPLogDefender SupportDEFAULTScanned file pathsOften the deepest surviving record of a binary that has been deleted.
USN journal and $MFTNTFS metadataDEFAULTDrop, rename, timestomp and deletion timingIndependent of the event log entirely.
ActivitiesCacheConnectedDevicesPlatformDEFAULTWindows Timeline application and document usage, with start and end timesExecution with a duration attached.

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.

Six lines that hold it together

  1. Group by what a source tells you, not by which log it lives in.
  2. Grade the provider, not the ID. Channel plus provider plus ID is the unit.
  3. Tag every source by availability. Know what you have before claiming scope.
  4. Sysmon is a class, not an event. Event 1 is the start; 3, 7, 8, 10, 13, 22 and 25 carry the rest.
  5. Query both PowerShell logs, and the PowerShell 7 log as well.
  6. Absence is a finding. Say low-confidence-clean and name the gap.

The DFIR take-aways

Without Class 1 covering your investigation window, everything else is a partial view. You will be missing at least one of: the parent process, the command line, a complete timeline, or a clear answer to who executed it. You can still work, but say what is missing.

Knowing these sources lets you inventory the case on day one. Walk the list, see which sources exist and how far back each one reaches, and you can set expectations with the client immediately. It is also the moment to ask for additional logging to be switched on and retained, so the rest of the investigation has more to work with than the start did.

Not every investigation needs the full execution chain reconstructed. Sometimes a handful of events is enough to prove or dismiss the question you were actually asked. Scope the collection to the question.

This article deliberately leaves things out. Execution of libraries, webshells and injection techniques are their own subject and deserve their own post.

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

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

Class 12, remote and lateral movement

Class 13, on-disk artifacts