<# .SYNOPSIS Collects the hardware data needed to check Windows 11 requirements and writes a CSV that the "Windows 11 readiness" page (https://digiacomo.info) can read. .DESCRIPTION Example script - Antonio Di Giacomo, 2026. Review and test it in a lab before using it in production. It needs PowerShell remoting (WinRM) to the computers and local admin rights on them (Get-Tpm). CSV columns: Computer, CPU, RAMGB, DiskGB, TPM, UEFI, SecureBoot CPU processor name (e.g. "Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz") RAMGB installed memory in GB DiskGB size of the system disk in GB TPM TPM specification version ("2.0", "1.2" or empty) UEFI True if Windows booted in UEFI mode SecureBoot True if Secure Boot is on The page then checks: supported CPU (simplified rule, see the page), RAM >= 4 GB, disk >= 64 GB, TPM 2.0, UEFI with Secure Boot capability. Microsoft's official list of supported processors remains the reference. .EXAMPLE .\Get-Win11Readiness.ps1 -ComputerName (Get-Content .\pc.txt) -OutFile .\win11.csv #> [CmdletBinding()] param( [string[]] $ComputerName = $env:COMPUTERNAME, [string] $OutFile = '.\win11.csv', [int] $ThrottleLimit = 32 ) $collect = { $cpu = (Get-CimInstance Win32_Processor | Select-Object -First 1).Name.Trim() $ram = [math]::Round((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB) $sysDisk = Get-Partition -DriveLetter ($env:SystemDrive.TrimEnd(':')) | Get-Disk $disk = [math]::Round($sysDisk.Size / 1GB) $tpm = '' try { $t = Get-CimInstance -Namespace root\cimv2\Security\MicrosoftTpm -ClassName Win32_Tpm -ErrorAction Stop if ($t) { $tpm = ($t.SpecVersion -split ',')[0].Trim() } } catch { } # the SecureBoot\State key exists only on computers booted in UEFI mode $uefi = Test-Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\State' $sb = $false try { $sb = [bool](Confirm-SecureBootUEFI -ErrorAction Stop) } catch { } [pscustomobject]@{ CPU = $cpu; RAMGB = $ram; DiskGB = $disk; TPM = $tpm; UEFI = $uefi; SecureBoot = $sb } } $rows = Invoke-Command -ComputerName $ComputerName -ScriptBlock $collect -ThrottleLimit $ThrottleLimit -ErrorAction SilentlyContinue | Select-Object @{ n = 'Computer'; e = { $_.PSComputerName } }, CPU, RAMGB, DiskGB, TPM, UEFI, SecureBoot $rows | Export-Csv -Path $OutFile -NoTypeInformation -Encoding UTF8 $missing = $ComputerName | Where-Object { $_ -notin $rows.Computer } Write-Host "$(@($rows).Count) computers written to $OutFile" if ($missing) { Write-Warning "Not reachable: $($missing -join ', ')" }