Ve Windows 8/8.1 bývají často nainstalované aplikace v podobě bloatwaru – typicky McAfee Security a dalších x miliónů BING, pro čechy nepoužitelných šmejdů. Tyto aplikace se dají snadno odinstalovat, avšak problém bývá u tzv. Metro Apps či Modern Apps, které i po odinstalování se vždy novému uživateli opět nainstalují. To může být někdy pěkně deprimující, uvážíme-li, že na jednom počítači může pracovat i větší počet lidí.
Pro zobrazení aktuálního seznamu Metro Apps budeme používat PowerShell, který je potřeba spustit jako správce a dále použijeme příkaz:
PS C:\Get-AppxPackage -AllUsers | ft PackageFullName
Pokud zadáme příkaz bez přepínače format table, zobrazí se podrobný popis všech aplikací. Co se nám může hodit je hodnota Staged u PackageUserInformation. Status Staged znamená, že je aplikace připravena na instalaci pro každý nový uživatelský profil.
Odebrání aplikací
Následující příkaz odebere všechny Modern Apps ze systémového účtu:
PS C:\Get-AppxProvisionPackage -Online | Remove-AppxProvisionedPackage
To znamená, že jakýkoliv další nově vytvořený profil na daném počítači již nebude obsahovat předinstalované Modern Apps.
Pro smazání Modern Apps z aktualáně přihlášeného profilu stačí napsat:
PS C:\Get-AppxPackage | Remove-AppxPackage
nebo v přídě, že chceme aplikace odebrat pouze z některého uživatelského účtu:
PS C:\Get-AppxPackage -User <username> | Remove-AppxPackage
anebo nejdůležitější příkaz pro odebrání všech aplikací od všech uživatelů:
PS C:\Get-AppxPackage -AllUsers | Remove-AppxPackage
Odebrání aplikací pomocí skriptu
Jelikož mi ne vždycky tyto příkazy fungují, níže kopíruji skript pro smazání všech aplikací. Tento skript je vyzkoušen a opravdu aplikace smaže.
Pozor, ke spouštění powershellového skriptu je potřeba nejdříve nastavit ExecutionPolicy z Restricted na RemoteSigned, a po vykonání zase vrátit zpět (bezpečnost).
[PS] C:\Get-ExecutionPolicy
Restricted
[PS] C:\Set-ExecutionPolicy RemoteSigned
A nyní samotný skript, převzatý z http://blogs.technet.com/b/deploymentguys/archive/2013/10/21/removing-windows-8-1-built-in-applications.aspx
<# ************************************************************************************************************ Purpose: Remove built in apps specified in list Pre-Reqs: Windows 8.1 ************************************************************************************************************ #> #--------------------------------------------------------------------------------------------------------------- # Main Routine #--------------------------------------------------------------------------------------------------------------- # Get log path. Will log to Task Sequence log folder if the script is running in a Task Sequence # Otherwise log to \windows\temp try { $tsenv = New-Object -COMObject Microsoft.SMS.TSEnvironment $logPath = $tsenv.Value("LogPath") } catch { Write-Host "This script is not running in a task sequence" $logPath = $env:windir + "\temp" } $logFile = "$logPath\$($myInvocation.MyCommand).log" # Start logging Start-Transcript $logFile Write-Host "Logging to $logFile" # List of Applications that will be removed $AppsList = "microsoft.windowscommunicationsapps","Microsoft.BingFinance","Microsoft.BingMaps",` "Microsoft.BingWeather","Microsoft.ZuneVideo","Microsoft.ZuneMusic","Microsoft.Media.PlayReadyClient.2",` "Microsoft.XboxLIVEGames","Microsoft.HelpAndTips","Microsoft.BingSports",` "Microsoft.BingNews","Microsoft.BingFoodAndDrink","Microsoft.BingTravel","Microsoft.WindowsReadingList",` "Microsoft.BingHealthAndFitness","Microsoft.WindowsAlarms","Microsoft.Reader","Microsoft.WindowsCalculator",` "Microsoft.WindowsScan","Microsoft.WindowsSoundRecorder","Microsoft.SkypeApp" ForEach ($App in $AppsList) { $Packages = Get-AppxPackage | Where-Object {$_.Name -eq $App} if ($Packages -ne $null) { Write-Host "Removing Appx Package: $App" foreach ($Package in $Packages) { Remove-AppxPackage -package $Package.PackageFullName } } else { Write-Host "Unable to find package: $App" } $ProvisionedPackage = Get-AppxProvisionedPackage -online | Where-Object {$_.displayName -eq $App} if ($ProvisionedPackage -ne $null) { Write-Host "Removing Appx Provisioned Package: $App" remove-AppxProvisionedPackage -online -packagename $ProvisionedPackage.PackageName } else { Write-Host "Unable to find provisioned package: $App" } } # Stop logging Stop-Transcript