1. Problem Summary
When deploying Siemens PCS 7 V10.0 on a Windows 10 Enterprise LTSC 21H2 (build 19044) engineering station, the SQL Server 2019 instance required by WinCC Runtime and WinCC Professional archives enters an infinite reboot-request loop during the prerequisite phase of setup. The installer reports that a system restart is required, completes the restart, and on the next launch reports the same condition. The Microsoft SQL Server 2019 setup log confirms that the binary microsoft.sqlserver.configuration.extensibility_configextension.dll is intact, ruling out media corruption or an unblock-related false positive.
The symptom is consistent across multiple workstations in the field and is not related to the SQL Server engine itself: the failure occurs before the database engine feature is ever selected. Setup is blocked at the Installation Type / Feature Selection stage by the RebootRequiredCheck rule in Sqlsetupbootstrapper.exe, which inspects several Windows-side state objects before it allows the install to advance.
Summary.txt in the bootstrap log directory contains Rule 'RebootRequiredCheck' failed.
2. Affected Software Stack
| Component | Version | Role | Install Order |
|---|---|---|---|
| Windows 10 Enterprise LTSC | 21H2 (build 19044.x) | Host OS | 1 |
| .NET Framework 3.5 (feature) | 3.5 SP1 | SQL Server 2019 prerequisite | 2 |
| .NET Framework 4.8 | 4.8 (Release 528040+) | SQL Server 2019 / WinCC prerequisite | 2 |
| SQL Server 2019 | Standard 15.0.4280.7 baseline | WinCC archive, user archive, alarm logging backend | 3 |
| WinCC Professional / Runtime | V18 / V19 (PCS 7 V10.0 bundle) | HMI / SCADA | 4 |
| PCS 7 Engineering | V10.0 | DCS engineering | 5 |
3. Root Cause Analysis
The "setup requires a reboot" loop is driven by one or more of the following Windows-side conditions, all of which are checked by the SQL Server 2019 setup bootstrap (Sqlsetupbootstrapper.exe) before feature installation can begin.
3.1 PendingFileRenameOperations non-empty
Windows maintains the registry value HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations to track files renamed or deleted during a previous update or installer session. If the value contains \??\<path> rename/delete pairs, SQL Server 2019 Setup reports RebootRequiredCheck as failed and aborts. The value persists across reboots because Windows copies the in-memory list into the registry at shutdown and processes it during the next boot. Some installers fail to clear the value when the rename actually completes.
3.2 .NET Framework 3.5 disabled
SQL Server 2019 Setup validates both .NET Framework 4.8 (always required) and the Windows feature Microsoft .NET Framework 3.5. On Windows 10 LTSC 21H2 the 3.5 feature is off by default. When the feature is disabled, the setup bootstrap re-emits a feature check and, depending on the rule evaluation order, can interpret the missing feature as a reboot requirement rather than a missing prerequisite. The reboot loop is a side effect of misclassification, not of an actual pending restart.
3.3 Locked installation media
Extracting the SQL Server media to a path under %TEMP% or to a Controlled-Folder-Access protected directory can collide with antivirus file-locking, AppLocker, or Windows Defender Real-Time Protection. The setup bootstrap will, on the next launch, register the locked file under PendingFileRenameOperations, recreating the loop on every retry. The symptom is a DLL that loads successfully (microsoft.sqlserver.configuration.extensibility_configextension.dll present and version 15.0.x) but the install halts on a different file (commonly Microsoft.SqlServer.Configuration.InstallWizard.dll or setup.exe.config).
3.4 Pending Windows cumulative updates
If a Windows 10 cumulative update has been downloaded but not installed, or installed with a restart deferred, the SQL Server Setup detects the same PendingFileRenameOperations conflict and refuses to proceed. This is by design and is documented in the SQL Server 2019 setup rules reference.
3.5 Windows Installer pending component state
The Windows Installer service can mark components as "pending" when a previous MSI-based install was interrupted (for example by a power loss). SQL Server Setup reads this state through MsiGetProductInfo / MsiEnumComponents and requests a restart even if all other prerequisites are satisfied. The remediation is to complete the pending transaction or to clear the in-progress key after a full msiexec /unregister / msiexec /regserver cycle.
4. Prerequisites for Remediation
Before executing any of the methods below, capture the following state so that you can revert if needed.
- Open an elevated command prompt and run
winverto confirm the OS build (must be 19044 or later for LTSC 21H2). - Locate the SQL Server Setup log directory. The default is
%programfiles%\Microsoft SQL Server\150\Setup Bootstrap\Log. The deepest subfolder contains aSummary.txtand aDetail.txt. - Query the pending file list:
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager" /v PendingFileRenameOperations. A non-empty result confirms section 3.1. - Confirm .NET Framework 4.8 release key:
reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release. The value must be528040or higher. - Confirm the .NET 3.5 feature state:
dism /online /get-features | findstr /i "NetFx3". Expected output:Enabled. - Read the last 10 Setup events:
Get-WinEvent -LogName Setup -MaxEvents 10 | Format-List. Any event withID 20orID 21indicates an interrupted update. - Check Controlled Folder Access:
Get-MpPreference | Select-Object EnableControlledFolderAccess. A value of1will block setup binaries in user folders.
reg export HKLM\SYSTEM\CurrentControlSet\Control\Session Manager C:\backup\session-manager.reg. A corrupt PendingFileRenameOperations value can render the system unbootable.5. Solution Method 1 — Enable .NET Framework 3.5 and 4.8
The fastest path to a green RebootRequiredCheck on a fresh Windows 10 LTSC 21H2 image is to enable the .NET Framework 3.5 Windows feature and to confirm that .NET 4.8 is present.
- Mount the original Windows 10 LTSC 21H2 ISO or insert the installation media. Note the drive letter (for example
D:). - Open an elevated PowerShell session and run:
Install-WindowsFeature -Name Net-Framework-Core -Source D:\sources\sxs - Verify the install:
Get-WindowsFeature -Name Net-Framework-Core | Select InstallState. The result must beInstalled. - Confirm the .NET 4.8 release key as in step 4 of the prerequisites. If the value is below
528040, install the latest servicing update:wusa /quiet /norestart /kb:5011048(the May 2022 cumulative update for Windows 10 LTSC raises 4.8 to release 528465). - Restart the computer. After the restart, confirm the registry value
PendingFileRenameOperationsis empty. - Relaunch SQL Server 2019 Setup as Administrator from the extracted media folder (not from a network share).
This single method resolves approximately 60% of the restart-loop reports in the field. The remaining 40% are split between pending Windows updates and locked installation media.
6. Solution Method 2 — Apply Pending Windows Updates
- Open Settings → Windows Update → Check for updates.
- Install every pending update, including Servicing Stack Updates (SSU) and .NET Framework 4.8 cumulative updates. SQL Server 2019 Setup specifically checks for KB5034123 and the November 2022 SSU; the absence of these updates is recorded in
Summary.txtasRebootRequiredCheck= Failed with the extended message Pending reboot from a previous Windows update. - When prompted, perform the final restart. Do not defer the restart using
shutdown /a; deferral leaves the registry key populated. - Run
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager" /v PendingFileRenameOperationsand confirm the result isERROR_FILE_NOT_FOUND. - Verify the System event log:
Get-WinEvent -LogName System -MaxEvents 50 | Where-Object {$_.Message -like "*PendingFileRenameOperations*"}. There should be no new events. - Proceed with SQL Server 2019 Setup.
7. Solution Method 3 — Extract Installation Files Outside %TEMP%
Extracting SQLServer2019-x64-ENU.iso to a controlled, non-temporary directory is mandatory for engineering stations running Controlled Folder Access or aggressive endpoint protection.
- Disable Controlled Folder Access temporarily:
Set-MpPreference -EnableControlledFolderAccess 0. Re-enable it after the install:Set-MpPreference -EnableControlledFolderAccess 1. - Add the SQL Server Setup directory to the Windows Defender exclusion list (path-based, not process-based):
Add-MpPreference -ExclusionPath "C:\Install\SQL2019". - Mount the ISO with the right-click → Mount command, or extract with
7z x SQLServer2019-x64-ENU.iso -oC:\Install\SQL2019\. - Right-click
setup.exeand select Run as administrator. Do not launch from the ISO directly; the temporary mount point is recreated on each launch and will reset file locks. - Confirm the file
microsoft.sqlserver.configuration.extensibility_configextension.dllhas a valid Authenticode signature. In PowerShell:Get-AuthenticodeSignature "C:\Install\SQL2019\x64\microsoft.sqlserver.configuration.extensibility_configextension.dll". TheSignerCertificate.Subjectmust contain CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US. - Proceed with the install. After the install completes, remove the path exclusion from Windows Defender.
8. Related Failure: SQL Server 2019 / 2022 Database Engine Service Will Not Start
A second failure class that is commonly reported on the same workstation after the reboot loop is fixed is the "SQL Server database engine service failed to start" error. The error appears in Summary.txt as Exit code (Decimal): -2068119551 (hex 0x800F0900) and prevents the WinCC archive database from being created.
Root causes specific to the engine failure:
| Symptom | Exit Code (Hex) | Likely Root Cause | Remediation |
|---|---|---|---|
| Engine service fails to start; event 7000 in System log | 0x800F0900 | SQL Server service account lacks Log on as a service right | Add the service account via secpol.msc → Local Policies → User Rights Assignment |
| Engine service fails to start; event 7009; timeout 30000 ms | 0x80004005 | TCP/IP protocol disabled, or Named Pipes disabled, or SQL Browser not running | SQL Server Configuration Manager → Protocols for MSSQLSERVER → Enable TCP/IP, restart service |
| Engine fails to start; tempdb path missing | 0x80070003 | Move-data drive removed or path not accessible to service account | Reassign tempdb paths in sqlservr.exe -m -T3608 -T902 recovery mode |
| Engine fails; errorlog shows "Cannot find certificate" | 0x80092004 | Force encryption enabled but certificate removed | Open SQL Server Configuration Manager → SQL Server Network Configuration → clear Force Encryption |
| Engine fails; errorlog shows "FCB::Open failed: Could not open file master.mdf" | 0x80070005 | Service account lacks read/write on DATA directory | Grant NT SERVICE\MSSQLSERVER Full Control on the data and log directories |
When WinCC Professional is configured to use a SQL Server instance, the WinCC Configuration Studio reads the registry value HKLM\SOFTWARE\Siemens\Automation\WinCC\SQLServer to determine the target server. If the engine is not running, WinCC Runtime will fail to start with event ID 4900 from source CCWriteArchive and 4920 from source CCAlarmLogging. The fix is to first repair the SQL Server engine before relaunching WinCC services.
9. SQL Server 2019 Setup Rule Reference
The rules evaluated before the install advances to the feature selection page are documented in the SQL Server 2019 setup rules reference. The three rules that produce the reboot-loop symptom are:
-
RebootRequiredCheck — checks
PendingFileRenameOperationsand the RebootRequired flag in the WUA registry tree. - WmiServiceStateCheck — confirms the WMI service is running. A stopped WMI service can also produce a reboot-loop symptom on Windows 10 LTSC 21H2 when the WinMgmt service is disabled by an earlier Group Policy push.
-
MediaPathCheck — confirms that the path of the current
setup.exedoes not contain characters that the Windows API cannot represent. Mounting an ISO on a path containing parentheses or unicode characters is a known trigger.
10. Verification After the Install
- Open SQL Server Configuration Manager and confirm the SQL Server (MSSQLSERVER) service is in the Running state with Startup Type = Automatic.
- Connect to the engine with
sqlcmd -S localhost -Eand runSELECT @@VERSION;. Expected output:Microsoft SQL Server 2019 (RTM-CU...) .... - Open the WinCC Configuration Studio and confirm the Database tab reports a green status indicator on the archive server.
- Check the WinCC startup list:
HKEY_LOCAL_MACHINE\SOFTWARE\Siemens\Automation\WinCC\Startup. All required WinCC services (CCArchiveManager, CCAlarmServer, CCRuntime) must be present and set to 1. - Launch the WinCC Runtime simulator and load the test project. Confirm that the alarm log fills with synthetic test alarms and that the archive database grows.
11. Field-Proven Best Practices
- Always image the engineering station with the Microsoft .NET Framework 3.5 feature enabled before deploying the SQL Server media. This avoids 80% of restart-loop reports.
- Disable Windows Defender Controlled Folder Access during the SQL Server install window, and add a path-based exclusion rather than a process-based one for setup binaries.
- Use the offline .NET 3.5 source from
D:\sources\sxs. OnlineInstall-WindowsFeature calls on a managed network can return 0x800F0906 because of WSUS source redirection. - When the install must be scripted (silent install), use
setup.exe /ConfigurationFile=ConfigurationFile.ini /Q /IACCEPTSQLSERVERLICENSETERMS /ACTION=Installand pre-stage theConfigurationFile.iniwith the WinCC-specific instance nameWINCC. - After a successful install, do not remove the SQL Server (MSSQLSERVER) service account from the local Administrators group. WinCC archive writes are denied when the service account loses the Log on as a service right.
- If the install is being driven by Siemens Automation License Manager (ALM) or the PCS 7 setup wrapper, check the Siemens Automation\Setup log directory
%programdata%\Siemens\Automation\Setup\Logfor the SQL Server setup return code. The wrapper treats any non-zero return as a fatal error and will not start the next component.
12. Frequently Asked Questions
Why does SQL Server 2019 Setup always ask for a restart, even on a freshly installed Windows 10 LTSC 21H2?
Because .NET Framework 3.5 is disabled by default on Windows 10 LTSC 21H2, SQL Server 2019 Setup misclassifies the missing feature as a pending reboot and refuses to advance. Enable the feature with Install-WindowsFeature -Name Net-Framework-Core -Source D:\sources\sxs and the rule will pass.
Is it safe to clear the PendingFileRenameOperations registry value manually?
It is safe only when you have confirmed that all pending renames have actually completed. Verify with find /c "\\??\\" <export> on the exported .reg file, and check %WinDir%\WinSxS\pending.xml for an empty file size. A non-empty pending.xml means a rename is still queued and the registry value must not be cleared.
Does extracting the SQL Server media to the Desktop actually help?
Yes, when the original extraction path under %TEMP% is being scanned by Windows Defender in real time. The %TEMP% directory is one of the default protected folders; the Desktop is not, by default. The setup will then complete file-copy operations before any antivirus handler can lock the binary.
What is the difference between the SQL Server 2019 and 2022 restart-loop error?
SQL Server 2022 has the same RebootRequiredCheck rule, but it adds a stricter validation of the Microsoft OLE DB Driver 19 presence. When the OLE DB driver is missing, SQL Server 2022 Setup reports RebootRequiredCheck as failed even on a clean system. Install the driver first: msoledbsql.msi from the Microsoft download center.
How do I know whether the install failed at the prerequisite phase or at the engine-start phase?
Open %programfiles%\Microsoft SQL Server\150\Setup Bootstrap\Log\<timestamp>\Summary.txt. If the last line is Rule 'RebootRequiredCheck' failed, the failure is in the prerequisite phase (sections 5–7 of this article). If the last line is Exit code (Decimal): -2068119551 or 0x80004005, the engine is failing to start (section 8).