2012-07-30 102 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); 
    } 

對不起額外的代碼,它是從我的工作項目