Как определить, загружена ли оснастка services.msc в консоль mmc?

Мне нужно предложить пользователю закрыть оснастку services.msc при удалении программы. Как мне это сделать?


person vkrzv    schedule 04.06.2013    source источник
comment
Какова ваша цель с этим?   -  person Tom Blodget    schedule 08.06.2013
comment
См. раздел stackoverflow. ком/вопросы/5321825/   -  person vkrzv    schedule 09.06.2013
comment
Иногда мой сервис не может быть зарегистрирован из-за запущенного апплета сервисов.   -  person vkrzv    schedule 09.06.2013
comment
Это интересная проблема. У меня нет готового ответа. Существует два возможных неисключительных подхода: 1) Помогите пользователю, выполняющему удаление, понять, что удаление не должно продолжаться/не будет полностью завершено, пока все процессы не выпустят дескрипторы для службы, или 2) Помогите пользователю, выполняющему установку, понять, что установка не может быть продолжена. / не удастся, если все процессы не выпустят дескрипторы службы, запланированной для удаления. Обнаружение (1) может быть сложнее, но, как вы предлагаете, его можно сузить до простого обнаружения оснастки служб. Обнаружение (2) по-прежнему потребует пользовательского действия.   -  person Tom Blodget    schedule 09.06.2013


Ответы (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>
person Vinoth    schedule 07.06.2013
comment
Спасибо. Но если вы сначала запустите mmc, а затем загрузите апплет сервисов с помощью File->Add/Remove Snap-In и оставите фокус на корне консоли, то заголовок окна не будет содержать Services. Также название апплета может быть переведено на другой язык. - person vkrzv; 07.06.2013