$ErrorActionPreference = 'SilentlyContinue' $outDir = 'C:\install' if (-not (Test-Path $outDir)) { New-Item -Path $outDir -ItemType Directory -Force | Out-Null } $outFile = Join-Path $outDir 'WU-Diag.txt' if (Test-Path $outFile) { Remove-Item $outFile -Force } function Log { param([string]$Text) Add-Content -Path $outFile -Value $Text } function Section { param([string]$Title) Log '' Log ('=' * 70) Log "== $Title" Log ('=' * 70) Write-Host "Bezig: $Title" } Log "WU/SCCM Diagnose - $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" Log "Server: $env:COMPUTERNAME" # ------------------------------------------------------------- Section '1. OS informatie' $os = Get-CimInstance Win32_OperatingSystem Log "Caption: $($os.Caption)" Log "Build: $($os.BuildNumber)" Log "Version: $($os.Version)" Log "LastBoot: $($os.LastBootUpTime)" # ------------------------------------------------------------- Section '2. Laatste 10 hotfixes' Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10 HotFixID, Description, InstalledOn | Format-Table -AutoSize | Out-String | ForEach-Object { Log $_ } # ------------------------------------------------------------- Section '3. Pending reboot status' $cbsPending = Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending' $wuPending = Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired' $fileRename = (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager').PendingFileRenameOperations Log "CBS RebootPending: $cbsPending" Log "WU RebootRequired: $wuPending" Log "PendingFileRenameOperations: $([bool]$fileRename)" # ------------------------------------------------------------- Section '4. WindowsUpdate policy registry (volledig)' $wu = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' if (Test-Path $wu) { Get-ItemProperty $wu | Select-Object * -ExcludeProperty PS* | Format-List | Out-String | ForEach-Object { Log $_ } } else { Log 'Key bestaat niet' } # ------------------------------------------------------------- Section '5. WindowsUpdate\AU policy registry (volledig)' $au = "$wu\AU" if (Test-Path $au) { Get-ItemProperty $au | Select-Object * -ExcludeProperty PS* | Format-List | Out-String | ForEach-Object { Log $_ } } else { Log 'Key bestaat niet' } # ------------------------------------------------------------- Section '6. UX Settings (lokale WU config)' $ux = 'HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings' if (Test-Path $ux) { Get-ItemProperty $ux | Select-Object * -ExcludeProperty PS* | Format-List | Out-String | ForEach-Object { Log $_ } } else { Log 'Key bestaat niet' } # ------------------------------------------------------------- Section '7. WUA Service Manager (welke update sources kent WUA)' $sm = New-Object -ComObject Microsoft.Update.ServiceManager foreach ($s in $sm.Services) { Log "Name: $($s.Name) | Default: $($s.IsDefaultAUService) | Managed: $($s.IsManaged) | ServiceID: $($s.ServiceID)" } # ------------------------------------------------------------- Section '8. WUA versie' $wuaDll = Get-Item "$env:SystemRoot\System32\wuaueng.dll" Log "wuaueng.dll versie: $($wuaDll.VersionInfo.ProductVersion)" # ------------------------------------------------------------- Section '9. SCCM client info' $ccm = Get-CimInstance -Namespace root\ccm -ClassName SMS_Client Log "Client versie: $($ccm.ClientVersion)" $site = Get-CimInstance -Namespace root\ccm -ClassName SMS_Authority Log "Site: $($site.Name)" Log "MP: $($site.CurrentManagementPoint)" # ------------------------------------------------------------- Section '10. CCM UpdatesStore (alle updates + status)' Get-WmiObject -Namespace root\ccm\SoftwareUpdates\UpdatesStore -Class CCM_UpdateStatus | Select-Object Status, Article, Title, ScanTime | Sort-Object Status | Format-Table -AutoSize | Out-String -Width 300 | ForEach-Object { Log $_ } # ------------------------------------------------------------- Section '11. CCM Update Assignments (deployments die de client kent)' Get-WmiObject -Namespace root\ccm\Policy\Machine\ActualConfig -Class CCM_UpdateCIAssignment | Select-Object AssignmentName, AssignmentID, EnforcementDeadline, StartTime, SuppressReboot | Format-Table -AutoSize | Out-String -Width 300 | ForEach-Object { Log $_ } # ------------------------------------------------------------- Section '12. Aantal update CIs per assignment' $assignments = Get-WmiObject -Namespace root\ccm\Policy\Machine\ActualConfig -Class CCM_UpdateCIAssignment foreach ($a in $assignments) { $ciCount = ($a.AssignedCIs | Measure-Object).Count Log "$($a.AssignmentName): $ciCount CIs" } # ------------------------------------------------------------- Section '13. Software Center - wat de client als beschikbaar ziet' Get-CimInstance -Namespace root\ccm\ClientSDK -ClassName CCM_SoftwareUpdate | Select-Object ArticleID, Name, ComplianceState, EvaluationState, Deadline | Format-Table -AutoSize | Out-String -Width 300 | ForEach-Object { Log $_ } $suCount = (Get-CimInstance -Namespace root\ccm\ClientSDK -ClassName CCM_SoftwareUpdate | Measure-Object).Count Log "Totaal updates zichtbaar voor Software Center: $suCount" # ------------------------------------------------------------- Section '14. WUAHandler.log (laatste 60 regels)' Get-Content 'C:\Windows\CCM\Logs\WUAHandler.log' -Tail 60 | ForEach-Object { Log $_ } # ------------------------------------------------------------- Section '15. ScanAgent.log (laatste 40 regels)' Get-Content 'C:\Windows\CCM\Logs\ScanAgent.log' -Tail 40 | ForEach-Object { Log $_ } # ------------------------------------------------------------- Section '16. UpdatesDeployment.log (laatste 60 regels)' Get-Content 'C:\Windows\CCM\Logs\UpdatesDeployment.log' -Tail 60 | ForEach-Object { Log $_ } # ------------------------------------------------------------- Section '17. UpdatesHandler.log (laatste 40 regels)' Get-Content 'C:\Windows\CCM\Logs\UpdatesHandler.log' -Tail 40 | ForEach-Object { Log $_ } # ------------------------------------------------------------- Section '18. WindowsUpdate.log genereren (laatste 100 regels)' $wuLog = Join-Path $outDir 'WindowsUpdate.log' Get-WindowsUpdateLog -LogPath $wuLog | Out-Null if (Test-Path $wuLog) { Get-Content $wuLog -Tail 100 | ForEach-Object { Log $_ } } else { Log 'WindowsUpdate.log genereren mislukt' } # ------------------------------------------------------------- Section '19. GPO herkomst (gpresult samenvatting)' $gpFile = Join-Path $outDir 'gpresult.txt' gpresult /scope computer /v > $gpFile 2>&1 Log "Volledige gpresult staat in: $gpFile" $gpContent = Get-Content $gpFile $wuLines = $gpContent | Select-String -Pattern 'WindowsUpdate|Defer|DualScan|WUServer|Update' -Context 2, 2 foreach ($line in $wuLines) { Log $line.ToString() } Log '' Log "Diagnose compleet: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" Write-Host '' Write-Host "Klaar! Output staat in: $outFile" Write-Host "Extra bestanden: $wuLog en $gpFile"