Problem description
I've spent considerable time getting the SQL backend working with xDscWebService and wanted to document what I found since the existing documentation has several gaps and some outright incorrect guidance. Hopefully this saves someone else the same pain.
Environment
-- xPSDesiredStateConfiguration: 9.2.1
-- SQL Server: Named instance configured on port 1433
-- IIS App Pool Identity: LocalSystem
-- OS Tested: Windows Server 2019, 2022, 2025
Windows Server 2025 Compatibility
The SQL backend does not work on Windows Server 2025 as of this writing.
On Windows Server 2019 and 2022 the SQL backend functions correctly — the DSC service creates the required tables (RegistrationData, StatusReport, Devices) on first use and client registration succeeds.
On Windows Server 2025 the SQL code path is never reached at all:
-- The endpoint responds HTTP 200 (IIS and the service are running)
-- No sessions appear in sys.dm_exec_sessions when the endpoint is hit
-- No errors appear in the SQL error log
-- No ASP.NET errors appear in the Application event log
-- Tables are never created even with correct connection string and permissions
Pre-creating the database and tables manually does not resolve the issue — the problem is that the service DLL on Windows Server 2025 does not attempt a SQL connection at all. This is likely a regression in Microsoft.Powershell.DesiredStateConfiguration.Service.dll on that OS version. All documentation and known-working configurations are based on Windows Server 2019.
Recommendation: Deploy the pull server on Windows Server 2022 for SQL backend support. WS2022 was confirmed working and has a longer support lifecycle than WS2019.
Verbose logs
The symptom was essentially silence:
No sessions appearing in sys.dm_exec_sessions
No errors in the SQL error log
No ASP.NET errors in the Application event log
The endpoint returned HTTP 200 normally
The SQL code path simply was never reached
It never created the table in the DSC database...
When registering a new client:
Registration of the Dsc Agent with the server https://dscpull.visory.net:8080/PSDSCPullServer.svc failed. The underlying error is: Failed to register Dsc Agent with AgentId 42F782B1-197B-11F1-9CEF-005056A7F3B2 with the server
https://dscpull.visory.net:8080/PSDSCPullServer.svc/Nodes(AgentId='42F782B1-197B-11F1-9CEF-005056A7F3B2'). .
+ CategoryInfo : InvalidResult: (root/Microsoft/...gurationManager:String) [], CimException
+ FullyQualifiedErrorId : RegisterDscAgentCommandFailed,Microsoft.PowerShell.DesiredStateConfiguration.Commands.RegisterDscAgentCommand
+ PSComputerName : localhost
and this address returned:
https://dscpull.visory.net:8080/PSDSCPullServer.svc/Nodes(AgentId='42F782B1-197B-11F1-9CEF-005056A7F3B2')
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<m:code>Client protocol version is invalid. Request header should contain ProtocolVersion {0}.</m:code>
<m:message xml:lang="en-US">Client protocol version is invalid. Request header should contain ProtocolVersion 2.0.</m:message>
<m:innererror>
<m:message>Client protocol version is invalid. Request header should contain ProtocolVersion 2.0.</m:message>
<m:type>System.ArgumentException</m:type>
<m:stacktrace/>
</m:innererror>
</m:error>
DSC configuration
configuration xDscWebServiceRegistration
{
param
(
[string[]]$NodeName = 'localhost',
[ValidateNotNullOrEmpty()]
[string] $certificateThumbPrint,
[Parameter(HelpMessage='This should be a string with enough entropy (randomness) to protect the registration of clients to the pull server. We will use new GUID by default.')]
[ValidateNotNullOrEmpty()]
[string] $RegistrationKey # A guid that clients use to initiate conversation with pull server
)
Import-DSCResource -ModuleName PSDesiredStateConfiguration
Import-DSCResource -ModuleName xPSDesiredStateConfiguration
Import-DscResource -ModuleName NetworkingDsc
Node $NodeName
{
WindowsFeature DSCServiceFeature
{
Ensure = "Present"
Name = "DSC-Service"
}
Firewall HTTPTCPCommunication
{
Name = 'HTTPTcpCommunication'
DisplayName = 'HTTP TCP communication'
Action = 'Allow'
Direction = 'Inbound'
Protocol = 'TCP'
Profile = 'Any'
Enabled = 'True'
LocalPort = @('8080','9080')
}
xDSCWebService PSDSCPullServer
{
Ensure = "Present"
EndpointName = "PSDSCPullServer"
Port = 8080
PhysicalPath = "E:\inetpub\PSDSCPullServer"
CertificateThumbPrint = "<cert thumb>"
ModulePath = "E:\DscService\Modules"
ConfigurationPath = "E:\DscService\Configuration"
State = "Started"
RegistrationKeyPath = "E:\DscService"
AcceptSelfSignedCertificates = $true
UseSecurityBestPractices = $true
SqlProvider = $true
SqlConnectionString = 'Provider=SQLOLEDB.1;Data Source=<sql server name>;Initial Catalog=master;User ID=<sqlsvcacc>;Password=<sqlpw>;TrustServerCertificate=Yes;'
DependsOn = "[WindowsFeature]DSCServiceFeature"
}
File RegistrationKeyFile
{
Ensure = 'Present'
Type = 'File'
DestinationPath = "E:\DscService\RegistrationKeys.txt"
Contents = $RegistrationKey
Force = $true
MatchSource = $true
}
}
}
$xDscWebServiceRegistrationSplat = @{
certificateThumbprint = '<cert thumb>'
RegistrationKey = '<key>'
OutputPath = 'C:\sys\dsc'
}
xDscWebServiceRegistration @xDscWebServiceRegistrationSplat
Start-DscConfiguration -Path C:\sys\dsc -Wait -Verbose -Force
Suggested solution
Don't use Server 2025 for your SQL backed DSC pull server, Server 2022 and 2019 seems to work fine.
Operating system the target node is running
OsName : Microsoft Windows Server 2025 Standard
OsOperatingSystemSKU : StandardServerEdition
OsArchitecture : 64-bit
WindowsVersion : 2009
WindowsBuildLabEx : 26100.1.amd64fre.ge_release.240331-1435
OsLanguage : en-US
OsMuiLanguages : {en-US}
PowerShell version and build the target node is running
Name Value
---- -----
PSVersion 5.1.26100.32370
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.26100.32370
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
xPSDesiredStateConfiguration version
Name Version Path
---- ------- ----
xPSDesiredStateConfiguration 9.2.1 C:\Program Files\WindowsPowerShell\Modules\xPSDesiredStateConfiguration\9.2.1\xPSDesiredStateConfiguration.psd1
Problem description
I've spent considerable time getting the SQL backend working with xDscWebService and wanted to document what I found since the existing documentation has several gaps and some outright incorrect guidance. Hopefully this saves someone else the same pain.
Environment
-- xPSDesiredStateConfiguration: 9.2.1
-- SQL Server: Named instance configured on port 1433
-- IIS App Pool Identity: LocalSystem
-- OS Tested: Windows Server 2019, 2022, 2025
Windows Server 2025 Compatibility
The SQL backend does not work on Windows Server 2025 as of this writing.
On Windows Server 2019 and 2022 the SQL backend functions correctly — the DSC service creates the required tables (RegistrationData, StatusReport, Devices) on first use and client registration succeeds.
On Windows Server 2025 the SQL code path is never reached at all:
-- The endpoint responds HTTP 200 (IIS and the service are running)
-- No sessions appear in sys.dm_exec_sessions when the endpoint is hit
-- No errors appear in the SQL error log
-- No ASP.NET errors appear in the Application event log
-- Tables are never created even with correct connection string and permissions
Pre-creating the database and tables manually does not resolve the issue — the problem is that the service DLL on Windows Server 2025 does not attempt a SQL connection at all. This is likely a regression in Microsoft.Powershell.DesiredStateConfiguration.Service.dll on that OS version. All documentation and known-working configurations are based on Windows Server 2019.
Recommendation: Deploy the pull server on Windows Server 2022 for SQL backend support. WS2022 was confirmed working and has a longer support lifecycle than WS2019.
Verbose logs
DSC configuration
Suggested solution
Don't use Server 2025 for your SQL backed DSC pull server, Server 2022 and 2019 seems to work fine.
Operating system the target node is running
PowerShell version and build the target node is running
xPSDesiredStateConfiguration version