The old Windows PowerShell log's record of a command running, written when module logging is switched on. Its value is not the command text — it is the HostApplication field, which carries the full command line of whatever launched PowerShell, including the encoded ones.
Also written as PowerShell Event 800PowerShell 800 pipelineclassic powershell log 800
How oftenFires often
Vendor calls itInformation
LogWindows PowerShell
SourcePowerShell
What it means for you
On a personal computer
You will not normally have this. It only appears if someone deliberately turned on PowerShell module logging, which is an administrator setting rather than a default. If you are seeing it on a work laptop, it is your IT department's monitoring doing its job.
For an analyst
The classic Windows PowerShell log survives where the operational log does not: it exists on PowerShell 2.0 hosts, and it keeps recording when an attacker downgrades with -Version 2 to evade script block logging. Event 800 is the workhorse of that log. Read HostApplication before you read anything else — it holds the launching command line, which is where -EncodedCommand shows up even when the pipeline text itself is unremarkable.
What it looks like
Sanitised. Addresses come from the RFC 5737 documentation ranges.
The full command line of the process hosting the PowerShell engine. The single most useful field in the event, because it survives even when the pipeline details are truncated or dull.
powershell.exe -EncodedCommand ...A base64-encoded command. Decode it — it is UTF-16LE, so `[Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($s))`.
powershell.exe -Version 2A deliberate downgrade to an engine version that predates script block logging and AMSI.
powershell.exe -nop -w hidden -ep bypassThe classic combination of no profile, hidden window, and bypassed execution policy.
C:\Windows\System32\wbem\wmiprvse.exePowerShell hosted by the WMI provider, meaning the command arrived over WMI rather than from a console.
HostName
Which host is running the engine.
ConsoleHostAn interactive powershell.exe session.
Windows PowerShell ISE HostThe ISE.
ServerRemoteHostA remoting session — the command came in over WinRM from another machine.
Default HostA custom host, meaning some other program embedded the PowerShell engine rather than launching powershell.exe.
EngineVersion
Which PowerShell engine version ran. A 2.0 here on a modern Windows build is a downgrade, and it is one of the cleanest single indicators in the whole log.
CommandLine
The pipeline text. Truncated for long commands, which is exactly why the operational log's Event 4104 exists — but on a host without script block logging this is what you have.
User
The account the pipeline ran under. Present here and absent from some of the operational-log events, which makes 800 useful for attribution.
Ordinary reasons this happens
Most of the time it is one of these.
Ordinary administration on a machine where module logging has been enabled by policy — every cmdlet from a module in scope produces one of these.
Configuration management and monitoring agents that run PowerShell internally, which generate this in volume and under a non-obvious HostApplication.
Scheduled tasks running maintenance scripts.
Software installers that invoke PowerShell during setup.
The ISE or VS Code, where every command typed produces its own entry.
When it is not ordinary
Downgrading to PowerShell 2.0 to evade script block logging and AMSI.
What gives it awayEngineVersion 2.0 in the event on a Windows 10 or later host. Version 2.0 predates both mechanisms, so the operational log will be comparatively quiet while this log keeps recording.
Encoded commands used to hide intent from casual log review.
What gives it awayHostApplication containing -EncodedCommand, -enc, or -e followed by base64. The pipeline field may look innocuous while the launching command line does not.
What gives it awayHostName of ServerRemoteHost, or a HostApplication of wsmprovhost.exe or wmiprvse.exe. Both mean the command originated on another machine.
PowerShell run from inside another process rather than from powershell.exe.
What gives it awayHostName of 'Default Host' with a HostApplication that is not a PowerShell binary — the engine was loaded by something else, which is what tooling built to avoid powershell.exe does.
Read HostApplication first. It is the launching command line and it answers 'how was this started' before you look at what was run.
Check EngineVersion. A 2.0 engine on a modern host is a deliberate downgrade and is worth escalating on its own.
Decode any encoded command: `[Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('<base64>'))`. PowerShell's encoding is UTF-16LE, not UTF-8, which is why naive decoding produces gibberish with null bytes.
Check HostName for remoting. ServerRemoteHost means the command came from another machine, and the Security log will have a matching Logon Type 3.
Look for the corresponding operational-log events. If Event 4104 exists for the same activity you get the untruncated script; if it does not, ask why — either script block logging is off or the engine was downgraded.
Pull the surrounding pipeline entries for the same HostId. A single command out of context rarely means anything; the sequence usually does.
Queries to run
powershellThe details are all inside the message body as key-value lines, so read the whole thing.
kqlNarrows a high-volume log to the launch patterns that are worth reading.
Event | where EventLog == 'Windows PowerShell' and EventID == 800 | where RenderedDescription has_any ('-enc','-EncodedCommand','FromBase64String','-w hidden','-nop') | project TimeGenerated, Computer, UserName, RenderedDescription
splunkGroups by launching command line, which surfaces automation quickly and leaves the unusual launches at the bottom.
index=wineventlog source="WinEventLog:Windows PowerShell" EventCode=800 | rex field=Message "HostApplication=(?<hostapp>[^\r\n]+)" | stats count by host, hostapp | sort - count
Common questions
Why do I have PowerShell Event 800 but no Event 4104?
Most likely because module logging is enabled and script block logging is not — they are separate Group Policy settings. The other possibility is more interesting: script block logging and AMSI do not exist in PowerShell 2.0, so a session started with `-Version 2` produces classic-log events like 800 while the operational log stays quiet. Check the EngineVersion in the event.
How do I turn on PowerShell Event 800 logging?
Enable module logging: Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell > 'Turn on Module Logging', with a module name of * to cover everything. That writes Event 4103 to the operational log and Event 800 to the classic Windows PowerShell log. Enable script block logging alongside it — 800 truncates long commands and 4104 does not.
What is the HostApplication field in Event 800?
The full command line of the process that is hosting the PowerShell engine. It is the field to read first, because it shows how the session was started — encoded commands, hidden windows, execution policy bypasses and version downgrades all appear here even when the command that ran looks ordinary. It also identifies PowerShell running inside another program rather than in powershell.exe.
How do I decode an -EncodedCommand string from this event?
PowerShell encodes with UTF-16LE, so decode it as Unicode rather than UTF-8: `[Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('<the base64 string>'))`. Decoding it as UTF-8 produces text with a null byte between every character, which is the usual sign you have used the wrong encoding rather than that the string is corrupt.