Как решить ошибку «Указанная служба была помечена для удаления»
Я пытаюсь удалить службу Windows с помощью sc delete < service name >
и сталкиваюсь со следующей ошибкой:
[SC] DeleteService FAILED 1072:
Указанная служба была помечена для удаления.
Что я уже сделал:
-
Остановлен сервис, очевидно.
Sc queryex "< имя службы >"
имеет следующий результат:SERVICE_NAME: Stub service ТИП: 10 WIN32_OWN_PROCESS ГОСУДАРСТВО: 1 ОСТАНОВИЛСЯ WIN32_EXIT_CODE: 1067 (0x42b) SERVICE_EXIT_CODE: 0 (0x0) ПРОВЕРКА: 0x0 WAIT_HINT: 0x0 PID: 0 ФЛАГИ:
-
Уверена, что консоль управления Microsoft закрыта (
taskkill / F / IM mmc.exe
), -
Удален ключ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services & lt; имя службы > из реестра.
Из-за этого удаления
services.msc
по-прежнему показывает услугу (с именем, но без статуса или типа запуска), но описание «& lt; Не удалось прочитать описание. Код ошибки: 2 > ». При попытке просмотреть свойства: «Система не может найти указанный файл.»показано пять раз.
Проблема сохраняется.
Какой следующий шаг??
Может быть несколько причин, которые приводят к застреванию службы в «помечен для удаления».
Открыт Process Explorer SysInternals. Закрытие должно привести к автоматическому удалению сервиса.
Менеджер задач открыт.
Открыта консоль управления Microsoft (MMC). Чтобы убедиться, что все экземпляры закрыты, запустите
taskkill / F / IM mmc.exe
.Услуги консоли открыты. Это то же самое, что и в предыдущем пункте, поскольку консоль Сервисов размещена в MMC
Зритель событий открыт. Опять же, это то же самое, что и третий пункт.
Ключ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {название службы} существует.
Кто-то еще вошел в систему на сервере и открыл одно из ранее упомянутых приложений.
Экземпляр Visual Studio , используемый для отладки сервиса , открыт.
Это также может быть вызвано тем, что консоль Сервисов открыта. Windows фактически не удалит службу, пока она не будет закрыта.
В моем случае это сработало после закрытия «Услуги». Проверьте, открыт ли
Services.msc
, если да, закройте его и проверьте, что какой-либо процесс обслуживания находится вTask Manager
.У меня была та же проблема, наконец, я решил убить процесс обслуживания.
для этого попробуйте ниже шагов:
получить идентификатор процесса обслуживания с
sc queryex < имя службы >
убить процесс с
taskkill / F / PID < Service PID >
Это означает, что служба по-прежнему указана как отключенная в services.msc. Просто закройте services.msc и снова откройте как администратор... Услуга не будет указана в списке. Теперь установите сервис, используя команду
installutil "путь обслуживания"
Удаление ключей реестра, как указано выше, привело к тому, что мой сервис застрял в состоянии остановки. Следующая процедура сработала для меня:
открыть диспетчер задач > выберите вкладку услуг > выберите услугу > щелкните правой кнопкой мыши и выберите «перейти к процессу» > щелкните правой кнопкой мыши процесс и выберите «Конец процесса»
Служба должна уйти после этого
Обнаружена еще одна вещь, которую нужно проверить - посмотрите в диспетчере задач - если к этому блоку подключены другие пользователи, даже если они «отключены», вы должны фактически подписать их, чтобы служба наконец удалила.
Похоже, что в версиях Windows, отличных от Windows 7 (непроверенных, но по последним данным Windows Server 2012 R2), менеджер управления услугами (SCM) является более строгим.
В то время как в Windows 7 он просто порождает другой процесс, теперь он проверяет, все ли еще существует процесс обслуживания, и может возвращать ERROR_SERVICE_MARKED_FOR_DELETE (1072) для любого последующего вызова CreateService / DeleteService, даже если служба, по-видимому, остановлена.
Я говорю здесь о коде Windows API, но хочу четко обрисовать, что происходит, чтобы эта последовательность могла привести к упомянутой ошибке:
& Лт;!- язык: c ++ - >
Причина, по которой процесс обслуживания все еще существует после того, как он уже сообщил о своем состоянии SERVICE_STOPPED, не удивительна. Это обычный процесс, основной поток которого «застрял» в своем вызове API «StartServiceCtrlDispatcher», поэтому он сначала реагирует на действие контроля остановки, но затем должен выполнить оставшуюся последовательность кода.
К сожалению, SCM / OS не справляется с этим должным образом для нас. Программное решение довольно простое и точное: получите дескриптор процесса исполняемого файла службы перед остановкой службы, а затем подождите, пока этот дескриптор не будет сигнализирован.
Если подойти к проблеме с точки зрения системного администрирования, решение также состоит в том, чтобы дождаться полного исчезновения процесса обслуживания.
Это то, что сработало для меня
(Среда была Windows 7.)
В моем случае я выполняю
taskkill / f / im dongleserver.exe
, гдеdongleserver.exe
- это exe-файл моей программы.Тогда я уже смогу переустановить свою программу.
В моем случае это было вызвано необработанным исключением при создании источника eventLog. Используйте попытку поймать, чтобы указать причину.
Закрытие каждого окна, которое было открыто в данный момент, с последующим запуском следующей команды решило проблему для меня:
У меня была эта проблема, когда я использовал Application Verifier для проверки своего выигрышного сервиса. Даже после того, как я закрыл App Ver, мой сервис был заблокирован от удаления. Только удаление сервиса из App Ver решило проблему, и сервис был удален сразу. Похоже, какой-то процесс все еще использует ваш сервис после того, как вы попытались удалить его.
шаги для подражания:
step-1 goto местоположение C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319
step-2 команда запуска: installutil / u full-path / servicename.exe
шаг-3 закрыть панель служб и снова открыть ее
step-4 команда запуска: installutil full-path / servicename.exe
Скорее всего, удаление сервиса не удается, потому что
ошибка броска при остановке сервиса. упаковка вещей в улов попытки предотвратит ошибку удаления метки
}
Если шаги, предоставленные @MainMa, не сработали, выполните следующие действия
Шаг 1 Попробуйте убить процесс из диспетчера задач Windows или с помощью taskkill / F / PID < Service PID > . Вы можете найти pid процесса с помощью команды 'sc queryex < service name >'. Попробуйте следующий шаг, если вы все еще не можете удалить.
Шаг 2 Если выше
Запустите Autoruns для Windows Поиск службы по имени и результаты удаления.
Основная причина ошибки - процесс не остановлен. Чтобы решить эту проблему, запустите диспетчер задач, перейдите в службы и посмотрите, сможете ли вы увидеть свой сервис, чем переходите к процессу этого сервиса и завершите процесс. Чем проблема будет решена полностью.