Как устранить ошибку «Указанный сервис помечен для удаления»

584

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

[SC] DeleteService FAILED 1072:

Указанный сервис был помечен для удаления.

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

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

Какой следующий шаг?

Арсений Мурзенко
источник
4
Перезагрузка должна, как правило, очищать любое длительное состояние.
Damien_The_Unbeliever
14
Я знаю. Но я подумал о менее радикальном решении. Перезагрузка тридцать раз в день не будет приемлемым решением в моем случае.
Арсений Мурзенко
54
"Почему вы регулярно удаляете сервисы?" Я пишу службу Windows. Каждый раз, когда он компилируется, он должен быть перезапущен. "Тем не менее, взламывание реестра 30 раз в день приемлемо?" : полностью. Удаление ключа из реестра не заставляет меня все сохранять, закрывать каждое открытое приложение, подождать минуту, а затем снова открыть все.
Арсений Мурзенко
46
Я написал службы Windows. Если вы не меняете реальный код, который выполняет регистрацию, вам не нужно удалять и переустанавливать его каждый раз, когда вы делаете сборку. До тех пор, пока путь остается прежним, более старая регистрационная информация будет действительна.
Damien_The_Unbeliever
4
@NickTurner - ссылка на какой-либо отчет об ошибке? Какую бы ошибку вы ни ссылались, я не сталкивался. И я не уверен, как задействован MSI, так как мы, вероятно, говорим о создании и запуске служб на компьютере разработчика (что, по крайней мере, является контекстом для этого 5-летнего вопроса)
Damien_The_Unbeliever

Ответы:

1245

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

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

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

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

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

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

  6. Ключ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {имя службы} существует .

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

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

Арсений Мурзенко
источник
9
Диспетчер задач, кажется, делает то же самое. И, как отмечено ниже, оставление консоли служб открытым также может привести к этому.
CodingBarfield
4
... и если закрыть все это по-прежнему не помогает, и вы по-прежнему видите службу как "помеченную для удаления", сделайте простой выход из системы вместо полного перезапуска. это помогло мне несколько раз.
Недько
2
Один общий рабочий процесс: ваши гнусные коллеги также подключены к удаленному серверу, и у них у всех есть что-то открытое ...
Крис О,
72
Закрытие консоли служб решило эту проблему для меня! Мой процесс был следующим: В командной строке VS2012 x64 Native Tools -> Перейдите в каталог с доступной службой -> installutil / u servicename.exe (чтобы удалить устаревшую службу) -> Скопируйте новую встроенную службу exe - > installutil servicename.exe (для установки обновленного сервиса) . Я вообще могу удалить и переустановить сразу без проблем. Пока я случайно не могу. Закрытие консоли служб решило это. Спасибо за совет!
thehelix
17
На мой взгляд, Process Explorer является самым большим. Я предлагаю выделить его и / или переместить в начало списка.
Кокси
224

Это также может быть вызвано, если оставить консоль служб открытой. Windows фактически не удалит сервис, пока он не будет закрыт.

forcedfx
источник
3
Как я указал в своем вопросе, «Консоль управления Microsoft закрыта» во время тестов.
Арсений Мурзенко
25
В моем случае консоль служб была проблемой. Как только я закрыл его и снова открыл, удаленные сервисы исчезли.
Фаррух Наджми
3
Трудно поверить, что дело было в том, чтобы держать окно открытым ... Спасибо!
Кароль
Это сработало и для меня, хотя, как ни странно, было много случаев, когда простое нажатие клавиши F5 обновляло список с удаленным сервисом.
Стив Смит
1
Вы спасли мой день
Праной Саркар
50

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

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

  • получить идентификатор процесса службы с

    sc queryex <service name>

  • убить процесс с

    taskkill /F /PID <Service PID>

Али Садри
источник
2
мой PID равен 0, поэтому мне лучше не убивать это!
ограбить
Вы можете удалить службу для этого, выполнив шаги 1 - запустите cmd 2 - измените направление на файл .exe вашей службы, найдите эту 3 - выполните команду installutil / u <yourfilename.exe>
Ali Sadri
+1 для sc queryex Я смогу использовать это, чтобы получить PID, если я хочу подключить отладчик
Пол Маккарти
44

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

Сумит Агравал
источник
13

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

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

Амей П Наик
источник
11

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

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

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

mathart63
источник
7

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

Кэти Грита
источник
4
Ненужные. Вы просто должны убедиться, что все выходят из консоли управления (MMC) и панели управления службами.
Маркиз Лорн
6

Похоже, что в версиях 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, не удивительна. Это обычный процесс, основной поток которого «застрял» в своем вызове StartServiceCtrlDispatcherAPI, поэтому он сначала реагирует на действие управления остановкой, но затем должен выполнить оставшуюся последовательность кода.

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

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

Клаус Триендль
источник
6

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

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

balintn
источник
2
Windows 2008 здесь, я должен был просто закрыть панель служб
Mathijs Segers
5

В моем случае я выполняю taskkill /f /im dongleserver.exe, где dongleserver.exeнаходится исполняемый файл моей программы.

Тогда я могу переустановить свою программу уже.

Сиан Чив Си
источник
4

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

Ариюс Гилбрантас
источник
4

Закрытие каждого окна, которое было открыто в данный момент, с последующим запуском следующей команды решило проблему для меня:

taskkill /F /IM mmc.exe
Цилидзи Мудау
источник
3

Закрытие консоли служб, как было предложено в нескольких ответах, позволило мне удалить службу. В моем сценарии это было только кратковременное исправление, так как все последующие переустановки и удаление службы потребовали бы от меня дополнительных действий. Просматривая мой файл web.config, я обнаружил, что однажды исправленная ошибка позволила мне легко удалить службу без дополнительного закрытия шага консоли служб.

GatesReign
источник
1

Это работает для меня.

  • Открыть диспетчер задач
  • Выберите вкладку услуг
  • Выберите сервис с вопросом
  • Щелкните правой кнопкой мыши и выберите «Перейти к деталям»
  • Щелкните правой кнопкой по сервису и выберите «Завершить дерево процессов».

Дерево завершения процесса завершит процесс и все процессы, созданные процессом.

Затем вы можете переустановить службу.

OIbuoye
источник
1

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

Я переименовал свой сервис в другое

Йаман
источник
0

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

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

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

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

Charith
источник
0

Основная причина ошибки - процесс не остановлен. чтобы разрешить его, запустите диспетчер задач, перейдите в службы и посмотрите, можете ли вы по-прежнему видеть свою службу, чем перейти к процессу этой службы и завершить процесс. Чем проблема будет решена полностью.

Гаурав Тяги
источник
0

У меня возникла эта проблема, когда я использовал Application Verifier для проверки моей службы win. Даже после того, как я закрыл App Ver, мой сервис был заблокирован от удаления. Только удаление службы из App Ver решило проблему, и служба была удалена сразу. Похоже, какой-то процесс все еще использует ваш сервис после того, как вы попытались удалить его.

vadzvnik
источник
0

шаги, чтобы следовать:

шаг-1 перейдите в папку C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

шаг-2 запустите команду: installutil / u полный путь / servicename.exe

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

Шаг 4 Запустите команду: installutil full-path / servicename.exe

Дивьянг Шах
источник
1
примечание: installutil работает ТОЛЬКО как администратор, поэтому откройте оболочку как администратор.
ingconti
0

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

protected override void OnStop()

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

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

}

e03050
источник
0

Иногда это может происходить во время удаления службы с помощью сценария удаленного сеанса PowerShell, особенно когда вы пытаетесь удалить службу несколько раз. В этом случае попробуйте воссоздать сеанс перед удалением:

Remove-PSSession -Session $session
$newSession = New-PSSession -ComputerName $Name  -Credential $creds -ErrorAction Stop
Enter-PSSession $newSession
Алекс Подлес
источник