Як змусити видалити сервіс Windows


173

Я встановив службу Windows за допомогою installUtil.exe.

Після оновлення коду я знову застосував installUtil.exe, щоб встановити службу без видалення спочатку оригінальної версії.

Коли я зараз намагаюся видалити службу, instaUtil.exe завершує видалення успішно, але служба все одно з’являється.

Якщо я спробую змінити його властивості, я отримаю повідомлення "Служба позначена для видалення".

Як я можу примусити видалення (бажано без перезавантаження сервера)?


Якщо служба
зависла,

Відповіді:


469

Одне, що мене зловило в минулому, - це те, що якщо у вас працює програма перегляду послуг, це заважає повністю видалити служби, настільки закрийте, що попередньо


70
Я навряд чи вірю, що доступ до глядача відкритих перерв на видалення послуги - як нерозумно!
Draemon

1
Це так нерозумно від Microsoft, але воно справді працює. З незрозумілої причини відкриття програми перегляду послуг перешкоджає їх правильному видаленню.
ivantod

1
Я думаю, що ця відповідь матиме сотні подібних коментарів. Я щойно втратив 30хв з цим дурним питанням ...
PierrOz

2
Здається, що провідник процесів SysInternals також блокує послуги (а може бути і менеджер завдань), тому переконайтесь, що ви також закрили їх!
danio

3
також переконайтеся, що використовуєте підказку cmd. PowerShell не показує помилок, але також не видаляє.
Бруно Фарія

145

Вам не доведеться перезавантажувати машину. Запустіть cmd або PowerShell у підвищеному режимі.

sc.exe queryex <SERVICE_NAME>

Тоді ви отримаєте деяку інформацію. З'явиться номер PID.

taskkill /pid <SERVICE_PID> /f

Де / f - примусити зупинити.

Тепер ви можете встановити або запустити свою послугу.


2
Працювали з більшими зусиллями, де все інше, крім перезавантаження, не вдалося - приємно!
DaveF

36
Це не спрацювало для мене - під для моєї служби повернув 0, і це не дозволить мені видалити критичний системний процес.
плазма147

4
A + дивним. Використовуйте sc delete, а потім вище.
Зона12

7
не працювало, оскільки PID прийшов як 0, це вирішило мою проблему - (SC) DeleteService FAILED 1072
Web-E

3
Абсолютно корисна! У моєму випадку нічого, крім перезавантаження, не працювало. Навіть не видаляючи службу каталогу в Реєстрі! Один Гоча , хоча: Якщо ви працюєте в використанні PowerShell: sc.exe queryex <SERVICENAME>. Оскільки scтакож є псевдонімом Set-Content, воно буде СИЛЬНЯТИ невдалим, коли ви користуєтесь цим.
Іфєді Оконкво

97

добре, ви можете використовувати SC.EXE для видалення будь-яких служб Windows насильно, якщо невідоме видалення не видаляє.

sc delete <Service_Name>

Докладніше про "MS Techno Blogging" Напружене видалення служб із служб MMC


5
Дякую за це Зауважте, що якщо "Назва послуги" не збігається з "Відображуване ім'я", ви можете отримати "Ім'я послуги" у властивостях служби.
GuiSim

8
sc deleteтакож повідомить, що "сервіс позначений для видалення", якщо для служби відкрита ручка.
Мет

@GuiSim дякую за це, я підозрюю, що багато хто поставить таке ім'я, як я!
nik0lai

Спробував це, але отримав це повідомлення: [SC] DeleteService FAILED 1072: Зазначена послуга позначена для видалення.
Ендрю В. Філіпс

37

Я знаю, що це не допоможе, але це може допомогти комусь у майбутньому.

У мене щойно виникала така ж проблема, коли закриття та повторне відкриття менеджера служб видалили запис із реєстру та завершили видалення служби.

До цього оновлення менеджера послуг не допомогло.


1
Дякую, що задзвонив. Мій досвід був саме таким, як ви описали.
пк.

10
sc delete sericeName

Просто переконайтеся, що послуга зупинена, перш ніж робити це. Я бачив цю роботу більшість разів. Бувають випадки, коли я бачив, як вікна щось застрягли, і це наполягає на перезавантаженні.


Просто додаток .. Мені довелося запустити мій dos prom / .NET-підказок як адміністратор, щоб отримати доступ для запуску sc delete команди .. про всяк випадок, якщо хтось інший натрапив на цю проблему.
Dav.id

Запустіть "NET STOP <serviceName>" перед SC DELETE, щоб переконатися, що послуга була припинена перед видаленням
Adi

Це також був мій досвід, мені в кінцевому підсумку довелося перезавантажити, щоб видалити вперту службу, яка була лише частково видалена (вона все ще виявилася в оснащенні з кодом 2). Перезавантаження було те, що нарешті змусило його піти.
delliottg

5

Закрийте вікно cmd та служб, якщо воно відкрите, а потім запустіть cmd ще раз, натиснувши правою кнопкою миші та вибравши запустити як адміністратор. Якщо sc delete sericeNameне працює або нічого не працює.

http://weblogs.asp.net/avnerk/archive/2007/09/05/windows-services-services-msc-and-the-quot-this-service-is-marked-for-deletion-quot-error. асп


4

На жаль, вам потрібно перезапустити сервер. Це повинно видалити "видалену" службу.


12
Ні. Вам не потрібен перезапуск. Дивіться моє рішення :)
johan

2
Мені справді подобається рішення користувача186749 ще краще. Приємно і чисто.
Маккей

3

На всякий випадок, якщо ця відповідь комусь допоможе: як знайдено тут , ви можете врятувати собі багато проблем із запуском Sysinternals Autoruns як адміністратора. Просто перейдіть на вкладку "Послуги" та видаліть службу.

Це зробило трюк для мене на машині, де я не мав дозволу редагувати реєстр.


3

Ви можете видалити вручну ключ реєстру для вашої служби, який знаходиться за адресою HKLM\SYSTEM\CurrentControlSet\Services, після цього ви не побачите службу в диспетчері управління сервісом (потрібно оновити або повторно відкрити, щоб побачити зміни), і ви можете перевстановити службу як завжди.


У Windows 2012 R2 спричиняє оснащення служб MMC (Services.MSC) " Не вдалося прочитати опис. Код помилки: 2 ". Незважаючи на те, що всі інші MMC були закриті, а інші користувачі не входили в систему.
Сигнал15

Я бачу, протестував лише в Windows 8 та Windows 10 (і він працював).
Фернандо Гонсалес Санчес

ЦЕ остаточно вирішило мою проблему. Я забув додати інсталятор служби в проект і не зміг видалити свою службу після встановлення. Рекомендую здійснити експорт дерева сервісу reg перед тим, як видалити що-небудь із нього. Дуже дякую!
користувач3772108

2

Наступне буде працювати без перезавантаження машини:

  1. Шукайте в реєстрі \ HKEY_LOCAL_MACHINE <<Ім'я вашої служби> (як ключі, так і значення)
  2. Встановіть значення "Спадщина" на 0

1

Ви намагалися зупинити послугу перед тим, як зателефонувати на видалення? У мене була ця проблема випадковим чином. Колись я міг її видалити без перезавантаження. Я здогадуюсь, що це стосується служби, яка все ще працює


1

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

Коли я щовечора встановлюю свої послуги Windows у процесі CI, мені потрібно було щось, що працює весь час і повністю автоматизоване. Чомусь після видалення їх служби завжди позначалися для видалення (5 хвилин і більше). Тому я розширив пакетний сценарій перевстановлення, щоб переконатися, що послуга справді видалена (спрощена версія):

REM Stop the service first
net stop My-Socket-Server

REM Same as installutil.exe, just implemented in the service
My.Socket.Server.exe /u

:loop1
    REM Easy way to wait for 5 seconds
    ping 192.0.2.2 -n 1 -w 5000 > nul
    sc delete My-Socket-Server
    echo %date% %time%: Trying to delete service.
    if errorlevel 1072 goto :loop1

REM Just for output purposes, typically I get that the service does not exist
sc query My-Socket-Server

REM Installing the new service, same as installutil.exe but in code
My.Socket.Server.exe /i

REM Start the new service
net start My-Socket-Server

Що я можу побачити, це те, що послуга відзначається для видалення протягом приблизно 5 хвилин (!), Поки вона нарешті не пройде. Нарешті, більше не потрібно вручну втручатися. Я продовжую сценарій у майбутньому, щоб щось відбулося через певний час (наприклад, повідомлення через 30 хвилин).


1

Це працювало для мене

$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()

Якщо ваш результат із цього показує ReturnValue : 16, то команда не вдалась із пунктом " Ця служба видаляється з системи ". Повний список ReturnValues ​​від Microsoft тут
Signal15

1

Якщо ви не можете зупинити службу в Сервісах , ви можете зупинити свою службу Windows у програмі диспетчера завдань . Після цього послугу можна видалити.


0

Оновлення списку послуг завжди робило це для мене. Якщо вікно служб відкрите, воно з певних причин збереже деяку пам'ять про нього. F5, і я знову встановлюю!


0

Також переконайтесь, що немає екземплярів виконуваного файлу, який все ще є активним (можливо, якийсь, можливо, запускався з будь-якої причини незалежно від служби).

Я відкривав і закривав MMC і шукав PID, щоб вбити - але, шукаючи в Explorer Explorer, було пару існуючих процесів, запущених із забутої запланованої партії. Вбив їх. Робота виконана.


0

На цю тему є багато питань на форумі.

Я знайшов відповідь у Windows api. Вам не потрібно перезавантажувати комп’ютер після видалення послуги. Вам потрібно зателефонувати:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

Це закриває ручку служби. У Windows 7 це вирішило мою проблему. Я згоден:

  • зупинка служби
  • тісна ручка
  • видалити послугу
  • зачекайте 3 сек
  • скопіюйте новий файл у каталог
  • встановити послугу
  • почати службу
  • тісна ручка

2
Де ви можете закрити ручку, якщо ви не в програмі, яка має відкриту ручку?
Мт

0

Наступні PowerShell обмотані разом з декількох місць для наших випадків розгортання Octopus, коли TopShelf перестає працювати або служба виходить з ладу з якоїсь іншої причини.

$ServiceName = 'MyNaughtyService'
$ServiceName | Stop-Service -ErrorAction SilentlyContinue
# We tried nicely, now KILL!!!
$ServiceNamePID = Get-Service | Where { $_.Name -eq $ServiceName} # If it was hung($_.Status -eq 'StopPending' -or $_.Status -eq 'Stopping') -and
$ServicePID = (Get-WmiObject Win32_Service | Where {$_.Name -eq $ServiceNamePID.Name}).ProcessID
Stop-Process $ServicePID -Force

0

Варто також зазначити, що це:

sc delete "ServiceName"

не працює в PowerShell, sc - псевдонім для командлета Set-Content у PowerShell. Вам потрібно зробити:

sc.exe delete "ServiceName"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.