From c6cdf77312d7ba6f8f225b8b0224ebf0101772c0 Mon Sep 17 00:00:00 2001 From: Chris Titus Date: Tue, 18 Oct 2022 15:20:31 -0500 Subject: [PATCH] add store appx gui --- W10_11StoreApps.bat | 2 + W10_11StoreApps.ps1 | 448 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 450 insertions(+) create mode 100644 W10_11StoreApps.bat create mode 100644 W10_11StoreApps.ps1 diff --git a/W10_11StoreApps.bat b/W10_11StoreApps.bat new file mode 100644 index 00000000..71574267 --- /dev/null +++ b/W10_11StoreApps.bat @@ -0,0 +1,2 @@ +@echo off +powershell -noprofile -executionpolicy bypass -file W10_11StoreApps.ps1 diff --git a/W10_11StoreApps.ps1 b/W10_11StoreApps.ps1 new file mode 100644 index 00000000..ce247919 --- /dev/null +++ b/W10_11StoreApps.ps1 @@ -0,0 +1,448 @@ +$PackageList = ConvertFrom-Csv @' + Identity, Family + Clipchamp.Clipchamp, Clipchamp.Clipchamp_yxz26nhyzhsrt + Microsoft.AV1VideoExtension, Microsoft.AV1VideoExtension_8wekyb3d8bbwe + Microsoft.BingNews, Microsoft.BingNews_8wekyb3d8bbwe + Microsoft.BingWeather, Microsoft.BingWeather_8wekyb3d8bbwe + Microsoft.Cortana, Microsoft.549981C3F5F10_8wekyb3d8bbwe + Microsoft.DesktopAppInstaller, Microsoft.DesktopAppInstaller_8wekyb3d8bbwe + Microsoft.GamingApp, Microsoft.GamingApp_8wekyb3d8bbwe + Microsoft.GamingServices, Microsoft.GamingServices_8wekyb3d8bbwe + Microsoft.GetHelp, Microsoft.GetHelp_8wekyb3d8bbwe + Microsoft.Getstarted, Microsoft.Getstarted_8wekyb3d8bbwe + Microsoft.HEIFImageExtension, Microsoft.HEIFImageExtension_8wekyb3d8bbwe + Microsoft.HEVCVideoExtension, Microsoft.HEVCVideoExtension_8wekyb3d8bbwe + Microsoft.Microsoft3DViewer, Microsoft.Microsoft3DViewer_8wekyb3d8bbwe + Microsoft.MicrosoftFamily, MicrosoftCorporationII.MicrosoftFamily_8wekyb3d8bbwe + Microsoft.MicrosoftHoloLens, Microsoft.MicrosoftHoloLens_8wekyb3d8bbwe + Microsoft.MicrosoftJournal, Microsoft.MicrosoftJournal_8wekyb3d8bbwe + Microsoft.MicrosoftOfficeHub, Microsoft.MicrosoftOfficeHub_8wekyb3d8bbwe + Microsoft.MicrosoftOneDrive, Microsoft.MicrosoftSkyDrive_8wekyb3d8bbwe + Microsoft.MicrosoftSolitaireCollection, Microsoft.MicrosoftSolitaireCollection_8wekyb3d8bbwe + Microsoft.MicrosoftStickyNotes, Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe + Microsoft.MixedReality.Portal, Microsoft.MixedReality.Portal_8wekyb3d8bbwe + Microsoft.MPEG2VideoExtension, Microsoft.MPEG2VideoExtension_8wekyb3d8bbwe + Microsoft.MSPaint, Microsoft.MSPaint_8wekyb3d8bbwe + Microsoft.Office.Excel, Microsoft.Office.Excel_8wekyb3d8bbwe + Microsoft.Office.OneNote, Microsoft.Office.OneNote_8wekyb3d8bbwe + Microsoft.Office.PowerPoint, Microsoft.Office.PowerPoint_8wekyb3d8bbwe + Microsoft.Office.Word, Microsoft.Office.Word_8wekyb3d8bbwe + Microsoft.Paint, Microsoft.Paint_8wekyb3d8bbwe + Microsoft.People, Microsoft.People_8wekyb3d8bbwe + Microsoft.PowerAutomateDesktop, Microsoft.PowerAutomateDesktop_8wekyb3d8bbwe + Microsoft.PowerShell, Microsoft.PowerShell_8wekyb3d8bbwe + Microsoft.QuickAssist, MicrosoftCorporationII.QuickAssist_8wekyb3d8bbwe + Microsoft.RawImageExtension, Microsoft.RawImageExtension_8wekyb3d8bbwe + Microsoft.RemoteDesktop, Microsoft.RemoteDesktop_8wekyb3d8bbwe + Microsoft.ScreenSketch, Microsoft.ScreenSketch_8wekyb3d8bbwe + Microsoft.Services.Store.Engagement, Microsoft.Services.Store.Engagement_8wekyb3d8bbwe + Microsoft.SkypeApp, Microsoft.SkypeApp_kzf8qxf38zg5c + Microsoft.StorePurchaseApp, Microsoft.StorePurchaseApp_8wekyb3d8bbwe + Microsoft.SysinternalsSuite, Microsoft.SysinternalsSuite_8wekyb3d8bbwe + Microsoft.Todos, Microsoft.Todos_8wekyb3d8bbwe + Microsoft.VP9VideoExtensions, Microsoft.VP9VideoExtensions_8wekyb3d8bbwe + Microsoft.WebMediaExtensions, Microsoft.WebMediaExtensions_8wekyb3d8bbwe + Microsoft.WebpImageExtension, Microsoft.WebpImageExtension_8wekyb3d8bbwe + Microsoft.Whiteboard, Microsoft.Whiteboard_8wekyb3d8bbwe + Microsoft.WindowsAlarms, Microsoft.WindowsAlarms_8wekyb3d8bbwe + Microsoft.WindowsCalculator, Microsoft.WindowsCalculator_8wekyb3d8bbwe + Microsoft.WindowsCamera, Microsoft.WindowsCamera_8wekyb3d8bbwe + MicrosoftWindows.Client.WebExperience, MicrosoftWindows.Client.WebExperience_cw5n1h2txyewy + Microsoft.WindowsCommunicationsApps, Microsoft.WindowsCommunicationsApps_8wekyb3d8bbwe + Microsoft.WindowsDefenderApplicationGuard, Microsoft.WindowsDefenderApplicationGuard_8wekyb3d8bbwe + Microsoft.WindowsFeedbackHub, Microsoft.WindowsFeedbackHub_8wekyb3d8bbwe + Microsoft.WindowsMaps, Microsoft.WindowsMaps_8wekyb3d8bbwe + Microsoft.WindowsNotepad, Microsoft.WindowsNotepad_8wekyb3d8bbwe + Microsoft.Windows.Photos, Microsoft.Windows.Photos_8wekyb3d8bbwe + Microsoft.WindowsScan, Microsoft.WindowsScan_8wekyb3d8bbwe + Microsoft.WindowsSoundRecorder, Microsoft.WindowsSoundRecorder_8wekyb3d8bbwe + Microsoft.WindowsStore, Microsoft.WindowsStore_8wekyb3d8bbwe + Microsoft.WindowsSubsystemForAndroid, MicrosoftCorporationII.WindowsSubsystemForAndroid_8wekyb3d8bbwe + Microsoft.WindowsSubsystemforLinux, MicrosoftCorporationII.WindowsSubsystemforLinux_8wekyb3d8bbwe + Microsoft.WindowsTerminal, Microsoft.WindowsTerminal_8wekyb3d8bbwe + Microsoft.XboxApp, Microsoft.XboxApp_8wekyb3d8bbwe + Microsoft.XboxDevices, Microsoft.XboxDevices_8wekyb3d8bbwe + Microsoft.XboxGameOverlay, Microsoft.XboxGameOverlay_8wekyb3d8bbwe + Microsoft.XboxGamingOverlay, Microsoft.XboxGamingOverlay_8wekyb3d8bbwe + Microsoft.XboxIdentityProvider, Microsoft.XboxIdentityProvider_8wekyb3d8bbwe + Microsoft.XboxSpeechToTextOverlay, Microsoft.XboxSpeechToTextOverlay_8wekyb3d8bbwe + Microsoft.Xbox.TCUI, Microsoft.Xbox.TCUI_8wekyb3d8bbwe + Microsoft.YourPhone, Microsoft.YourPhone_8wekyb3d8bbwe + Microsoft.ZuneMusic, Microsoft.ZuneMusic_8wekyb3d8bbwe + Microsoft.ZuneVideo, Microsoft.ZuneVideo_8wekyb3d8bbwe + Amazon.AmazonAppstore, Amazon.comServicesLLC.AmazonAppstore_bvztej1py64t8 + AMD.AMDRadeonSoftware, AdvancedMicroDevicesInc-2.AMDRadeonSoftware_0a9344xs7nr4m + Apple.iCloud, AppleInc.iCloud_nzyj5cx40ttqa + Apple.iTunes, AppleInc.iTunes_nzyj5cx40ttqa + Canonical.Ubuntu, CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc + Canonical.Ubuntu18.04, CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc + Canonical.Ubuntu20.04LTS, CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc + Debian.DebianGNULinux, TheDebianProject.DebianGNULinux_76v4gfsz19hv4 + Intel.IntelGraphicsExperience, AppUp.IntelGraphicsExperience_8j3eq9eme6ctt + Mozilla.Firefox, Mozilla.Firefox_n80bbvh6b1yt2 + NVIDIA.NVIDIAControlPanel, NVIDIACorp.NVIDIAControlPanel_56jybvy8sckqj +'@ + +$DependencyList = [ordered]@{ + 'Microsoft.Advertising.Xaml' = $null + 'Microsoft.NET.Native.Framework' = $null + 'Microsoft.NET.Native.Runtime' = $null + 'Microsoft.Services.Store.Engagement' = $null + 'Microsoft.UI.Xaml' = $null + 'UWPDesktop'= $null + 'Microsoft.VCLibs' = $null + 'Microsoft.WinJS' = $null +} + +$RingList = ConvertFrom-Csv @' + Name, Value + Fast, WIF + Slow, WIS + Preview, RP + Retail, Retail +'@ + +############ + +$CurrentUser = New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity]::GetCurrent()) +$Elevated = $CurrentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) + +$CheckListBox= { + if (($Package_ListBox.SelectedIndex -gt -1 -or $ProductID_TextBox.Text -ne $null) -and $Arch_ListBox.SelectedIndex -gt -1 -and $Ring_ListBox.SelectedIndex -gt -1) { + $OKButton.Enabled = $true + } +} + +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") + +$objForm = New-Object System.Windows.Forms.Form +$objForm.Text = 'Microsoft Store Apps v1.02' +$objForm.Size = New-Object System.Drawing.Size(600,465) +$objForm.StartPosition = 'CenterScreen' + +$Package_Label = New-Object System.Windows.Forms.Label +$Package_Label.Location = New-Object System.Drawing.Point(25,10) +$Package_Label.Size = New-Object System.Drawing.Size(365,20) +$Package_Label.Font = [System.Drawing.Font]::new($Package_Label.Font.Name, $Package_Label.Font.Size, [System.Drawing.FontStyle]::Bold) +$Package_Label.Text = 'Package' + +$objForm.Controls.Add($Package_Label) + +$Package_ListBox = New-Object System.Windows.Forms.ListBox +$Package_ListBox.Location = New-Object System.Drawing.Point(25,35) +$Package_ListBox.Size = New-Object System.Drawing.Size(365,20) +$Package_ListBox.Height = 220 +$Package_ListBox.add_SelectedIndexChanged({$ProductID_TextBox.Clear(); $CheckListBox}) + +Foreach ($item in $PackageList.Identity) { + [void]$Package_ListBox.Items.Add($item) +} +$objForm.Controls.Add($Package_ListBox) + +$ProductID_Label = New-Object System.Windows.Forms.Label +$ProductID_Label.Location = New-Object System.Drawing.Point(25,255) +$ProductID_Label.Size = New-Object System.Drawing.Size(125,20) +$ProductID_Label.Font = [System.Drawing.Font]::new($ProductID_Label.Font.Name, $ProductID_Label.Font.Size, [System.Drawing.FontStyle]::Bold) +$ProductID_Label.Text = 'App Product ID' + +$objForm.Controls.Add($ProductID_Label) + +$ProductID_TextBox = New-Object System.Windows.Forms.TextBox +$ProductID_TextBox.Location = New-Object System.Drawing.Point(160,251) +$ProductID_TextBox.Size = New-Object System.Drawing.Size(155,20) +$ProductID_TextBox.Add_TextChanged({$Package_ListBox.ClearSelected()}) + +$objForm.Controls.Add($ProductID_TextBox) + +$Arch_Label = New-Object System.Windows.Forms.Label +$Arch_Label.Location = New-Object System.Drawing.Point(410,10) +$Arch_Label.Size = New-Object System.Drawing.Size(65,20) +$Arch_Label.Font = [System.Drawing.Font]::new($Arch_Label.Font.Name, $Arch_Label.Font.Size, [System.Drawing.FontStyle]::Bold) +$Arch_Label.Text = 'Arch' + +$objForm.Controls.Add($Arch_Label) + +$Arch_ListBox = New-Object System.Windows.Forms.ListBox +$Arch_ListBox.Location = New-Object System.Drawing.Point(410,35) +$Arch_ListBox.Size = New-Object System.Drawing.Size(65,20) +$Arch_ListBox.Height = 90 +$Arch_ListBox.add_SelectedIndexChanged($CheckListBox) + +[void]$Arch_ListBox.Items.AddRange(@('x64','x86','arm64','arm')) +$objForm.Controls.Add($Arch_ListBox) + +$Ring_Label = New-Object System.Windows.Forms.Label +$Ring_Label.Location = New-Object System.Drawing.Point(495,10) +$Ring_Label.Size = New-Object System.Drawing.Size(70,20) +$Ring_Label.Font = [System.Drawing.Font]::new($Ring_Label.Font.Name, $Ring_Label.Font.Size, [System.Drawing.FontStyle]::Bold) +$Ring_Label.Text = 'Ring' + +$objForm.Controls.Add($Ring_Label) + +$Ring_ListBox = New-Object System.Windows.Forms.ListBox +$Ring_ListBox.Location = New-Object System.Drawing.Point(495,35) +$Ring_ListBox.Size = New-Object System.Drawing.Size(70,20) +$Ring_ListBox.Height = 90 +$Ring_ListBox.add_SelectedIndexChanged($CheckListBox) + +Foreach ($item in $RingList.Name) { + [void]$Ring_ListBox.Items.Add($item) +} +$Ring_ListBox.SetSelected(3,$true) + +$objForm.Controls.Add($Ring_ListBox) + +$PreReq_Checkbox = New-Object System.Windows.Forms.Checkbox +$PreReq_Checkbox.Location = New-Object System.Drawing.Point(25,295) +$PreReq_Checkbox.Size = New-Object System.Drawing.Size(215,25) +$PreReq_Checkbox.Text = 'Download Dependencies' +$PreReq_Checkbox.Checked = $true + +$objForm.Controls.Add($PreReq_Checkbox) + +$ShowAll_Checkbox = New-Object System.Windows.Forms.Checkbox +$ShowAll_Checkbox.Location = New-Object System.Drawing.Point(25,325) +$ShowAll_Checkbox.Size = New-Object System.Drawing.Size(215,25) +$ShowAll_Checkbox.Text = 'Show All Versions' +$ShowAll_Checkbox.Checked = $false + +$objForm.Controls.Add($ShowAll_Checkbox) + +if ($Elevated -eq $true) { + $Sideload_Checkbox = New-Object System.Windows.Forms.Checkbox + $Sideload_Checkbox.Location = New-Object System.Drawing.Point(305,295) + $Sideload_Checkbox.Size = New-Object System.Drawing.Size(365,25) + $Sideload_Checkbox.Text = 'Install Packages' + $Sideload_Checkbox.Checked = $false + + $objForm.Controls.Add($Sideload_Checkbox) +} + +$FormGraphics = $objForm.CreateGraphics() +$Pen = New-Object Drawing.Pen Black +#$objForm.Add_Paint({$FormGraphics.DrawLine($Pen,300,0,300,465)}) +#$objForm.Add_Paint({$FormGraphics.DrawLine($Pen,301,0,301,465)}) + +$OKButton = New-Object System.Windows.Forms.Button +$OKButton.Location = New-Object System.Drawing.Point(222,367) +$OKButton.Size = New-Object System.Drawing.Size(75,30) +$OKButton.Text = 'OK' +$OKButton.Add_Click({$OKButton.Enabled = $false}) +$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK + +$objForm.Controls.Add($OKButton) + +$CancelButton = New-Object System.Windows.Forms.Button +$CancelButton.Location = New-Object System.Drawing.Point(305,367) +$CancelButton.Size = New-Object System.Drawing.Size(75,30) +$CancelButton.Text = 'Cancel' +$CancelButton.Add_Click({$objForm.Close()}) + +$objForm.Controls.Add($CancelButton) + +$objForm.Topmost = $true +$objForm.Add_Shown({$objForm.Activate()}) + +$OKButton.Enabled = $false +$Result = $objForm.ShowDialog() + +if ($Result -ne [System.Windows.Forms.DialogResult]::OK) { + Exit +} + +############ + +$PackageFamily = $($PackageList | Where {$_.Identity -eq $Package_ListBox.SelectedItem}).Family +$Arch = $Arch_ListBox.SelectedItem +$Ring = $($RingList | Where {$_.Name -eq $Ring_ListBox.SelectedItem}).Value + +$ProgressPreference = 'SilentlyContinue' + +if ($ProductID_TextBox.Text -eq '') { + try { + $Response = Invoke-WebRequest -UseBasicParsing -Method 'POST' -Uri 'https://store.rg-adguard.net/api/GetFiles' ` + -Body "type=PackageFamilyName&url=$PackageFamily&ring=$Ring&lang=en-US" + } + catch { + $_.Exception + Exit 1 + } +} +else { + $ProductID = $ProductID_TextBox.Text + + try { + $Response = Invoke-WebRequest -UseBasicParsing -Method 'POST' -Uri 'https://store.rg-adguard.net/api/GetFiles' ` + -Body "type=ProductId&url=$ProductID&ring=$Ring&lang=en-US" + } + catch { + $_.Exception + Exit 1 + } +} + +$Links = $Response.Links.outerHTML | Where-Object {$_ -notmatch 'BlockMap' -and $_ -notmatch '\.eappx' ` + -and $_ -notmatch '\.emsix' -and ($_ -match "$Arch" -or $_ -match '_neutral_')} + +$FileList = New-Object System.Collections.ArrayList + +Foreach ($File in $Links) { + $Package = $File.Split('>')[1].Split('<')[0] + $Family = $Package.Split('_')[0] + $Version = $Package.Split('_')[1] + + $null = $FileList.Add([PSCustomObject]@{'Package' = $Package; 'Family' = $Family; 'Version' = [Version]$Version}) +} + +$AppsOnlyList = New-Object System.Collections.ArrayList + +Foreach ($File in ($FileList | Sort-Object -Property Family,Version)) { + $match = $false + + Foreach ($PreReq in ($DependencyList.GetEnumerator()).Name) { + if ($File.Family -match $PreReq) { + $DependencyList[$PreReq] = $File.Package + $match = $true + break + } + } + + if ($match -eq $false) { + $URL = ($Links | Where-Object {$_-match $File.Package}).Split('"')[1] + + try { + $Response = Invoke-WebRequest -UseBasicParsing -Method 'HEAD' -Uri $URL + } + catch { + $_.Exception + Exit 1 + } + + $LastModified = ([DateTime][string]$Response.Headers['Last-Modified']).ToString('yyyy-MM-dd HH:mm tt') + $Length = [uint32][string]$Response.Headers['Content-Length'] + + if ($Length -ge 1GB) { + $Size = '{0:N2} GB' -f [float]($Length/1GB) + } + elseif ($Length -ge 1MB) { + $Size = '{0:N2} MB' -f [float]($Length/1MB) + } + else { + $Size = '{0:N2} KB' -f [float]($Length/1KB) + } + + $null = $AppsOnlyList.Add([PSCustomObject]@{'Package' = $File.Package; 'Family' = $File.Family; 'Version' = [Version]$File.Version; ` + 'Major' = $File.Version.Major; 'Last-Modified' = $LastModified; 'Size' = $Size}) + } +} + +if ($AppsOnlyList.Count -eq 0) { + $null = $AppsOnlyList.Add([PSCustomObject]@{'Package' = 'No packages listed.'}) + $AppsOnlyList | Out-GridView -Title 'Select Packages for Download' -PassThru | Out-Null + Exit +} + +if ($ShowAll_Checkbox.Checked -eq $false) { + $UserSelected = ($AppsOnlyList | Group-Object -Property Major | Foreach { $_.Group | Sort Last-Modified | Select -Last 1 } | ` + Select-Object Family,Version,Package,Last-Modified,Size | Sort-Object -Property Last-Modified | ` + Out-GridView -Title 'Select Packages for Download' -PassThru).Package +} +else { + $UserSelected = ($AppsOnlyList | Select-Object Family,Version,Package,Last-Modified,Size | Sort-Object -Property Last-Modified | ` + Out-GridView -Title 'Select Packages for Download' -PassThru).Package +} + +if (($UserSelected).Count -eq 0) { + Exit +} + +$DependencyPath = @() +Set-Location $PSScriptRoot + +if ($PreReq_Checkbox.Checked -eq $true) { + $CurrentFiles = Get-ChildItem -Name | where {$_ -match '\.msix' -or $_ -match '\.appx'} + + Foreach ($File in $CurrentFiles) { + Foreach ($PreReq in ($DependencyList.GetEnumerator()).Name) { + if ($PreReq -eq 'Microsoft.VCLibs' -and $File -match 'UWPDesktop') { + break + } + + if ($File -match $PreReq -and $DependencyList[$PreReq] -ne $null) { + $FileVersion = [version]$File.Split('_')[1] + $DependencyVersion = [version]$DependencyList[$PreReq].Split('_')[1] + + $DependencyPath += $File + + if ($FileVersion -ge $DependencyVersion) { + 'skipping "{0}"' -f ($File.Split('_')[0..2] -join '_') + $DependencyList[$PreReq] = $null + } + else { + 'Deleting "{0}"' -f ($File.Split('_')[0..2] -join '_') + + try { + Remove-Item $File + } + catch { + $_.Exception + Exit 1 + } + } + } + } + } + + $MergedList = ([array]$UserSelected + [array]($DependencyList.Values | Where-Object {$_ -ne $null})) | sort +} +else { + $MergedList = $UserSelected +} + +############ + +Foreach ($Filename in $MergedList) { + $URL = ($Links | Where-Object {$_ -match $Filename}).Split('"')[1] + + if (-not (Test-Path -Path $Filename -PathType Leaf)) { + 'Downloading "{0}"' -f $Filename + + try { + $Response = Invoke-WebRequest -UseBasicParsing -Uri $URL -OutFile $Filename -PassThru + + $ChildItem = Get-ChildItem $Filename + $ChildItem.CreationTime = $ChildItem.LastWriteTime = $Response.BaseResponse.LastModified + } + catch { + $_.Exception + Exit 1 + } + } + else { + 'Duplicate file "{0}"' -f $Filename + } +} + +if ($Sideload_Checkbox.Checked -eq $true) { + foreach ($Package in ($UserSelected | Sort-Object)) { + 'Installing "{0}"' -f $Package + + try { + if ($DependencyPath -ne '') { + Add-AppPackage -Path $Package -DependencyPath $DependencyPath + } + else { + Add-AppxPackage -Path $Package + } + } + catch { + $error[0].InvocationInfo + } + } +} + +if (([Environment]::GetCommandLineArgs() | Where-Object {$_ -like '-Command'}).Count -gt 0) { + Write-Host -NoNewline 'Press any key to close window.' + $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown') +} \ No newline at end of file