You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Process.Start() and PowerShell Start-Process hang on newer mcr.microsoft.com/windows/servercore:ltsc2019 / .NET Framework 4.8 LTSC2019 images #645
docker run -ti --rm mcr.microsoft.com/windows/servercore:ltsc2019 powershell
Inside the container:
Add-Type@"using System;using System.Diagnostics;public class Test { public static void Run() { var p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.Arguments = "/c echo hello"; Console.WriteLine("Before"); p.Start(); Console.WriteLine("After"); }}"@
[Test]::Run()
Actual result on the failing image:
Before
and then it hangs.
Notes
This does not appear to be specific to .NET Framework, because the same behavior is reproducible on plain mcr.microsoft.com/windows/servercore:ltsc2019.
The regression appears to have been introduced after the 2026-05-12 .NET Framework SDK LTSC2019 image.
We are currently pinning to mcr.microsoft.com/dotnet/framework/sdk:4.8-20260512-windowsservercore-ltsc2019 as a temporary workaround.
Thank you for creating an Issue. Please note that GitHub is not an official channel for Microsoft support requests. To create an official support request, please open a ticket here. Microsoft and the GitHub Community strive to provide a best effort in answering questions and supporting Issues on GitHub.
microsoft-github-policy-service commented on Sep 9, 2026
Independently hit this and can confirm, with three additions.
1. It is not an indefinite hang — it is a flat ~1800 s timeout.
The call does return, after almost exactly 30 minutes. Four runs across three
images all landed between 1801 and 1802 seconds, which is a hard timeout rather
than variance. Anyone who gives up before the 30-minute mark reads this as a
hang, which I think is why it has been reported that way.
2. 10.0.17763.9020 already reproduces, which narrows it to one servicing step.
Combined with your known-good 8880, and since there was no June 2026 release, 8880 and 9020 are consecutive updates.
3. -NoNewWindow avoids it, which may point at the shell-launch path.
Same container, minutes apart:
Variant
Launch path
Time
Start-Process ... -Wait
ShellExecuteEx (PowerShell default)
~1806 s
Start-Process ... -Wait -NoNewWindow
CreateProcess
1.03 s
-NoNewWindow switches Start-Process from UseShellExecute = $true to CreateProcess. Since .NET Framework's ProcessStartInfo.UseShellExecute also
defaults to true, that would explain why both of your repros hang. It predicts
that Process.Start() with UseShellExecute = false will not — worth confirming,
since it would separate the shell path from process creation.
Also possibly useful: during the stall, the target process never appears in tasklist inside the container at all, so it looks like the block happens before
the child is created.
Other things I ruled out here, in case it saves someone repeating them: it is not
the target binary (reproduces on stock in-image scrrun.dll), not a network wait
(netstat in the stalled container shows completed connections in TIME_WAIT,
nothing in SYN_SENT), and not the host — 8880 returns in 1.4 s on the same
host, same hour, same Docker daemon.
Environment: Windows Server 2019 host, process isolation, Docker 20.10.9 (API 1.41).
Disclosure: I used Claude (Anthropic) to help investigate this and draft this
comment. The measurements were run on my own host and I have checked them.
Mitigation: update the container host and reimport affected images
For Windows Server 2019 hosts running servercore:ltsc2019 containers:
Update the container host and reboot. The correction is included in KB5120238 (OS build 17763.9121). Install the current applicable cumulative update; a host already on newer supported servicing does not need to revert to the August update. Apply the update to the container host, not inside the container.
Pull the image after the host has been updated and rebooted. If the affected image was already imported before patching, remove the old cached copy first. Schedule a maintenance window, back up application data, retain the configuration needed to recreate containers, and stop affected workloads.
Cleanup warning:docker system prune -f removes all stopped containers, unused networks, dangling images and unused build cache. Data stored only in deleted containers' writable layers is lost unless backed up. Volumes are not removed by this command by default, but application backups are still necessary. Use this cleanup only when those resources can safely be removed.
For a previously imported affected image, use the following sequence, substituting your actual image tag or digest if different:
docker rmi mcr.microsoft.com/windows/servercore:ltsc2019
docker system prune -f
docker pull mcr.microsoft.com/windows/servercore:ltsc2019
If docker rmi reports a container dependency, removal has not completed. Confirm the referencing containers are stopped and safe to delete before pruning. Other tags or dependent images may retain layers; resolve remaining references before reimporting. Do not bypass unresolved dependencies with force-removal flags or manually delete Docker storage directories.
If the image was not previously imported, no cache cleanup is needed; pull it after updating and rebooting the host.
Rebuild dependent images where needed and recreate the containers. Restore application data as required, then repeat the affected installation or launch. For the VC++ redistributable scenario, run vc_redist.x64.exe /install /quiet and confirm successful installation using its exit status and installer logs.
Activity
github-actions commentedon Aug 7, 2026
Thank you for creating an Issue. Please note that GitHub is not an official channel for Microsoft support requests. To create an official support request, please open a ticket here. Microsoft and the GitHub Community strive to provide a best effort in answering questions and supporting Issues on GitHub.
microsoft-github-policy-service commentedon Sep 9, 2026
This issue has been open for 30 days with no updates.
no assignees, please provide an update or close this issue.
jy-cimcloud commentedon Sep 15, 2026
Independently hit this and can confirm, with three additions.
1. It is not an indefinite hang — it is a flat ~1800 s timeout.
The call does return, after almost exactly 30 minutes. Four runs across three
images all landed between 1801 and 1802 seconds, which is a hard timeout rather
than variance. Anyone who gives up before the 30-minute mark reads this as a
hang, which I think is why it has been reported that way.
2.
10.0.17763.9020already reproduces, which narrows it to one servicing step.Combined with your known-good
8880, and since there was no June 2026 release,8880and9020are consecutive updates.dotnet/framework/runtime:4.8-20260512-windowsservercore-ltsc2019dotnet/framework/runtime:4.8-20260714-windowsservercore-ltsc2019windows/servercore:ltsc2019Repro, on a Server 2019 host with process isolation:
3.
-NoNewWindowavoids it, which may point at the shell-launch path.Same container, minutes apart:
Start-Process ... -WaitStart-Process ... -Wait -NoNewWindow-NoNewWindowswitchesStart-ProcessfromUseShellExecute = $truetoCreateProcess. Since .NET Framework'sProcessStartInfo.UseShellExecutealsodefaults to
true, that would explain why both of your repros hang. It predictsthat
Process.Start()withUseShellExecute = falsewill not — worth confirming,since it would separate the shell path from process creation.
Also possibly useful: during the stall, the target process never appears in
tasklistinside the container at all, so it looks like the block happens beforethe child is created.
Other things I ruled out here, in case it saves someone repeating them: it is not
the target binary (reproduces on stock in-image
scrrun.dll), not a network wait(
netstatin the stalled container shows completed connections inTIME_WAIT,nothing in
SYN_SENT), and not the host —8880returns in 1.4 s on the samehost, same hour, same Docker daemon.
Environment: Windows Server 2019 host, process isolation, Docker 20.10.9 (API 1.41).
Disclosure: I used Claude (Anthropic) to help investigate this and draft this
comment. The measurements were run on my own host and I have checked them.
mariskahoogenboom commentedon Sep 16, 2026
Thanks for the workaround with the
-NoNewWindow. That's quite useful.bobsira commentedon Oct 15, 2026
Mitigation: update the container host and reimport affected images
For Windows Server 2019 hosts running
servercore:ltsc2019containers:Update the container host and reboot. The correction is included in KB5120238 (OS build 17763.9121). Install the current applicable cumulative update; a host already on newer supported servicing does not need to revert to the August update. Apply the update to the container host, not inside the container.
Pull the image after the host has been updated and rebooted. If the affected image was already imported before patching, remove the old cached copy first. Schedule a maintenance window, back up application data, retain the configuration needed to recreate containers, and stop affected workloads.
Cleanup warning:
docker system prune -fremoves all stopped containers, unused networks, dangling images and unused build cache. Data stored only in deleted containers' writable layers is lost unless backed up. Volumes are not removed by this command by default, but application backups are still necessary. Use this cleanup only when those resources can safely be removed.For a previously imported affected image, use the following sequence, substituting your actual image tag or digest if different:
If
docker rmireports a container dependency, removal has not completed. Confirm the referencing containers are stopped and safe to delete before pruning. Other tags or dependent images may retain layers; resolve remaining references before reimporting. Do not bypass unresolved dependencies with force-removal flags or manually delete Docker storage directories.If the image was not previously imported, no cache cleanup is needed; pull it after updating and rebooting the host.
Rebuild dependent images where needed and recreate the containers. Restore application data as required, then repeat the affected installation or launch. For the VC++ redistributable scenario, run
vc_redist.x64.exe /install /quietand confirm successful installation using its exit status and installer logs.