diff --git a/locales/app.yml b/locales/app.yml index 5dc8046b..b79fce99 100644 --- a/locales/app.yml +++ b/locales/app.yml @@ -610,3 +610,19 @@ _version: 2 en: "Windows Update" es: "Actualización de Windows" zh_TW: "Windows 更新" +"Microsoft Store": + en: "Microsoft Store" + es: "Tienda de Microsoft" + zh_TW: "Microsoft 店鋪" +"Scanning for updates...": + en: "Scanning for updates..." + es: "Buscando actualizaciones..." + zh_TW: "正在掃描更新..." +"Success, Microsoft Store apps are being updated in the background": + en: "Success, Microsoft Store apps are being updated in the background" + es: "Éxito, las aplicaciones de Microsoft Store se están actualizando en segundo plano" + zh_TW: "成功,Microsoft Store 應用程式正在後台更新" +"Unable to update Microsoft Store apps, manual intervention is required": + en: "Unable to update Microsoft Store apps, manual intervention is required" + es: "No se pueden actualizar las aplicaciones de Microsoft Store, se requiere intervención manual" + zh_TW: "無法更新 Microsoft Store 應用,需手動幹預" diff --git a/src/config.rs b/src/config.rs index 0991e284..6dbac9bf 100644 --- a/src/config.rs +++ b/src/config.rs @@ -111,6 +111,7 @@ pub enum Step { Mas, Maza, Micro, + MicrosoftStore, Mise, Myrepos, Nix, diff --git a/src/main.rs b/src/main.rs index 1166615a..63551426 100644 --- a/src/main.rs +++ b/src/main.rs @@ -206,6 +206,9 @@ fn run() -> Result<()> { runner.execute(Step::Scoop, "Scoop", || windows::run_scoop(&ctx))?; runner.execute(Step::Winget, "Winget", || windows::run_winget(&ctx))?; runner.execute(Step::System, "Windows update", || windows::windows_update(&ctx))?; + runner.execute(Step::MicrosoftStore, "Microsoft Store", || { + windows::microsoft_store(&ctx) + })?; } #[cfg(target_os = "linux")] diff --git a/src/steps/os/windows.rs b/src/steps/os/windows.rs index c5ff220d..575ec7ca 100644 --- a/src/steps/os/windows.rs +++ b/src/steps/os/windows.rs @@ -221,6 +221,14 @@ pub fn windows_update(ctx: &ExecutionContext) -> Result<()> { } } +pub fn microsoft_store(ctx: &ExecutionContext) -> Result<()> { + let powershell = powershell::Powershell::windows_powershell(); + + print_separator(t!("Microsoft Store")); + + powershell.microsoft_store(ctx) +} + pub fn reboot() -> Result<()> { // If this works, it won't return, but if it doesn't work, it may return a useful error // message. diff --git a/src/steps/powershell.rs b/src/steps/powershell.rs index 7bd04036..bf81b3ef 100644 --- a/src/steps/powershell.rs +++ b/src/steps/powershell.rs @@ -119,4 +119,43 @@ impl Powershell { .args(["-NoProfile", &install_windowsupdate_verbose, accept_all]) .status_checked() } + + #[cfg(windows)] + pub fn microsoft_store(&self, ctx: &ExecutionContext) -> Result<()> { + let powershell = require_option(self.path.as_ref(), t!("Powershell is not installed").to_string())?; + + let mut command = if let Some(sudo) = ctx.sudo() { + let mut command = ctx.run_type().execute(sudo); + command.arg(powershell); + command + } else { + ctx.run_type().execute(powershell) + }; + + println!("{}", t!("Scanning for updates...")); + + // Scan for updates using the MDM UpdateScanMethod + // This method is also available for non-MDM devices + let update_command = "(Get-CimInstance -Namespace \"Root\\cimv2\\mdm\\dmmap\" -ClassName \"MDM_EnterpriseModernAppManagement_AppManagement01\" | Invoke-CimMethod -MethodName UpdateScanMethod).ReturnValue"; + + command.args(["-NoProfile", update_command]); + + command + .output_checked_with_utf8(|output| { + if output.stdout.trim() == "0" { + println!( + "{}", + t!("Success, Microsoft Store apps are being updated in the background") + ); + Ok(()) + } else { + println!( + "{}", + t!("Unable to update Microsoft Store apps, manual intervention is required") + ); + Err(()) + } + }) + .map(|_| ()) + } }