v1.5.0
SPSConfigKit - Release Notes
[1.5.0] - 2026-07-07
Added
- The domain controller publishes DNS A records for the farm host names (#33)
CfgAppPdcgains an optionalNonNodeData.DnsRecordslist
(@{ Name; IPAddress }) and creates each A record in the domain zone with
Add-DnsServerResourceRecordA, so the SharePoint web-application and Office
Online host names (sharepoint.<domain>,oosweb.<domain>) resolve.
Without them, farm creation fails at the WOPI binding step with
"The server did not respond". Native DnsServer module (no new dependency),
idempotent per record.
- Optional domain-join helper for cloud nodes (#18)
- New
scripts/init/Add-DscNodeToDomain.ps1(+.psd1) points a node's DNS at
the domain controller and joins it to Active Directory before the node's DSC
configuration is applied. A freshly provisioned cloud VM (e.g. Azure, whose
default DNS is 168.63.129.16) cannot otherwise resolve or join the domain.
The helper is idempotent (skips when already a member), sets DNS only when
DnsServersis provided (on-prem nodes with working DNS leave it@()),
waits for the domain LDAP SRV record, joins with theSecrets.psd1
JoinAccountcredential (ADSETUPby default) honouring an optional
OUPath, and restarts after a readable countdown (RestartDelaySec).
- New
- The pull server now publishes the SoftwarePackages SMB share (#19)
CfgAppPull.ps1creates<Drives.Data>\SoftwarePackagesand publishes it as
the SMB share named after the last segment ofNonNodeData.SourcePath
(nativeNew-SmbShare, no new DSC module, idempotent). A new optional
NonNodeData.SoftwarePackagesShare.ReadAccesslist (default
'Authenticated Users') lets production lock the share down. Nodes no longer
need the share created by hand before they can pull binaries.
- Dashboard
-Action Installprovisions the node manifest share (#23)SPSDscDashboard.ps1 -Action Installnow creates theNodeManifestPath
folder and publishes it as an SMB share (member nodes write their
<NodeName>.jsonthere at LCM registration viaCfgLcmPull.ps1 -NodeManifestPath). Name and write access come from an optional
NodeManifestShareblock inSPSDscDashboard.psd1(default share name = the
folder leaf, defaultChangeAccess = 'Authenticated Users'). A UNC
NodeManifestPathis left untouched.-Action Defaultis unchanged.
Changed
- Faster software-package downloads (#16)
Initialize-SoftwarePackages.ps1sets$ProgressPreference = 'SilentlyContinue'
(the Invoke-WebRequest progress bar made multi-GB downloads an order of
magnitude slower on Windows PowerShell 5.1) and adds anInvoke-SPSDownload
helper that prefersStart-BitsTransfer(resumable, faster) and falls back to
Invoke-WebRequestwhen BITS is unavailable.
Fixed
- Remote Event Log Management firewall rule no longer drifts every pass (#35)
- The
SYSTEM_EnableRemoteEventLogManagementScript tested theDomainprofile
but enabled the rule with-Profile Any, so its Test never matched its Set and
the resource re-ran every consistency check (a permanent, error-free drift on
all four configs). The Test now checks theAnyprofile.
- The
- CfgAppSps default disk Ids match the SharePoint VMs (no temp disk) (#32)
CfgAppSps.psd1shipped the temp-disk layout (0/2/3), but the SharePoint VM
sizes (APP / SCH / WFE) have no Azure temp disk, so their real layout is 0/1/2.
Defaulted DATA to disk Number 1 and LOGS to Number 2; a VM with a temp disk
still shifts to 0/2/3 (as PDC/PULL/SQL use).
- Extracted ISO content is now unblocked (Mark-of-the-Web) (#30)
Initialize-SoftwarePackagesunblocked directly-downloaded files but not
content extracted from ISOs. Mounting a downloaded ISO propagates the
Mark-of-the-Web to the copied files, soprerequisiteinstaller.exestayed
blocked and SharePoint'sSPInstallPrereqsfailed. The extracted content is
now unblocked recursively.
- SQL Server TCP/IP protocol is now enabled, not just its port (#29)
CfgAppSqlset the IPAll TCP port but never enabled the TCP/IP protocol, so
Configuration Manager showed TCP/IP = Disabled and the instance listened on no
TCP port — SharePoint and remote clients failed with "SQL Server does not exist
or access denied". ASqlProtocolresource now enables TcpIp (with a service
restart) before the port is set.
- CfgAppSps CU references now match the package manifest (#28)
- The SharePoint (
UberCumulativeUpdate) and OOS (CUFileName) cumulative
updates referenced byCfgAppSps.psd1pointed at older KBs than
Initialize-SoftwarePackages.psd1downloads, so a fresh farm's patch step
looked for a CU that was never fetched. Aligned to the downloaded CUs
(SharePointkb5002863, OOSkb5002871).
- The SharePoint (
- Dashboard shows a node's last real state while a run is in flight (#34)
- A node whose LCM is mid-consistency-check has an in-progress report on top
(no Status, sentinelEndTime); the dashboard picked it and showedUnknown,
hiding the real state. It now selects the most recent report with a definitive
Status (Success/Failure).
- A node whose LCM is mid-consistency-check has an in-progress report on top
- Dashboard renders node errors and timestamps cleanly (#25)
- Failed-node error banners showed raw report JSON with undecoded
\uXXXX
escapes; they now display the human-readableErrorMessage. A node with no
valid report yet (e.g. midUpdate-DscConfiguration) showed the sentinel
date1899-12-30; it now renders—.
- Failed-node error banners showed raw report JSON with undecoded
- CfgAppSql no longer creates a duplicate SqlLogin for the FARM account (#24)
- When the farm account is also a SQL sysadmin (the default posture), the
SQLSysAdministratorsloop and the separateMIDDLEWARE_SqlLogin_FARMblock
created twoSqlLoginresources for the same login, which DSC rejected with
"conflicting values of PsDscRunAsCredential". The FARM login is now created
only when it is not already inSQLSysAdministrators, and the dependent
dbcreator / securityadminSqlRolegrants point at whichever login exists.
- When the farm account is also a SQL sysadmin (the default posture), the
- SQL configuration resources run under a SQL sysadmin account (#26)
SqlLogin/SqlRole/SqlMemory/SqlMaxDop/SqlProtocolTcpIPran
withPsDscRunAsCredential = $ADSETUP, whichSqlSetupnever grants sysadmin,
so every SQL resource failed with "Failed to connect to SQL instance"
(SQLCOMMON0019). They now run under$SETUP(a member of the default
SQLSysAdministrators, so a sysadmin from install).
- PDC
WaitForADDomainno longer loops after a new-forest promotion (#17)- Removed
Credential = $ADSETUP/WaitForValidCredentials = $truefrom
WaitForADDomain WaitForDCReady: on the DC itself (running as SYSTEM) that
impersonated a domain account this configuration has not created yet, so the
resource never found the DC and loopedWaitTimeout×RestartCount.
- Removed
- Pull server MOF can now be applied when document encryption is enabled (#20)
- Added
CertificateID = $Node.Thumbprintto the pull server's
LocalConfigurationManagerblock (matching SQL/SPS/PDC), so the LCM can
decrypt the encrypted MOF instead of failing with "The Local Configuration
Manager is not configured with a certificate". The pull quick-start now also
documents theSet-DscLocalConfigurationManagermeta-config step.
- Added
- Pull server resolves its own certificate paths locally (#22)
CfgAppPull.ps1derives theDscPull.cer/.pfxpaths from the local
Data drive (<Drives.Data>\<share leaf>, e.g.F:\SoftwarePackages) instead
of its own UNC share, removing a chicken-and-egg (the share is published by
the same MOF, so the UNC did not resolve at first apply andxDscWebService
failed on the0000…sentinel thumbprint). The other configurations keep
reading from the UNC share.
Changelog
A full list of changes in each version can be found in the change log