windows-services - удалить - указанная служба была помечена для удаления




Как решить Ошибка «Указанная служба была отмечена для удаления» (12)

Я пытаюсь удалить службу Windows с помощью sc delete <service name> и встретить следующую ошибку:

[SC] DeleteService FAILED 1072:

Указанная служба отмечена для удаления.

Что я уже сделал:

  • Остановить службу, очевидно. sc queryex "<service name>" дает следующий результат:

    SERVICE_NAME: Stub service
            TYPE               : 10  WIN32_OWN_PROCESS
            STATE              : 1  STOPPED
            WIN32_EXIT_CODE    : 1067  (0x42b)
            SERVICE_EXIT_CODE  : 0  (0x0)
            CHECKPOINT         : 0x0
            WAIT_HINT          : 0x0
            PID                : 0
            FLAGS              :
    
  • Убедитесь, что консоль управления Microsoft закрыта ( taskkill /F /IM mmc.exe ),

  • Убедитесь, что Event Viewer закрыт ,

  • Удален ключ из HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ <имя службы> из реестра .

    Из-за этого удаления services.msc прежнему показывает службу (с именем, но без статуса или типа запуска), но описание «<Не удалось прочитать описание. Код ошибки: 2> ". При попытке просмотра свойств «Система не может найти указанный файл» отображается пять раз.

Проблема сохраняется.

Каким будет следующий шаг?


В моем случае это было вызвано необработанным исключением при создании источника eventLog. Используйте try catch, чтобы указать причину.


В моем случае это работало после закрытия Services . Проверьте, открыт ли Service.msc, если да, закройте его и проверьте, что какой-либо процесс службы найден в Task Manager .


Вероятнее всего, удаление службы не выполняется, потому что

protected override void OnStop()

при остановке службы. обертывание вещей внутри try catch предотвратит отметку ошибки удаления

protected override void OnStop()
{
            try
            {
                //things to do
            }
            catch (Exception)
            {
            }

}


Если шаги, предоставленные @MainMa, не работают, выполните следующие шаги

Шаг 1 Попробуйте убить процесс из диспетчера задач Windows или с помощью taskkill / F / PID. Вы можете найти pid процесса командой «sc queryex». Попробуйте выполнить следующий шаг, если вы все еще не можете удалить.

Шаг 2 Если выше

Запуск автозапуска для Windows Поиск службы по имени и удаление результатов.


Могут быть несколько причин, которые приводят к тому, что служба застревает в «отмеченной для удаления».

  1. Открывается Process Explorer SysInternals . Закрытие должно привести к автоматическому удалению службы.

  2. Диспетчер задач открывается .

  3. Открывается консоль Microsoft Management Console (MMC) . Чтобы все экземпляры были закрыты, запустите taskkill /F /IM mmc.exe .

  4. Открывается консоль служб . Это то же самое, что и предыдущий пункт, поскольку консоль службы размещена в MMC.

  5. Открывается средство просмотра событий . Опять же, это то же самое, что и третья точка.

  6. Доступен ключ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {имя службы} .

  7. Кто-то еще зарегистрировался на сервере и открыл одно из ранее упомянутых приложений.

  8. Экземпляр Visual Studio, используемый для отладки службы , открыт.


Обнаружили еще одну вещь, которую нужно проверить - посмотрите в диспетчере задач - если к этому полю подключены другие пользователи, даже если они «отключены», вы должны фактически выписать их, чтобы окончательно удалить службу.


Похоже, что в версиях Windows позже Windows 7 (непроверенный, но по последнему опыту с Windows Server 2012 R2) диспетчер управления службами (SCM) является более строгим.

В то время как в Windows 7 он просто запускает другой процесс, теперь он проверяет, продолжает ли процесс обслуживания, и может возвращать ERROR_SERVICE_MARKED_FOR_DELETE (1072) для любого последующего вызова CreateService / DeleteService, даже если служба оказывается остановленной.

Я говорю здесь код Windows API, но хочу четко изложить, что происходит, поэтому эта последовательность может привести к указанной ошибке:

SC_HANDLE hScm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);

SC_HANDLE hSvc = OpenService(hScm, L"Stub service", SERVICE_STOP | SERVICE_QUERY_STATUS | DELETE);

SERVICE_STATUS ss;
ControlService(hSvc, SERVICE_CONTROL_STOP, &ss);
// ... wait for service to report its SERVICE_STOPPED state

DeleteService(hSvc);
CloseServiceHandle(hSvc);
hSvc = nullptr;

// any further calls to CreateService/DeleteService will fail
// if service process is still around

Причина, по которой сервисный процесс все еще существует после того, как он уже сообщил о состоянии SERVICE_STOPPED, не вызывает удивления. Это обычный процесс, основной поток которого «застревает» в его вызове API StartServiceCtrlDispatcher , поэтому он сначала реагирует на действие контроля остановки, но затем должен выполнить оставшуюся последовательность кода.

Скорее всего, SCM / OS не справляется с этим должным образом для нас. Программное решение является простым и точным: получить дескриптор процесса исполняемого файла службы перед остановкой службы, а затем дождаться, когда этот дескриптор станет сигналом.

Если подойти к проблеме с точки зрения системного администрирования, решение также должно дождаться полного исчезновения процесса обслуживания.


Привет, ребята, у меня была такая же проблема, наконец я решил убить сервисный процесс.

для этого попробуйте выполнить следующие шаги:

  • получить идентификатор процесса с помощью

    sc queryex <service name>

  • уничтожить

    taskkill /F /PID <Service PID>


Удаление ключей реестра, как было предложено выше, заставило мое обслуживание застрять в состоянии остановки. Для меня работала следующая процедура:

открыть диспетчер задач> вкладка услуг> выберите сервис> щелкните правой кнопкой мыши и выберите «перейти к процессу»> щелкните правой кнопкой мыши процесс и выберите «Завершить процесс»

После этого служба должна исчезнуть


Это означает, что служба по-прежнему указана как отключенная в services.msc. Просто закройте services.msc и откройте его как администратор ... Служба не будет указана. Теперь установите службу с помощью команды,

installutil "путь обслуживания"


Это то, что сработало для меня: - Я столкнулся с одной и той же проблемой: мой сервис застрял в «помечены для удаления». - Я открыл services.msc. Моя служба показалась запущенной, хотя она уже была удалена. - Я нажал кнопку «Стоп» Получил сообщение об ошибке, указав, что служба не находится в состоянии получения управляющих сообщений. Тем не менее, служба была остановлена. - Закрытые услуги.msc. - Заново открытые услуги.msc. - Служба ушла (больше не отображается в списке услуг).

(Среда была Windows 7.)


шаги:

step-1 перейти к местоположению C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

команда step-2 run: installutil / u full-path / servicename.exe

шаг 3 закрыть панель обслуживания и снова открыть ее

команда выполнения step-4 : installutil full-path / servicename.exe







windows-services