2012-07-30 96 views
1

我创建了一个工具,它提供了类似的功能,从微软的PSEXEC工具,但做到这一点从Java(如果没有“执行”命令)https://dev.c-ware.de/confluence/display/PUBLIC/JRWShell+-+A+Java+library+for+remote+controlling+a+windows+shell自终止或卸载Windows服务

我的问题是,通常我的lib自动停止并卸载它创建的服务,但在通信失败的情况下,这不会自动发生。我希望动态创建的Service启动并监听连接,并在连接关闭后终止。理想情况下,我希望Windows服务自行终止并自动卸载,但我认为如果不使用自动清理已停止服务的第二个看门狗服务,则可能无法自行卸载。

所以我的问题是:服务是否可以卸载自己?如果是这样,这是怎么做的,如果不可能,我该如何让服务自行停止?

+1

我从来没有尝试过,但没有明显的原因,从服务本身调用时DeleteService函数的功能是行不通的。对于一个服务来说,停止它自己是微不足道的,它只是和它接收到一个停止请求时的做法完全相同,即调用SetServiceStatus并将dwCurrentState设置为SERVICE_STOPPED。 – 2012-07-30 20:35:27

+0

我肯定会试一试......谢谢你的指点......我是一个Java人......没有.Net的人,所以我不习惯Apis ;-) – 2012-08-01 09:05:59

回答

1

事实证明,有可能从服务内卸载服务。然而,只要服务仍在执行并且在服务终止后被移除,服务仍然保留在服务列表中。

0

我正在使用下一个代码,它对我的​​服务起作用。但我也添加“net stop serviceName”进程来卸载我的安装项目中的自定义操作(也许它很重要)。

private static string getMsiexecParameters() 
    { 
     return string.Format("/x {0} /quiet /qn", GetProductCode(CProductName)); 
    } 

    public static string GetProductCode(string productName) 
    { 
     string query = string.Format("select * from Win32_Product where Name='{0}'", productName); 
     using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) 
     { 
      foreach (ManagementObject product in searcher.Get()) 
       return product["IdentifyingNumber"].ToString(); 
     } 
     return null; 
    } 

    public static void Uninstall() 
    { 
     ProcessStartInfo psi = new ProcessStartInfo("msiexec.exe", getMsiexecParameters()); 
     Process.Start(psi); 
    } 

对不起额外的代码,它是从我的工作项目