Log Dejargonizer

Windows PowerShell · Event 53504

PowerShell Event 53504: A PowerShell engine started in a process

PowerShell opened its named-pipe listener for a newly started engine, and recorded the process ID and the AppDomain name. It is routine noise with one useful property: it fires wherever the engine loads, including inside programs that are not powershell.exe.

Also written as PowerShell 53504powershell named pipe IPC

What it means for you

On a personal computer

Something started PowerShell. That happens constantly on Windows without anyone opening a blue window — installers, Windows features, and settings pages all use it. It is informational and there is nothing to act on.

For an analyst

Its value is coverage rather than content. Because it is written when the engine initialises rather than when powershell.exe launches, it also fires for hosts that load System.Management.Automation directly — the technique usually described as 'PowerShell without powershell.exe'. Correlate the process ID it reports against process creation: if no PowerShell binary was started but an engine initialised, that is the finding.

What it looks like

Sanitised. Addresses come from the RFC 5737 documentation ranges.

Sample
Log Name:      Microsoft-Windows-PowerShell/Operational
Source:        Microsoft-Windows-PowerShell
Event ID:      53504
Level:         Information
Computer:      DESKTOP-WKS042

Windows PowerShell has started an IPC listening thread on process: 4812 in AppDomain: DefaultAppDomain.

The fields that decide it

Everything else in the log line is context.

Process ID
The process the engine started in. This is the field that does the work — resolve it against process creation events for the same second.
  • A PID belonging to powershell.exe or pwsh.exeOrdinary. The overwhelming majority.
  • A PID belonging to something else entirelyThe engine was loaded inside another program. Legitimate for some management software, and also what tooling built to avoid powershell.exe looks like.
AppDomain
The .NET application domain the engine started in.
  • DefaultAppDomainA normal console or script host.
  • DscPsPluginWkr_AppDomainDesired State Configuration executing a script resource. Distinctive and worth recognising.
  • An unfamiliar named AppDomainSomething embedded the engine deliberately and named its own domain.
Position in the sequence
It normally lands between Event 40961 (console starting) and Event 40962 (ready for input). A 53504 with no 40961 or 40962 around it means the engine was not started by the console host — which is the case worth looking at.

Ordinary reasons this happens

Most of the time it is one of these.

  • Any PowerShell console, script, or ISE session starting.
  • Desired State Configuration applying a configuration, which produces its own distinctly named AppDomain.
  • Software installers and Windows features that run PowerShell internally during setup.
  • Management agents — configuration tools, backup products, monitoring software — that host the engine in-process rather than shelling out.
  • Scheduled tasks and the Task Scheduler's own maintenance work.

When it is not ordinary

PowerShell executed without launching powershell.exe, by loading the automation assembly inside another process.

What gives it awayA 53504 naming a process that is not a PowerShell binary, with no matching 40961 or 40962. Application allowlisting and process-name-based detections both miss this; the engine start does not.

ATT&CK T1059.001

Remote execution arriving over WinRM.

What gives it awayA 53504 in a wsmprovhost.exe process, correlating with a Security 4624 Logon Type 3 from another host at the same moment.

ATT&CK T1021.006

What to do next

  1. Resolve the process ID from the event against process creation for the same second — Security Event 4688 or Sysmon Event 1 — and get the image name.
  2. If the image is powershell.exe or pwsh.exe, this is ordinary and the interesting detail is elsewhere in the session.
  3. If it is anything else, take that process seriously. Note that process IDs are reused, so match on time as well as on the number.
  4. Check whether 40961 and 40962 bracket it. Their absence supports the conclusion that the console host was not involved.
  5. Read the AppDomain name. DscPsPluginWkr_AppDomain identifies DSC; an unusual name identifies whatever chose it.
  6. Pull the script block logging events (4104) for the same process to see what the engine actually ran, since 53504 never carries any command content.

Queries to run

powershell The process ID and AppDomain are in the message text.
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-PowerShell/Operational'; Id=53504} -MaxEvents 100 | Select-Object TimeCreated, Message
powershell Shows the normal 40961 / 53504 / 40962 sequence, which makes an orphaned 53504 obvious.
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-PowerShell/Operational'; Id=53504,40961,40962} -MaxEvents 200 | Sort-Object TimeCreated | Select-Object TimeCreated, Id
kql Joins engine starts against process creation to find engines hosted somewhere other than a PowerShell binary.
let ps = Event | where EventLog == 'Microsoft-Windows-PowerShell/Operational' and EventID == 53504 | extend Pid = toint(extract(@'process: (\d+)', 1, RenderedDescription));
ps | join kind=leftouter (SecurityEvent | where EventID == 4688 | project Computer, NewProcessId, NewProcessName, TimeGenerated) on Computer | where NewProcessName !endswith 'powershell.exe' and NewProcessName !endswith 'pwsh.exe'
sigma Deliberately broad — 53504 has no fields worth filtering on by itself, so it is a collection rule that gets enriched downstream rather than an alert.
logsource:
  product: windows
  service: powershell-operational
detection:
  selection:
    EventID: 53504
  condition: selection

Common questions

What does 'Windows PowerShell has started an IPC listening thread' mean?

PowerShell creates a named pipe for each engine instance so that other tools can attach to it — this is what makes `Enter-PSHostProcess` possible. Event 53504 is written when that listener is set up, which happens every time a PowerShell engine initialises. It is informational and says nothing about what the session went on to do.

Is PowerShell Event 53504 a sign of something bad?

On its own, no — it fires on every PowerShell start, including the many that Windows does by itself. It becomes interesting when the process ID it names does not belong to powershell.exe or pwsh.exe, because that means the engine was loaded inside some other program. Some management software does that legitimately; so does tooling designed to avoid running a PowerShell binary.

What is the AppDomain in Event 53504?

The .NET application domain the engine started inside. Almost always DefaultAppDomain. The one worth recognising is DscPsPluginWkr_AppDomain, which means Desired State Configuration is executing a script resource — a useful marker because DSC activity otherwise looks like ordinary PowerShell.

Why do I see Event 53504 without ever opening PowerShell?

Because a great deal of Windows uses PowerShell internally. Windows Update, feature installs, MSI packages, Settings pages, antivirus definition updates, and management agents all start engines without showing anyone a console window. Seeing these on an idle machine is normal.

Read next

Vendor documentation

Last reviewed 7 September 2026