chore(rustdesk): reforça autostart e recuperação do serviço

This commit is contained in:
Esdras Renan 2025-11-25 11:20:39 -03:00
parent a1436ea729
commit 463c0aeccd
2 changed files with 25 additions and 0 deletions

View file

@ -405,6 +405,12 @@ fn derive_numeric_id(machine_id: &str) -> String {
fn ensure_service_running(exe_path: &Path) -> Result<(), RustdeskError> { fn ensure_service_running(exe_path: &Path) -> Result<(), RustdeskError> {
ensure_service_installed(exe_path)?; ensure_service_installed(exe_path)?;
if let Err(error) = configure_service_startup() {
log_event(&format!(
"Aviso: não foi possível reforçar autostart/recuperação do serviço RustDesk: {error}"
));
}
fn start_sequence() -> Result<(), RustdeskError> { fn start_sequence() -> Result<(), RustdeskError> {
let _ = run_sc(&["stop", SERVICE_NAME]); let _ = run_sc(&["stop", SERVICE_NAME]);
thread::sleep(Duration::from_secs(2)); thread::sleep(Duration::from_secs(2));
@ -427,6 +433,24 @@ fn ensure_service_running(exe_path: &Path) -> Result<(), RustdeskError> {
} }
} }
fn configure_service_startup() -> Result<(), RustdeskError> {
let start_arg = format!("start= {}", "auto");
run_sc(&["config", SERVICE_NAME, &start_arg])?;
let reset_arg = format!("reset= {}", "86400");
let actions_arg = "actions= restart/5000/restart/5000/restart/5000";
let failure_actions_applied = run_sc(&["failure", SERVICE_NAME, &reset_arg, actions_arg]).is_ok();
let _ = run_sc(&["failureflag", SERVICE_NAME, "1"]);
if failure_actions_applied {
log_event("Serviço RustDesk configurado para reiniciar automaticamente em caso de falha");
} else {
log_event("Aviso: não foi possível configurar recuperação automática do serviço RustDesk");
}
Ok(())
}
fn stop_rustdesk_processes() -> Result<(), RustdeskError> { fn stop_rustdesk_processes() -> Result<(), RustdeskError> {
if let Err(error) = try_stop_service() { if let Err(error) = try_stop_service() {
log_event(&format!( log_event(&format!(

View file

@ -54,6 +54,7 @@ Fluxo ideal:
- Reinicia serviço `RustDesk` (`sc start RustDesk` — pode falhar com `status Some(5)` se não há privilégio admin). Mesmo com falha, a CLI continua e grava o ID nos arquivos. - Reinicia serviço `RustDesk` (`sc start RustDesk` — pode falhar com `status Some(5)` se não há privilégio admin). Mesmo com falha, a CLI continua e grava o ID nos arquivos.
- **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. - **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. - **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` e aplica `sc failure ... actions= restart/5000/...` para reiniciar o RustDesk automaticamente em caso de falha. Assim ele permanece no background/bandeja após boot, sem depender do usuário abrir a UI.
- **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". - **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): - **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):