【问题标题】:How do I determine if services.msc snap-in is loaded into mmc console?如何确定 services.msc 管理单元是否已加载到 mmc 控制台?
【发布时间】:2013-05-30 17:04:33
【问题描述】:

我需要在程序卸载时提示用户关闭 services.msc 管理单元。我该怎么做?

【问题讨论】:

  • 你的目标是什么?
  • 有时我的服务无法注册,因为服务小程序正在运行。
  • 这是一个有趣的问题。我没有现成的答案。有两种可能的非排他性方法:1) 帮助卸载程序用户了解在所有进程释放服务句柄之前卸载不应继续/不会完全完成,或 2) 帮助安装程序用户了解安装无法继续/ 将失败,除非所有进程都向计划删除的服务释放句柄。正如您所建议的,检测 (1) 可能更难,但可以缩小到仅检测服务管理单元。检测 (2) 仍需要自定义操作。

标签: c++ windows wix windows-installer mmc


【解决方案1】:

您需要编写自定义操作来执行此操作。您可以使用Process 检查 services.msc 是否加载到 mmc 中。

  [CustomAction]
    public static ActionResult CustomAction1(Session session)
    {
        foreach (Process getProcess in Process.GetProcesses())
        {
            if (getProcess.ProcessName.Contains("mmc"))
            {
                if (getProcess.MainWindowTitle == "Services")
                {
                    session["SERVICES_MSC"] = "Running";
                    break;
                }
            }
        }

        return ActionResult.Success;
    }

在卸载时调用自定义操作并根据 SERVICES_MSC 属性停止卸载。

<Binary Id="Check_Services" SourceFile="..\TestProject\bin\Release\TestProject.CA.dll" />
<CustomAction Id="CHECK_SERVICES" BinaryKey="Check_Services" DllEntry="CustomAction1" Return="check" />

<CustomAction Id="STOP_INSTALLATION" Error="Services.msc is running.Please close that Window before uninstall the setup." />

在 Install Execute 序列中调用自定义操作。

  <Custom Action="CHECK_SERVICES" After="InstallValidate">REMOVE ~= "ALL"</Custom>
  <Custom Action="STOP_INSTALLATION" After="CHECK_SERVICES">(REMOVE ~= "ALL") AND SERVICES_MSC</Custom>

【讨论】:

  • 谢谢。但是,如果您首先运行 mmc,然后通过 File->Add/Remove Snap-In 加载服务小程序并将焦点放在控制台根上,则窗口标题将不包含“服务”。此外,小程序的名称可能会本地化为不同的语言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多