If (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]'Administrator')) { Start-Process PowerShell.exe -ArgumentList ("-NoProfile -ExecutionPolicy Bypass -File `"{0}`"" -f $PSCommandPath) -Verb RunAs Exit } #disable ai registry keys Write-Host 'Applying Registry Keys...' #set for local machine and current user to be sure $hives = @('HKLM', 'HKCU') foreach ($hive in $hives) { Reg.exe add "$hive\SOFTWARE\Policies\Microsoft\Windows\WindowsCopilot" /v 'TurnOffWindowsCopilot' /t REG_DWORD /d '1' /f *>$null Reg.exe add "$hive\SOFTWARE\Policies\Microsoft\Windows\WindowsAI" /v 'DisableAIDataAnalysis' /t REG_DWORD /d '1' /f *>$null } Reg.exe add 'HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced' /v 'ShowCopilotButton' /t REG_DWORD /d '0' /f *>$null Reg.exe add 'HKCU\Software\Microsoft\input\Settings' /v 'InsightsEnabled' /t REG_DWORD /d '0' /f *>$null #force policy changes gpupdate /force >$null $aipackages = @( 'MicrosoftWindows.Client.Photon' 'MicrosoftWindows.Client.AIX' 'MicrosoftWindows.Client.CoPilot' 'Microsoft.Windows.Ai.Copilot.Provider' ) $provisioned = get-appxprovisionedpackage -online $appxpackage = get-appxpackage -allusers $eol = @() $store = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore' $users = @('S-1-5-18'); if (test-path $store) { $users += $((Get-ChildItem $store -ea 0 | Where-Object { $_ -like '*S-1-5-21*' }).PSChildName) } #uninstall packages #use eol trick to uninstall some locked packages foreach ($choice in $aipackages) { Write-Host "Removing $choice" if ('' -eq $choice.Trim()) { continue } foreach ($appx in $($provisioned | Where-Object { $_.PackageName -like "*$choice*" })) { $next = !1; foreach ($no in $skip) { if ($appx.PackageName -like "*$no*") { $next = !0 } } ; if ($next) { continue } $PackageName = $appx.PackageName; $PackageFamilyName = ($appxpackage | Where-Object { $_.Name -eq $appx.DisplayName }).PackageFamilyName New-Item "$store\Deprovisioned\$PackageFamilyName" -force >''; foreach ($sid in $users) { New-Item "$store\EndOfLife\$sid\$PackageName" -force >'' } ; $eol += $PackageName dism /online /set-nonremovableapppolicy /packagefamily:$PackageFamilyName /nonremovable:0 >'' remove-appxprovisionedpackage -packagename $PackageName -online -allusers >'' } foreach ($appx in $($appxpackage | Where-Object { $_.PackageFullName -like "*$choice*" })) { $next = !1; foreach ($no in $skip) { if ($appx.PackageFullName -like "*$no*") { $next = !0 } } ; if ($next) { continue } $PackageFullName = $appx.PackageFullName; New-Item "$store\Deprovisioned\$appx.PackageFamilyName" -force >''; foreach ($sid in $users) { New-Item "$store\EndOfLife\$sid\$PackageFullName" -force >'' } ; $eol += $PackageFullName dism /online /set-nonremovableapppolicy /packagefamily:$PackageFamilyName /nonremovable:0 >'' remove-appxpackage -package $PackageFullName -allusers >'' } } ## undo eol unblock trick to prevent latest cumulative update (LCU) failing foreach ($sid in $users) { foreach ($PackageName in $eol) { Remove-Item "$store\EndOfLife\$sid\$PackageName" -force -ErrorAction SilentlyContinue >'' } } Write-Host 'Removing Package Files...' #-----------------------------------------------------------------------remove files $appsPath = 'C:\Windows\SystemApps' $appsPath2 = 'C:\Program Files\WindowsApps' $pathsSystemApps = (Get-ChildItem -Path $appsPath -Directory -Force).FullName $pathsWindowsApps = (Get-ChildItem -Path $appsPath2 -Directory -Force).FullName $packagesPath = @() #get full path foreach ($package in $aipackages) { foreach ($path in $pathsSystemApps) { if ($path -like "*$package*") { $packagesPath += $path } } foreach ($path in $pathsWindowsApps) { if ($path -like "*$package*") { $packagesPath += $path } } } #import module to remove locked files try { Get-InstalledModule -Name RemoveFileZ -ErrorAction Stop | Out-Null } catch { Set-ExecutionPolicy Unrestricted -Force Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force | Out-Null Install-Module -Name RemoveFileZ -Force Import-Module -Name RemoveFileZ } foreach ($Path in $packagesPath) { Remove-FileZ -Path $Path -Recurse *>$null } #remove any screenshots from recall Write-Host 'Removing Any Screenshots...' Remove-Item -Path "$env:LOCALAPPDATA\CoreAIPlatform*" -Force -Recurse -ErrorAction SilentlyContinue