WindowsUpdateTools.psd1
|
# # Module manifest for module 'WindowsUpdateTools' # # Generated by: Anthony Balloi - CSOLVE # # Generated on: 6/16/2025 # @{ # Script module or binary module file associated with this manifest. RootModule = 'WindowsUpdateTools.psm1' # Version number of this module. ModuleVersion = '1.8.2' # Supported PSEditions CompatiblePSEditions = @('Desktop', 'Core') # ID used to uniquely identify this module GUID = 'a8f8e8d0-4c1e-4b2f-9a3d-1e5f7c9b2a4d' # Author of this module Author = 'Anthony Balloi - CSOLVE, Alex Appleton - CSOLVE' # Company or vendor of this module CompanyName = 'CSOLVE' # Copyright statement for this module Copyright = '(c) 2025 CSOLVE. All rights reserved.' # Description of the functionality provided by this module Description = 'Enterprise Windows Update diagnostics and guarded remediation with bounded WUA searches, Intune/Windows Autopatch orchestration awareness, SetupDiag integration, and structured health reporting.' # Minimum version of the PowerShell engine required by this module PowerShellVersion = '5.1' # Name of the PowerShell host required by this module # PowerShellHostName = '' # Minimum version of the PowerShell host required by this module # PowerShellHostVersion = '' # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. DotNetFrameworkVersion = '4.7.2' # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. # ClrVersion = '' # Processor architecture (None, X86, Amd64) required by this module ProcessorArchitecture = 'None' # Modules that must be imported into the global environment prior to importing this module # RequiredModules = @() # Assemblies that must be loaded prior to importing this module # RequiredAssemblies = @() # Script files (.ps1) that are run in the caller's environment prior to importing this module. # ScriptsToProcess = @() # Type files (.ps1xml) to be loaded when importing this module # TypesToProcess = @() # Format files (.ps1xml) to be loaded when importing this module # FormatsToProcess = @() # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess # NestedModules = @() # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. FunctionsToExport = @( 'Test-WindowsUpdateHealth', 'Repair-WindowsUpdate', 'Invoke-BuildUpgrade', 'Get-BuildUpgradeStatus', 'Get-UpdateFailureReport', 'Get-ServicingDiagnostics', 'Install-WindowsUpdate', 'Get-Windows11ISO', 'Invoke-ComponentStoreRepairWithISO', 'Debug-WindowsUpdateAgent', 'Get-PendingUpdates', 'Get-WUHResultDescription', 'Get-UpdateConfiguration' ) # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. CmdletsToExport = @() # Variables to export from this module VariablesToExport = @( 'ExitCodes' ) # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. AliasesToExport = @( 'Test-WUHealth', 'Repair-WU', 'Get-UpdateFailure', 'Get-WUConfig' ) # DSC resources to export from this module # DscResourcesToExport = @() # List of all modules packaged with this module # ModuleList = @() # List of all files packaged with this module FileList = @( 'WindowsUpdateTools.psm1', 'WindowsUpdateTools.psd1', 'Public\Test-WindowsUpdateHealth.ps1', 'Public\Repair-WindowsUpdate.ps1', 'Public\Invoke-BuildUpgrade.ps1', 'Public\Get-BuildUpgradeStatus.ps1', 'Public\Get-UpdateFailureReport.ps1', 'Public\Get-ServicingDiagnostics.ps1', 'Public\Install-WindowsUpdate.ps1', 'Private\Write-WULog.ps1', 'Private\Get-WUSystemInfo.ps1', 'Private\Test-WUServices.ps1', 'Private\Get-WUEventLogs.ps1', 'Private\Test-WUComponentStore.ps1', 'Private\Resolve-WUSystemPartition.ps1', 'Private\Resolve-WUGenericErrors.ps1', 'Private\Invoke-WUComprehensiveRemediation.ps1', 'Private\Remove-WUProblematicDrivers.ps1', 'Private\Clear-WUUpgradeBlockingRegistry.ps1', 'Private\Invoke-WUEnhancedDiskCleanup.ps1', 'Private\Resolve-WUWSUSIssues.ps1', 'Private\Invoke-WUTroubleshooter.ps1', 'Private\Invoke-WUSetupDiag.ps1', 'Private\New-WUHealthIssue.ps1', 'Private\Get-WUConfiguration.ps1', 'Private\Get-WUPendingUpdates.ps1', 'Private\Get-WUSystemHealth.ps1', 'Private\Get-WUUpdateHistory.ps1', 'Private\Resolve-WUComponentStore.ps1', 'Private\Test-WUWindows11Compatibility.ps1', 'Private\Resolve-WUAppraiserIssues.ps1', 'Private\Resolve-WUDynamicUpdatesIssues.ps1', 'Private\Get-WUSetupLogsDirect.ps1', 'Private\Resolve-WUDuplicateProfiles.ps1', 'Public\Get-Windows11ISO.ps1', 'Public\Get-WUHResultDescription.ps1', 'Private\Resolve-WUDriverDetails.ps1', 'Public\Invoke-ComponentStoreRepairWithISO.ps1', 'Public\Debug-WindowsUpdateAgent.ps1', 'Public\Get-PendingUpdates.ps1', 'Public\Get-UpdateConfiguration.ps1', 'Private\Invoke-WUSearch.ps1', 'Private\Assert-WUManualUpdateActionAllowed.ps1', 'README.md' ) # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. PrivateData = @{ PSData = @{ # Tags applied to this module. These help with module discovery in online galleries. Tags = @( 'WindowsUpdate', 'Remediation', 'Diagnostics', 'Enterprise', 'Intune', 'Autopatch', 'WindowsUpdateForBusiness', 'SCCM', 'SetupDiag', 'Windows10', 'Windows11', 'WSUS', 'Troubleshooting', 'Automation', 'SystemAdmin' ) # A URL to the license for this module. LicenseUri = 'https://github.com/YourOrg/WindowsUpdateTools/blob/main/LICENSE' # A URL to the main website for this project. ProjectUri = 'https://www.csolve.ca' # A URL to an icon representing this module. IconUri = 'https://github.com/YourOrg/WindowsUpdateTools/blob/main/icon.png' # ReleaseNotes of this module ReleaseNotes = @' New in 1.8.2: - **Gallery package import fix**: Converted the zero-byte public Get-WUHResultDescription placeholder into a non-empty export marker. PowerShell Gallery omits empty files, which made the published 1.8.1 manifest reference a missing path even though the real private implementation was present. New in 1.8.1: - **ISO wrapper edition fix**: Get-Windows11ISO now translates the public Pro edition value to the Professional value required by the private Fido downloader. - **Safe private invocation**: Get-Windows11ISO now passes only parameters declared by the private downloader instead of splatting public-only parameters. - **ISO download file logging**: -LogPath now scopes private downloader/helper logging to the requested file without leaking that setting into unrelated module calls. New in 1.8.0: - **Bounded WUA diagnostics**: Pending-update searches run in an isolated process with a configurable hard timeout, preventing an unhealthy Windows Update Agent from hanging the parent diagnostic indefinitely. - **Explicit scan outcome**: Test-WindowsUpdateHealth reports Completed, TimedOut, Failed, or Skipped instead of treating a failed scan as zero pending updates. - **Cloud orchestration awareness**: Configuration output distinguishes confirmed endpoint evidence from Autopatch status that requires authoritative Intune/Graph validation. - **Policy-scoped reporting**: WUA results are labeled as policy-scoped and cannot be misread as bypassing approvals, rollout timing, safeguard holds, or scan-source policy. - **Safe mutation defaults**: Local WUA installs, feature upgrades, and policy-disruptive repairs are blocked by default when Intune/WUfB enrollment is detected. Expert operators can use -OverrideCloudOrchestration after validating the cloud deployment and maintenance window. - **Import repair**: Fixed the unmatched ISO download block in Invoke-BuildUpgrade that prevented version 1.7.9 from importing. - **Output fixes**: Pending update objects now consistently include type, KB IDs, security bulletin IDs, normalized size, and scan scope. CRITICAL BUG FIX with 1.7.9: - **FIXED: ISOUrl Using Wrong ISO**: When -ISOUrl parameter was specified, the code incorrectly used any existing Win11*.iso file instead of downloading/using the specified URL - **Root Cause**: Code checked for existing ISOs BEFORE checking if ISOUrl was provided, causing Enterprise ISOs to be ignored when consumer ISOs existed - **Fix**: When -ISOUrl is provided, only use ISO matching that specific filename (skip generic Win11*.iso search) - **Improved Existing ISO Detection**: Pattern now includes SW_DVD9 prefix for Enterprise ISOs - **Better Logging**: Now logs "ISO Source: Custom URL - [url]" when using ISOUrl parameter - **FIXED: UseGetUrl Backwards Compatibility**: Invoke-BuildUpgrade now checks if Get-WUWindows11ISO supports UseGetUrl parameter before using it Bug Fix with 1.7.8: - **FIXED: Duplicate Profile Detection from SetupDiag Results**: Now detects duplicate profile issues from SetupDiag's own FailureReasons array - **Complete Coverage**: Duplicate profile detection now works from three sources: SetupDiag results, direct log analysis enhancement, and fallback analysis - **Improved Accuracy**: SID extraction using regex matches to capture all affected profile SIDs from SetupDiag output Bug Fix with 1.7.7: - **FIXED: Fallback Analysis Missing Errors**: Get-WUSetupLogsDirect now includes AdditionalErrors from diagerr.xml for duplicate profile detection - **FIXED: Duplicate Profile Detection in Fallback Scenario**: Detection now works when SetupDiag fails and direct log analysis is used - **Complete Fix**: Duplicate profile issues now properly detected and displayed in recommendations regardless of SetupDiag success/failure Bug Fix with 1.7.6: - **FIXED: Duplicate Profile Recommendations Not Displayed**: Critical and Warning issue remediation now properly shows duplicate profile cleanup recommendations - **FIXED: Fallback Analysis Missing Errors**: Get-WUSetupLogsDirect now includes AdditionalErrors from diagerr.xml for duplicate profile detection - **FIXED: Duplicate Profile Detection in Fallback Scenario**: Detection now works when SetupDiag fails and direct log analysis is used - **Enhanced Output**: Duplicate profile issues now display affected SID count and clear remediation steps in both SetupDiag and fallback scenarios - **Improved User Experience**: Test-WindowsUpdateHealth now correctly highlights duplicate profile issues blocking upgrades regardless of analysis method New Feature with 1.7.5: - **NEW: Duplicate Profile Registry Detection**: Automatically detects orphaned user profile SIDs that block Windows upgrades - **Resolve-WUDuplicateProfiles**: New function to remove duplicate Administrator profile registry entries - **Error 0x8007001F / 0x000004E5 Resolution**: Fixes "Duplicate profile detected" errors from domain/workgroup changes - **Enhanced Test-WindowsUpdateHealth**: Now detects duplicate profile issues in SetupDiag analysis - **Repair-WindowsUpdate -DuplicateProfiles**: New switch to clean up orphaned profile SIDs - **Automatic Remediation**: Identifies active vs. orphaned SIDs and safely removes conflicts New Feature with 1.7.1: - **NEW: Get-BuildUpgradeStatus** - Monitor active Windows build upgrade progress in real-time - **Progress Tracking**: Shows percentage complete, current stage, and runtime - **Detailed Mode**: View recent setup log entries with -Detailed parameter - **Follow Mode**: Continuously monitor with -Follow parameter (auto-refresh every 10 seconds) - **Error Detection**: Automatically shows recent errors if detected during upgrade CRITICAL FIX with 1.7.0: - **FIXED: Incorrect EULA Parameter**: Changed from `/AcceptEula` to `/EULA accept` per Microsoft documentation - **Resolves Setup Hang Issue**: Setup was waiting for EULA acceptance with incorrect parameter format - **Windows 11 Requirement**: `/EULA accept` is mandatory for Windows 11 silent upgrades (returns 0xC190010E if missing) - **Proper Parameter Order**: Moved EULA acceptance before other parameters for better compatibility - **Reference**: https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-setup-command-line-options Critical Fix with 1.6.9: - **FIXED: ISO Upgrade EULA Acceptance**: Added missing /AcceptEula parameter to setup.exe command for automated upgrades - **Resolved Error 0xC190010E**: Fixes "User did not accept EULA at downlevel OS" error that caused silent upgrades to fail - **Enhanced Unattended Installation**: Both ISO-based and upgrade assistant methods now properly accept EULA automatically - **Improved Reliability**: Unattended Windows 11 upgrades now complete without waiting for user interaction Fix with 1.5.84: - **FIXED: Incorrect OS Build Number Detection**: After Windows 11 feature updates, WMI can report stale build numbers. Now uses registry CurrentBuild which is always accurate - **Added FullBuildVersion**: Reports complete version string with UBR (e.g., 26200.7171) matching Defender/Intune reporting - **Added DisplayVersion**: Shows friendly version name (e.g., 25H2) in diagnostics - **Exported Missing Functions**: Get-PendingUpdates and Get-WUHResultDescription now properly exported Critical Fix with 1.5.38: - **RESOLVED: Invalid Windows language provided error**: Fixed language mapping conversion from system locale codes (like 'en-us') to Fido language names (like 'English International') - **Comprehensive Language Support**: Added complete language mapping based on official Fido repository analysis covering 40+ languages - **Enhanced ISO Download Reliability**: Windows 11 ISO downloads now work correctly for all supported system locales - **Better Language Detection**: Improved automatic language detection with proper Fido format conversion Historical release notes before 1.5.38 are omitted from the Gallery manifest to remain within Gallery metadata limits. '@ # Prerelease string of this module # Prerelease = '' # Flag to indicate whether the module requires explicit user acceptance for install/update/save RequireLicenseAcceptance = $false # External dependent modules of this module # ExternalModuleDependencies = @() } # End of PSData hashtable } # End of PrivateData hashtable # HelpInfo URI of this module HelpInfoURI = 'https://github.com/YourOrg/WindowsUpdateTools/blob/main/docs/' # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. # DefaultCommandPrefix = '' } |