From e8b58187c9b63fe3ae353b6fe6f202a768bfc876 Mon Sep 17 00:00:00 2001 From: Esdras Renan Date: Tue, 25 Nov 2025 14:16:45 -0300 Subject: [PATCH] feat(rustdesk): remove auto-run/atalho para evitar abrir GUI ao iniciar Raven --- apps/desktop/src-tauri/src/rustdesk.rs | 54 ++++++++++++++++++++++++++ docs/RUSTDESK-PROVISIONING.md | 1 + 2 files changed, 55 insertions(+) diff --git a/apps/desktop/src-tauri/src/rustdesk.rs b/apps/desktop/src-tauri/src/rustdesk.rs index 61cd1c7..da95ef2 100644 --- a/apps/desktop/src-tauri/src/rustdesk.rs +++ b/apps/desktop/src-tauri/src/rustdesk.rs @@ -433,6 +433,8 @@ fn ensure_service_running(exe_path: &Path) -> Result<(), RustdeskError> { Err(error) => Err(error), }; + remove_rustdesk_autorun_artifacts(); + // Revalida se o serviço realmente subiu; se não, reinstala e tenta novamente. match query_service_state() { Some(state) if state.eq_ignore_ascii_case("running") => Ok(()), @@ -492,6 +494,58 @@ fn query_service_state() -> Option { None } +fn remove_rustdesk_autorun_artifacts() { + // Remove atalhos de inicialização automática para evitar abrir GUI a cada boot/login. + let mut startup_paths: Vec = Vec::new(); + if let Ok(appdata) = env::var("APPDATA") { + startup_paths.push( + Path::new(&appdata) + .join("Microsoft") + .join("Windows") + .join("Start Menu") + .join("Programs") + .join("Startup") + .join("RustDesk.lnk"), + ); + } + startup_paths.push( + Path::new("C:\\ProgramData") + .join("Microsoft") + .join("Windows") + .join("Start Menu") + .join("Programs") + .join("Startup") + .join("RustDesk.lnk"), + ); + + for path in startup_paths { + if path.exists() { + match fs::remove_file(&path) { + Ok(_) => log_event(&format!("Atalho de inicialização do RustDesk removido: {}", path.display())), + Err(error) => log_event(&format!( + "Falha ao remover atalho de inicialização do RustDesk ({}): {}", + path.display(), + error + )), + } + } + } + + for hive in ["HKCU", "HKLM"] { + let reg_path = format!(r"{}\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", hive); + let status = hidden_command("reg") + .args(["delete", ®_path, "/v", "RustDesk", "/f"]) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status(); + if let Ok(code) = status { + if code.success() { + log_event(&format!("Entrada de auto-run RustDesk removida de {}", reg_path)); + } + } + } +} + fn stop_rustdesk_processes() -> Result<(), RustdeskError> { if let Err(error) = try_stop_service() { log_event(&format!( diff --git a/docs/RUSTDESK-PROVISIONING.md b/docs/RUSTDESK-PROVISIONING.md index 42a50ee..1673ecf 100644 --- a/docs/RUSTDESK-PROVISIONING.md +++ b/docs/RUSTDESK-PROVISIONING.md @@ -55,6 +55,7 @@ Fluxo ideal: - **Autoelevação única**: na primeira execução do botão “Preparar”, o Raven dispara um PowerShell elevado (`takeown + icacls`) para liberar ACL dos perfis `LocalService` e `LocalSystem`. O sucesso grava `rustdeskAclUnlockedAt` dentro de `%LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\machine-agent.json` e cria o flag `rustdesk_acl_unlocked.flag`, evitando novos prompts de UAC nas execuções seguintes. - **Kill/restart seguro**: antes de tocar nos TOML, o Raven roda `sc stop RustDesk` + `taskkill /F /T /IM rustdesk.exe`. Isso garante que nenhum cliente sobrescreva o `RustDesk_local.toml` enquanto aplicamos a senha. - **Serviço em background reforçado**: `ensure_service_running` sempre instala o serviço, força `start= auto`, aplica `sc failure ... actions= restart/5000/...` e revalida se o serviço ficou em `RUNNING`. Se não subir, reaplica `--install-service` + `sc start` antes de seguir. Assim ele permanece no background/bandeja após boot, sem depender do usuário abrir a UI. + - **Sem pop-up de GUI**: após configurar o serviço, removemos entradas de auto-run/atalhos (`HKCU/HKLM\...\Run` e `Start Menu\Programs\Startup\RustDesk.lnk`) para impedir que a janela do RustDesk abra a cada execução do Raven. O serviço continua ativo em segundo plano. - **Replicação completa de perfis**: após aplicar `--password`, limpamos quaisquer arquivos antigos (`RustDesk*.toml`, `password`, `passwd*`) em `%APPDATA%`, `ProgramData`, `LocalService` e `LocalSystem` e, em seguida, reescrevemos tudo. Agora os `RustDesk2.toml` herdados recebem `verification-method = "use-permanent-password"` e `approve-mode = "password"` no bloco `[options]` antes mesmo do serviço subir, evitando que o RustDesk volte para "Use both". - **Validação por arquivo**: o Raven agora registra no `rustdesk.log` se o `password` gravado em cada `RustDesk_local.toml` coincide com o PIN configurado. Para inspecionar manualmente, rode no PowerShell (e valide que todas as linhas exibem o PIN esperado):