Як вирішити помилку "Вказана послуга позначена для видалення"


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

Відповіді:


1243

Можливо, є кілька причин, які призводять до того, що послуга застрягла у "Позначеному для видалення".

  1. Відкриється Провідник процесів SysInternals . Закриття його повинно призвести до автоматичного видалення послуги.

  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
Тут, на мою думку, великий провідник. Я пропоную виділити його жирним шрифтом та / або перемістити його вгору списку.
Coxy

222

Це також може бути спричинено тим, що консоль Служб відкрита. Windows фактично не видалить службу, поки її не закриють.


3
Як я зазначив у своєму запитанні, під час тестів «Консоль управління Microsoft закрита».
Арсеній Муренко

25
У моєму випадку проблема була консолью Служб. Як тільки я закрив його і знову відкрив його, видалені служби пішли.
Farrukh Najmi

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>
Алі Садрі

+1 для sc queryex Я зможу використовувати це, щоб отримати PID, якщо я хочу приєднати налагоджувач
Пол Маккарті

44

У моєму випадку це спрацювало після закриття Services. Перевірте , якщо Services.mscвідкритий, якщо так , то закрити його і перевірити будь-який процес обслуговування знаходиться в Task Manager.


13

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

installutil "шлях обслуговування"


11

Видалення ключів реєстру, як було запропоновано вище, заставило мою службу зупинитися. Наступна процедура працювала для мене:

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

Сервіс після цього повинен бути відсутній


7

Виявили ще одну річ, яку потрібно перевірити - загляньте в диспетчер завдань - якщо до цього вікна підключені інші користувачі, навіть якщо вони "відключені", ви повинні фактично вийти з них, щоб сервіс остаточно видалив.


4
Непотрібне. Ви просто повинні переконатися, що всі виходять із консолі управління Microsoft (MMC) та панелі керування Services.
Маркіз Лорн

6

Схоже, що у версіях Windows пізніше Windows 7 (неперевірена, але за останнім досвідом із Windows Server 2012 R2) диспетчер управління сервісом (SCM) є більш суворим.

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

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

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).


2
Windows 2008 тут, мені довелося просто закрити панель послуг
Mathijs Segers

5

У моєму випадку я виконую taskkill /f /im dongleserver.exe, де dongleserver.exeзнаходиться файл EXE моєї програми.

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


4

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


4

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

taskkill /F /IM mmc.exe

3

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


1

Це працює для мене.

  • Відкрити диспетчер завдань
  • Виберіть вкладку "Послуги"
  • Виберіть службу з проблемою
  • Клацніть правою кнопкою миші та виберіть "Перейти до деталей"
  • Клацніть правою кнопкою миші на сервісі та виберіть "Завершити дерево процесу"

Кінцеве дерево процесу закінчить процес і всі процеси, створені процесом.

Потім ви можете перевстановити послугу.


1

У моєму випадку назва послуги була "Монітор", яку також використовує служба Windows під назвою "Монітор", коли я намагався оновити свої послуги, я спробував їх видалити, інсталятор намагався видалити службу Windows "Монітор", яку він не вдалося, і інсталяція завжди відкочувалася.

Я в кінцевому підсумку перейменував свою службу на щось інше


0

Якщо кроки, надані @MainMa, не спрацювали, виконайте наступні дії

Крок 1 Спробуйте вбити процес із менеджера завдань Windows або за допомогою taskkill / F / PID. Ви можете знайти pid процесу за допомогою команди 'sc queryex'. Спробуйте наступний крок, якщо ви все ще не можете видалити його.

Крок 2 Якщо вище

Запустіть Autoruns for Windows Search для служби за назвою та видаліть результати.


0

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


0

У мене виникла ця проблема, коли я використовував Verifier Application для підтвердження своєї послуги виграшу. Навіть після закриття програми App Ver моя служба була заблокована для видалення. Лише видалення служби з App Ver вирішило проблему, і сервіс було видалено відразу. Схоже, якийсь процес все ще використовує вашу послугу після того, як ви спробували її видалити.


0

наступні кроки:

крок 1 перейдіть до місця C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

крок-2команда виконання : installutil / u full-path / servicename.exe

крок-3 закрийте панель послуг та відкрийте її знову

команда виконання кроку-4 : installutil full-path / servicename.exe


1
побічна примітка: instautil працює ТІЛЬКИ як адміністратор, тому відкрийте оболонку як адміністратор.
ingconti

0

Швидше за все, видалення послуги не вдається, оскільки

protected override void OnStop()

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

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

}


0

Іноді це може статися під час видалення послуги за допомогою сценарію віддаленого сеансу PowerShell, особливо коли ви намагаєтесь видалити службу кілька разів. У цьому випадку спробуйте відтворити сеанс перед видаленням:

Remove-PSSession -Session $session
$newSession = New-PSSession -ComputerName $Name  -Credential $creds -ErrorAction Stop
Enter-PSSession $newSession
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.