I realized that it's not that hard to remove or restore the pre-installed start-apps in Windows 10 on a per-user basis so I constructed module for my users containing 3 functions. The first 2 removes and restores start-apps and the third unpins all apps in start. The remove and restore functions checks for and displays a window where you select which apps you want removed/restored. You can use shift or ctrl when selecting apps.



[void] [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing"$activateWindow = { 
        $null = [reflection.assembly]::loadwithpartialname("Microsoft.visualbasic") 
        $isWindowFound = $false 
        while(-not $isWindowFound) { 
            try { 
                $isWindowFound = $true 
            catch { 
                sleep -Milliseconds 100 
$showWindowAsync = Add-Type –memberDefinition @”  
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);  
“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru 
function Remove-StartApps { 
 Windows Start Apps removal. 
 Lets an individual user remove the Start Apps of they're choosing with the exception of Connect, Microsoft Edge, Settings and Windows Security. 
 Author: Starman.cw 
$MyAppNms = ((Get-StartApps) | Where-Object {$_ -like "*!*" -and $_.AppID -notlike "*immersive*" -and $_.AppID -notlike "*SecHeal*" -and $_.AppID -notlike "*Cortana*" -and $_.AppID -notlike "*Edge*" -and $_.AppID -notlike "*PPIProj*" -and $_.Name -notlike "*alend*"}).Name | Sort-Object 
if (!(Test-Path -Path HKCU:\Software\Microsoft\RemovedStartApps)) {New-Item -Path HKCU:\Software\Microsoft\RemovedStartApps | Out-Null } 
$objForm = New-Object System.Windows.Forms.Form  
$objForm.Text = "Select an application:" 
$objForm.Size = New-Object System.Drawing.Size(300,340)  
$objForm.StartPosition = "CenterScreen" 
$OKButton = New-Object System.Windows.Forms.Button 
$OKButton.Location = New-Object System.Drawing.Size(75,270) 
$OKButton.Size = New-Object System.Drawing.Size(75,23) 
$OKButton.Text = "OK" 
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK 
$objForm.Controls.Add($OKButton$objForm.AcceptButton = $OKButton 
$CancelButton = New-Object System.Windows.Forms.Button 
$CancelButton.Location = New-Object System.Drawing.Size(150,270) 
$CancelButton.Size = New-Object System.Drawing.Size(75,23) 
$CancelButton.Text = "Cancel" 
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel 
$objForm.Controls.Add($CancelButton$objForm.CancelButton = $CancelButton 
$objLabel = New-Object System.Windows.Forms.Label 
$objLabel.Location = New-Object System.Drawing.Size(10,10)  
$objLabel.Size = New-Object System.Drawing.Size(280,100)  
$objLabel.Text = "Please select which start menu apps you want to remove. Multiple selection is possible:`n`nBe aware that removing Mail will also remove`nCalendar and vice versa.`n`nAnd that removing a self-installed app will`nrequire a manual re-installation." 
$objListBox = New-Object System.Windows.Forms.ListBox  
$objListBox.Location = New-Object System.Drawing.Size(10,125)  
$objListBox.Size = New-Object System.Drawing.Size(260,20)  
$objListBox.Height = 140 
$objListbox.SelectionMode = "MultiExtended" 
foreach ($App in $MyAppNms) { 
$objform.Controls.Add($objlistBox$objForm.Topmost = $True 
Start-Job $activateWindow -ArgumentList "Select an application:" | Out-Null 
#[void]$showWindowAsync::ShowWindowAsync((Get-Process –id $pid).MainWindowHandle, 2) 
$result = $objForm.ShowDialog() 
if ($result -eq "Cancel") 
     [void]$showWindowAsync::ShowWindowAsync((Get-Process –id $pid).MainWindowHandle, 10) 
     Remove-Job -State Completed 
if ($result -eq [System.Windows.Forms.DialogResult]::OK) 
    foreach ($App in $objListBox.SelectedItems) 
         $FamNm = (Get-StartApps | Where {$_.name -eq $App}).AppID | ForEach-Object {$_.Substring(0, $_.IndexOf('!'))} 
         $Name = (Get-AppxPackage -User $env:USERNAME | Where-Object {$_.PackageFamilyName -eq $FamNm}).PackageFullName 
         try { 
         Remove-AppxPackage -Package $Name -ErrorAction Stop 
         Set-ItemProperty -Path HKCU:\Software\Microsoft\RemovedStartApps -Name $App -Value $Name -Type String 
         } catch [System.IO.IOException] { 
         Write-Host "Nope! The $App App could not be removed, sorry." 
         $Err +$App + ',' 
if ($Err -ne $null) { 
     foreach ($Nm in ( ($Err.TrimEnd(',')).Split(',') )) { $objListBox.SelectedItems.Remove($Nm) } 
$MesComplete = $objListBox.SelectedItems 
Remove-Job -State Completed 
[Microsoft.VisualBasic.Interaction]::MsgBox("The Apps you selected:`n`n$($MesComplete | Out-String) `nHave been removed from start.""Information""Apps removed."| Out-Null 
[void]$showWindowAsync::ShowWindowAsync((Get-Process –id $pid).MainWindowHandle, 10) 
The module and it's functions have been tested and verified from Windows 10 1709 and forward.
Feel free to improve on this if you want.