【问题标题】:Self terminating or uninstalling Windows service自行终止或卸载 Windows 服务
【发布时间】:2012-07-30 08:19:47
【问题描述】:

我创建了一个工具,它提供与 Microsoft 的 PSExec 工具类似的功能,但它是通过 Java 实现的(没有“Exec”命令)https://dev.c-ware.de/confluence/display/PUBLIC/JRWShell+-+A+Java+library+for+remote+controlling+a+windows+shell

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

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

【问题讨论】:

  • 我从未尝试过,但是从服务本身调用 DeleteService 函数时,没有明显的原因无法工作。服务停止自己是微不足道的,它只是做与收到停止请求时完全相同的事情,即调用 SetServiceStatus 并将 dwCurrentState 设置为 SERVICE_STOPPED。
  • 我一定会尝试一下...感谢您的指点...我是 Java 人...不是 .Net 人,所以我不习惯使用 API ;- )

标签: .net windows windows-services


【解决方案1】:

事实证明,可以从服务中卸载该服务。然而,只要服务仍在执行中,服务似乎就会保留在服务列表中,并在服务终止后被删除。

【讨论】:

    【解决方案2】:

    我正在使用下一个代码,它适用于我的服务。但我还在我的安装项目中添加了“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);
        }
    

    对不起,额外的代码,来自我的工作项目

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多