uninstall_service/
uninstall_service.rs1#[cfg(windows)]
2fn main() -> windows_service::Result<()> {
3 use std::{
4 thread::sleep,
5 time::{Duration, Instant},
6 };
7
8 use windows_service::{
9 service::{ServiceAccess, ServiceState},
10 service_manager::{ServiceManager, ServiceManagerAccess},
11 };
12 use windows_sys::Win32::Foundation::ERROR_SERVICE_DOES_NOT_EXIST;
13
14 let manager_access = ServiceManagerAccess::CONNECT;
15 let service_manager = ServiceManager::local_computer(None::<&str>, manager_access)?;
16
17 let service_access = ServiceAccess::QUERY_STATUS | ServiceAccess::STOP | ServiceAccess::DELETE;
18 let service = service_manager.open_service("ping_service", service_access)?;
19
20 service.delete()?;
23 if service.query_status()?.current_state != ServiceState::Stopped {
25 service.stop()?;
27 }
28 drop(service);
30
31 let start = Instant::now();
34 let timeout = Duration::from_secs(5);
35 while start.elapsed() < timeout {
36 if let Err(windows_service::Error::Winapi(e)) =
37 service_manager.open_service("ping_service", ServiceAccess::QUERY_STATUS)
38 {
39 if e.raw_os_error() == Some(ERROR_SERVICE_DOES_NOT_EXIST as i32) {
40 println!("ping_service is deleted.");
41 return Ok(());
42 }
43 }
44 sleep(Duration::from_secs(1));
45 }
46 println!("ping_service is marked for deletion.");
47
48 Ok(())
49}
50
51#[cfg(not(windows))]
52fn main() {
53 panic!("This program is only intended to run on Windows.");
54}