Bug Report

Report bugs in Devolutions PowerShell Universal.

avatar

DataTraveler

Scripts folder explorer does not show nested folders in PSU 2026.2.0

I was able to reproduce the issue mentioned here . The scripts are created on disk 💾 in nested folders, but the Scripts folder explorer does not show the child folders. After clicking the parent folder, the UI shows No Data [image] $scripts = @( @{ Name = 'folder-view-root.ps1'; Path = 'folder-view-root.ps1'; Script = '"root"' } @{ Name = 'folder-view-alpha.ps1'; Path = 'folder-view\alpha\folder-view-alpha.ps1'; Script = '"alpha"' } @{ Name = 'folder-view-beta.ps1'; Path = 'folder-view\beta\folder-view-beta.ps1'; Script = '"beta"' } ) foreach ($script in $scripts) { New-PSUScript ` -Name $script.Name ` -Path $script.Path ` -ScriptBlock ([scriptblock]::Create($script.Script)) }

15

1

avatar

DataTraveler

avatar

markusburkhardt

HTTP-Endpoint starting, even when its not configured in appsettings.json (Version 2026.2.0)

Hello PSU-community, i belive that i found an bug with http/https-Endpoints in the current version (2026.2.0) of PowerShell Universal. I ll start with a short description of my enviroment. I got one virtuell server with two instances of PowerShell Universal running. They are installed as an side-by-side-installation (installation was done with the provided ZIP-file) with seperate repository-, log- and other folderpaths. When i rebootet the server one of the two PSU-instances wasnt available, even though the services were running. When i checked the logs i got an tcp-port-conflict on port 60370 as an HTTP-Endoint. After restarting the service again the second instance became available, but besides the configured HTTPS-endpoint there was also an HTTP-endpoint (now on port 60371) running, which is not configured in the appsettings.json. I provided the censored appsettings.json in the attachments for both PSU-instances. I belive i get the port-conflict, because both instances (and there coresponding and manually created windows services) are starting at the same time and then try to reserve the same port. As a temporary workaround I also could prevet the opening dynamic HTTP-endpoint with port 60370/60371 by configuring HTTP-endpoints in the appsettings.json with differnt ports. Please have a look into this and let me know if you need additional information. Thanks in advance for the help. Best regards, Markus

26

4

avatar

markusburkhardt

avatar

schubfre

MCP Tools: High CPU load

PSU 2026.1.6 Priority: High When using multiple MCP tools in parallel (e.g. >10) the server CPU load caps at 100% for several seconds and PSU gets unresponsive. Each MCP job spawns a Universal.Host process that consumes approximately 7~10% CPU. These jobs do very light work, most just start an asynchronous REST API call and check for completion with most calls completing in seconds. I'd wager the time it takes for PSU to prepare these jobs is greater than the time it takes for the content of the jobs to finish. Our AV and EDR tools are surely involved in creating this load and we are testing what happens if they are off or the PSU processes are excluded. But I don't think this will fully fix the problem. I would like to have the load problem permanently fixed, but for a workaround i would be satisified with a rate limiting for MCP tools. Can you please - either fix the problem or create a workaround - in the 2026.1.x version family? This happens on both of these types of machines: RDP -> VM (dev machine) Windows Server 2019 local access HTTP Portable zip 6 cores @ 2.80GHz 24GB RAM LB -> VM (test machine) Windows Server 2022 remote access HTTPS with official cert MSI install 4 cores @ 2Ghz (restricted by hypervisor policy) 8GB RAM I haven't tested it yet on our prod cluster, but i would expect the same: LB -> 2 VMs Windows Server 2022 remote access HTTPS with official cert MSI install 4 cores @ 2Ghz (restricted by hypervisor policy) 8GB RAM

10

0

avatar

tools-sebi

Cannot access git settings anymore

We set up git a few updates ago and now want to move from gitlab to Azure devops. however in the PSU UI I can access the git module, but cannot switch to the "Settings" tab in the git module. An error occured. Value cannot be null. (Parameter 'source') at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument) at System.Linq.Enumerable.<ToArray>g__EnumerableToArray|324_0[TSource](IEnumerable`1 source) at PowerShellUniversal.GitSettingsForm.OnInitializedAsync() in D:\a\powershell-universal\powershell-universal\src\Universal.Server\Shared\Settings\GitSettingsForm.razor:line 144 at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync() [image] [image]

18

1

avatar

Adam Driscoll

avatar

jomalin88

Documentation pages missing

Version 2026.2.0 The View Documentation button under Intelligence > AI Agents and AI Tools go to https://docs.powershelluniversal.com/intelligence/agents and https://docs.powershelluniversal.com/intelligence/tools And neither of those pages exist

14

1

avatar

Adam Driscoll

avatar

michaelhanson1458

Upgraded from 1.7 to 2026.2.0 and clicking on jobs throws and error

[image] at System.Collections.Generic.Dictionary2.Add(TKey key, TValue value) at AntDesign.Select2.SetInitialValuesAsync(SelectOptionItem2 selectOptionItem) at AntDesign.Select2.AddOptionItem(SelectOptionItem2 optionItem) at AntDesign.SelectOption2.OnInitializedAsync() at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync() An error occured. An item with the same key has already been added. Key: Triggered This is while hosting with sql as the backend. I dont see this issue when useing a local sqllite Since this was my prod environment i had to revert back to 1.7 for now :(

13

1

avatar

Adam Driscoll

avatar

acoutellier

Manual job launch fails with "Unknown identity" after upgrading to 2026.2.0

Hello, After upgrading from 2026.1.6 to 2026.2.0, a domain user can no longer start a script manually from the admin console. The job fails immediately with Failed to start script. Unknown identity: DOMAIN\Account I did some troubleshooting before posting here and I found out that the console identifies me as DOMAIN\Account (with domain name in uppercase), and automatically creates an identity for me that I can find under Security > Identities. This automatically generated identity is stored as domain\account (With domain in lowercase). I manually created a second identity for my account with domain name in uppercase, and I was able to start a job successfully. Here are some details about my environment : Version: 2026.2.0 Auth: Windows Authentication, AD domain account Database: PostgreSQL Licensed: Yes Install: As a Windows Service with SYSTEM account Thank you in advance for your help.

19

0

avatar

kavm

Using host headers to select app

Running version: 2026.1.6 IIS is not in use. Today our default app is configured with a URL of "/" and it works perfectly when just using the host name as URL in a browser. Now we would like to host multiple "default apps" based on which host name is being accessed (like you can do with host headers in IIS). I've tried just setting a host name of https://server.domain.com/ as URL for the app, but this just redirects the browser to /admin when accessing that host name. Is IIS a requirement for doing this or should it be possible directly in PSU? Or am I going about this in the wrong way? Thanks!

24

1

avatar

dbytes

avatar

dbytes

Published Folders Not Working in 2026.2.0

Looks like Published Folders stopped working. I'm seeing this repeated in the system logs. 2026-06-01 09:38:01.561 -05:00 [INF][Microsoft.AspNetCore.Hosting.Diagnostics] Request starting HTTP/2 GET https://dev-universal.xxxxxx.com/login?returnUrl=/admin/platform/publishedFolders - null null 2026-06-01 09:38:01.566 -05:00 [INF][Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler] Cookies was not authenticated. Failure message: Identity missing in session store 2026-06-01 09:38:01.580 -05:00 [INF][Microsoft.AspNetCore.Routing.EndpointMiddleware] Executing endpoint '/Login' 2026-06-01 09:38:01.580 -05:00 [INF][Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker] Route matched with {page = "/Login", action = "", controller = ""}. Executing page /Login 2026-06-01 09:38:01.583 -05:00 [INF][Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker] Executing handler method PowerShellUniversal.Login.OnGet - ModelState is "Valid" 2026-06-01 09:38:01.690 -05:00 [INF][Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker] Executed handler method OnGet, returned result Microsoft.AspNetCore.Mvc.RazorPages.PageResult. 2026-06-01 09:38:01.692 -05:00 [INF][Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker] Executed page /Login in 109.4217ms 2026-06-01 09:38:01.693 -05:00 [INF][Microsoft.AspNetCore.Routing.EndpointMiddleware] Executed endpoint '/Login' 2026-06-01 09:38:01.693 -05:00 [INF][Microsoft.AspNetCore.Hosting.Diagnostics] Request finished HTTP/2 GET https://dev-universal.xxxxxx.com/login?returnUrl=/admin/platform/publishedFolders - 200 null text/html; charset=utf-8 129.376ms

199

14

avatar

wolfbergmann

avatar

michaelhanson1458

Blank page when trying to view child jobs from the ui

in 2026.1.6 [image] Doesnt seem to work when clicking the + next to "view job" or when you click on the "child jobs" tab when viewing a parent job

32

3

avatar

michaelhanson1458

avatar

AniTexs

Reload of Workflows missing

Under the Admin Panel => Settings => Files The reload for workflows is missing. It's not really registering my filesystem changes, so I have to reload everything in order for it to react on my file changes for workflows. [image]

26

3

avatar

Adam Driscoll

avatar

schubfre

MCP API: sometimes returns "no output" even when output exists

PSU 2026.1.6 MCP output: 2026-06-08 13:46:35.507 [info] [editor -> server] {"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"Get_OS_installation_compliance","arguments":{"Servername":"REDACTED"},"_meta":{"progressToken":"REDACTED","vscode.conversationId":"REDACTED","vscode.requestId":"REDACTED","traceparent":"REDACTED"}}} 2026-06-08 13:47:05.682 [info] [server -> editor] {"result":{"content":[{"type":"text","text":"Job completed successfully with no output."}]},"id":4,"jsonrpc":"2.0"} PSU job log output: Get-PSUJobPipelineOutput -RunId 'e8add5e9-5152-4e99-9c9e-391a7682b464' -UseDefaultCredentials -ComputerName 'http://localhost:5075' {"Message":{"REDACTED"},"Result":1} Screenshot: [image] This works in several scripts that are structured the same and in some it doesn't. I can't really see a difference why most scripts/tools would answer fine and some have this problem. Both functions do something like this to return data return $ComplianceResult And in both cases I do something like this to serialize it Function-Call -Parameters Inputs | ConvertTo-Json -Depth 100 -Compress Curiously, I get the following error in the Pipeline Output tab. But I don't think it's relevant to this problem, because I get this error in the tools that don't work, but also in the tools that do work: [image]

71

2

avatar

DataTraveler

avatar

matthew14

Git->Settings results in "An Error Occurred"

After upgrading to 2026.2.0 for IIS, I am unable to access the settings for my Git remote in order to update a GitLab PAT. Sync is non-functional at this time. All was fine before upgrade. This issue appears on multiple development installs. I've reverted production to a previous VM snapshot. An error occured. Value cannot be null. (Parameter 'source') at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument) at System.Linq.Enumerable.<ToArray>g__EnumerableToArray|324_0[TSource](IEnumerable`1 source) at PowerShellUniversal.GitSettingsForm.OnInitializedAsync() in D:\a\powershell-universal\powershell-universal\src\Universal.Server\Shared\Settings\GitSettingsForm.razor:line 144 at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync() at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)

39

1

avatar

Adam Driscoll

avatar

AniTexs

Pages not found in folders

It does not recursivly search for pages under the `\AppName\Pages\*` [image] [image] I'm running the latest 2026.2.0

24

2

avatar

AniTexs

avatar

rmcavoy

Changing App Settings Deletes Code

Just had an app delete progress I had made after I changed the roles to allow another role to access the app. I've seen this bug in previous versions but I thought it was fixed already. Not sure if it matters but git sync is setup one way and was paused at the time. All changes were made through the PSU web interface.

108

7

avatar

Patrick Ouimet

avatar

schubfre

MCP Error: "Error: MPC -32603: An error occurred."

PSU 2026.1.6 Somehow the codeword "Port" results in the PSU MCP tools to do inexplicable things. I can define Port as String or Int, it always gets treated as Int. Same with the Codeword: I can use Port or PortString or anything with Port in the name, it gets cut internally into "Port", even if Port exists nowhere and the real parameter is PortString. This problem reminds me of the other bugs I opened where the codeword IP results in inexplicable behaviours. The call doesn't even get converted into a job run. Get-MCPPortConnectionCheck.ps1: <# .SYNOPSIS Test remote IP connectivity by port .DESCRIPTION Test remote IP connectivity by port from a specific server, return the connection result .PARAMETER Servername Name of source server .PARAMETER TargetIP Target IP address to check connection .PARAMETER Port Target port to check connection #> function Get-MCPPortConnectionCheck { param ( [Parameter(Mandatory = $true, HelpMessage = 'Name of source server')] [String] $Servername, [Parameter(Mandatory = $true, HelpMessage = 'Target IP address to check connection')] [String] $TargetIP, [Parameter(Mandatory = $true, HelpMessage = 'Target port to check connection')] [String] $Port ) MCP log: 2026-06-09 08:55:07.040 [info] [editor -> server] {"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"Test_remote_IP_connectivity_by_port","arguments":{"Servername":"REDACTED","TargetIP":"REDACTED","Port":53},"_meta":{"progressToken":"REDACTED","vscode.conversationId":"REDACTED","vscode.requestId":"REDACTED","traceparent":"REDACTED"}}} 2026-06-09 08:55:07.064 [info] [server -> editor] {"error":{"code":-32603,"message":"An error occurred."},"id":4,"jsonrpc":"2.0"} Output in chat: Error: MPC -32603: An error occurred. Now, this magically works: $Parameters = @{ Module = 'psu_mcp_tools' Command = 'Get-MCPPortConnectionCheck' Description = 'Test remote IP connectivity by textstring' InformationAction = 'SilentlyContinue' ErrorAction = 'Stop' } New-PSUScript @Parameters $Parameters = @{ Name = 'Test remote IP connectivity by textstring' Description = 'Test remote IP connectivity by textstring from a specific server, return the connection result' ScriptFullPath = 'psu_mcp_tools\Get-MCPPortConnectionCheck' Authenticated = $true Role = @('Reader') } New-PSUMcpTool @Parameters <# .SYNOPSIS Test remote IP connectivity by port .DESCRIPTION Test remote IP connectivity by port from a specific server, return the connection result .PARAMETER Servername Name of source server .PARAMETER TargetIP Target IP address to check connection .PARAMETER TextString Target port to check connection send as PORT:portnumber, example PORT:3389 #> function Get-MCPPortConnectionCheck { param ( [Parameter(Mandatory = $true, HelpMessage = 'Name of source server')] [String] $Servername, [Parameter(Mandatory = $true, HelpMessage = 'Target IP address to check connection')] [String] $TargetIP, [Parameter(Mandatory = $true, HelpMessage = 'Target port to check connection send as PORT:portnumber, example PORT:3389')] [String] $TextString ) $Port = $TextString.Split(':')[-1]

50

1

avatar

Adam Driscoll

avatar

dominikmarehard

initialize.ps1 - Is not called on SubModules

initialize.ps1 - Is not called on SubModules initialize.ps1 - Is called multiple times on Repository. I have the newest version of PSU 2026.2.0

21

1

avatar

Adam Driscoll

avatar

DataTraveler

New-UDEditor does not support Get-UDElement or New-UDForm state tracking

Kindly refer to customer report 55186

20

0

avatar

DataTraveler

Single selection New-UDSelect renders ListItemText into the combo box, breaking global ListItemText theme overrides.

Kindly refer to customer report 55031

25

0

avatar

insomniacc

Remove Script Permission locked in read only mode

Version: 2026.1.7 I'm able to create permissions in my prod instance but it seems, at least from the resource/script view, I cannot remove them due to the button being greyed out in 'read only' mode. However if I navigate to the 'Permissions' menu from the navbar, and find the same permission there I can remove it. I will add as a secondary issue, when I removed the permission from the permissions page, rather than the script permissions, it refreshed and the entire list of permissions became read only, I had to refresh the page for it to become delete-able again. My server is configured with one way git which I beleive is the only read-only type configuration, however these permissions goto sql EDIT: It seems I can remove permissions from the script resource, having just retried it wasnt greyed out, so it seems to be an intermittent issue - similar to the permissions page. Both areas are greyed out at times, and a refresh is the current workaround. [image]

23

1

avatar

Adam Driscoll

avatar

Andreas

Docker 2026.2.0-ubuntu-24.04 blazor.server.js missing

Hi All With newest Docker Image 2026.2.0-ubuntu-24.04 im unable to login. The File _framework/blazor.server.js is not available anymore which results in a JS Crash: [image] Result: Black Website after Login. Looks like the Image has never been tested for me 😕 Best Regards Andreas

75

8

avatar

Marco

avatar

DataTraveler

Backlog

Root-mounted app intercepts built-in reset-password route

Summary When a PowerShell Universal app is mounted at /, the built-in reset-password route can be intercepted by the app route surface. This prevents the normal reset-password page from loading when a local user's password has expired or when navigating directly to the reset-password URL. The issue started in 5.5.0 and persists through the current version 2026.2.0. To Reproduce Create an app mounted at / with app-level PageNotFound and NotAuthorized handlers. New-PSUApp -Name 'ResetPasswordRootRouteRepro' -BaseUrl '/' -Authenticated -Content { New-UDApp ` -Title 'Reset Password Root Route Repro' ` -PageNotFound { New-UDTypography -Text 'Custom PageNotFound' } ` -NotAuthorized { New-UDTypography -Text 'Custom NotAuthorized' } ` -Content { New-UDTypography -Text 'Home Page' } } Then browse to the built-in reset-password route. /reset-password?username=admin Expected Behavior The built-in reset-password page should load normally, even when an app is mounted at /. The reset-password route is part of the integrated authentication flow, so it should not be handled by the app's PageNotFound or NotAuthorized handlers. Actual Behavior When the app is mounted at /, the built-in reset-password route is intercepted by the app route surface. Workaround Mount the app at a non-root base URL instead of / if the built-in reset-password flow needs to remain available. For example, use a base URL such as /app or another non-root path. Suggested Fix Direction The built-in /reset-password route should probably be reserved ahead of root-mounted app routing, similar to how other integrated platform routes are protected from app catch-all behavior. If root-mounted apps are expected to own this route, then the documentation should call out that apps mounted at / can interfere with built-in authentication routes such as /reset-password.

61

1

avatar

Patrick Ouimet

avatar

alexrgreenwood

Save-Module / Install-Module fails for SimplySql via PSResourceGet — version mismatch (2.2.0 vs 2.2.0.106)

Version: PSU 2026.2.0.0 on Linux (Ubuntu 20.04), .NET 10, PowerShell 7.6 host Repro: Fresh 2026.2 install, no .universal/Modules yet Admin Console → Platform → Modules → Install SimplySql (version left as default / 2.2.0) from PSGallery Expected: Module saved into Repository/Modules/SimplySql/<ver>/. Actual: Job 8909 fails, error logged at 2026-06-06 12:48:03.855 in systemLog20260606.txt: [ERR][Universal.Server.Services.ModuleService] Error saving module SimplySql 2.2.0System.InvalidOperationException: Failed to save module. Package(s) 'SimplySql' could not be installed from repository 'PSGallery'. ---> Microsoft.PowerShell.PSResourceGet.UtilClasses.ResourceNotFoundException: Package(s) 'SimplySql' could not be installed from repository 'PSGallery'. at Universal.Server.Services.ModuleService.ThrowIfPowerShellHadErrors(PowerShell ps, String operation) in src\Universal.Server\Services\ModuleService.cs:line 853 at Universal.Server.Services.ModuleService.SaveModuleToRepositoryAsync(...) in src\Universal.Server\Services\ModuleService.cs:line 809 at Universal.Server.Services.ModuleService.SaveModule(...) in src\Universal.Server\Services\ModuleService.cs:line 230[WRN][Hangfire.AutomaticRetryAttribute] Failed to process the job '8909'; retry attempt count exceeded 0. Likely root cause: SimplySql's only PSGallery version is 2.2.0.106 (4-part); PSU passed 2.2.0 (3-part) to Save-PSResource/Install-PSResource, which treats it as an exact match and returns ResourceNotFoundException. NuGet-style version normalization (2.2.0 ≡ 2.2.0.0) isn't being applied to the user-supplied version before the lookup. Workaround: type the full 4-part version (2.2.0.106) in the UI; or pre-stage the module on disk under Repository/Modules/SimplySql/2.2.0.106/. Related code paths: ModuleService.SaveModule → SaveModuleToRepositoryAsync → ThrowIfPowerShellHadErrors.

30

1

avatar

Adam Driscoll

avatar

schubfre

MCP API: sometimes empty parameter descriptions

PSU 2026.1.6 In most cases it is enough to fill the parameter description in the comment based help. But in some cases even if the comment based help is correctly filled the MCP API doesn't recognize it and if you look at the tool output, the parameter description is suddenly empty. To remediate this, you can supply a parameter HelpMessage and then it works as expected. I don't know why this is happening, but curiously both scripts where it doesn't work have IP related inputs. Works (Get-MCPDNSRecord): <# .SYNOPSIS Get DNS record information .DESCRIPTION Get DNS record information from the DNS API with automatic detection of forward or reverse lookups based on input type .PARAMETER Name Name to lookup as IPv4 address or FQDN or hostname #> function Get-MCPDNSRecord { param ( [parameter(Mandatory = $true, HelpMessage = "Name to lookup as IPv4 address or FQDN or hostname")] [string] $Name ) Doesn't work (Get-MCPDNSRecord): <# .SYNOPSIS Get DNS record information .DESCRIPTION Get DNS record information from the DNS API with automatic detection of forward or reverse lookups based on input type .PARAMETER Name Name to lookup as IPv4 address or FQDN or hostname #> function Get-MCPDNSRecord { param ( [parameter(Mandatory = $true)] [string] $Name ) Doesn't work (Get-MCPPortConnectionCheck): <# .SYNOPSIS Test remote IP connectivity by port .DESCRIPTION Test remote IP connectivity by port from a specific server, return the connection result .PARAMETER Servername Name of source server .PARAMETER TargetIP Target IP address to check connection .PARAMETER Port Target port to check connection #> function Get-MCPPortConnectionCheck { param ( [parameter(Mandatory = $true)] [string] $Servername, [parameter(Mandatory = $true)] [string] $TargetIP, [parameter(Mandatory = $true)] [int] $Port ) Works (Get-MCPCloudServerVariables): <# .SYNOPSIS Get cloud server variables from git .DESCRIPTION Get cloud server variables from git like domain, platform, IP, etc. .PARAMETER Servername Name of cloud server #> function Get-MCPCloudServerVariables { param ( [parameter(Mandatory = $true)] [string] $Servername )

43

1

avatar

Adam Driscoll

avatar

insomniacc

PowerShellHost - Log files

Hi, In the ProgramData\PowerShellUniversal\Logs\PowerShellHost folder, 0kb empty text files continually seem to generate on all my PSU servers, to the point where I have thousands, but it doesnt seem to serve any purpose. Is this a bug? I'm routinely going and clearing down the folders but wanted to know why there's so many generating empty files? [image]

31

2

avatar

Adam Driscoll

1 - 25 of 44 items
Sysadminotaur pondering a question Special Q&A

Our CTO is answering your AI questions

A rare opportunity — ask our CTO directly.

13 questions already asked Closed
View questions →