Windows 8/8.1: odinstalace předinstalovaných aplikací

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

Comments are closed.