Я пытаюсь удалить службу 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 , используемый для отладки сервиса , открыт.
В моем случае это сработало после закрытия «Услуги». Проверьте, открыт ли 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 ++ - >
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 не справляется с этим должным образом для нас. Программное решение довольно простое и точное: получите дескриптор процесса исполняемого файла службы перед остановкой службы, а затем подождите, пока этот дескриптор не будет сигнализирован.
Если подойти к проблеме с точки зрения системного администрирования, решение также состоит в том, чтобы дождаться полного исчезновения процесса обслуживания.
Это то, что сработало для меня
(Среда была Windows 7.)
В моем случае я выполняю taskkill / f / im dongleserver.exe
,
где dongleserver.exe
- это exe-файл моей программы.
Тогда я уже смогу переустановить свою программу.
В моем случае это было вызвано необработанным исключением при создании источника eventLog. Используйте попытку поймать, чтобы указать причину.
Закрытие каждого окна, которое было открыто в данный момент, с последующим запуском следующей команды решило проблему для меня:
taskkill /F /IM mmc.exe
У меня была эта проблема, когда я использовал 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
Скорее всего, удаление сервиса не удается, потому что
protected override void OnStop()
ошибка броска при остановке сервиса. упаковка вещей в улов попытки предотвратит ошибку удаления метки
protected override void OnStop()
{
try
{
//things to do
}
catch (Exception)
{
}
}
Если шаги, предоставленные @MainMa, не сработали, выполните следующие действия
Шаг 1 Попробуйте убить процесс из диспетчера задач Windows или с помощью taskkill / F / PID < Service PID > . Вы можете найти pid процесса с помощью команды 'sc queryex < service name >'. Попробуйте следующий шаг, если вы все еще не можете удалить.
Шаг 2 Если выше
Запустите Autoruns для Windows Поиск службы по имени и результаты удаления.
Основная причина ошибки - процесс не остановлен. Чтобы решить эту проблему, запустите диспетчер задач, перейдите в службы и посмотрите, сможете ли вы увидеть свой сервис, чем переходите к процессу этого сервиса и завершите процесс. Чем проблема будет решена полностью.