У меня была такая же проблема, как и вы. У меня есть системная служба, которую я хочу удалить, а затем переустановить как часть обновления. В некоторых системах это не будет работать без перезагрузки. Проблема заключалась в том, что вызов DeleteService() вернется в норму, но следующий вызов CreateService() скажет мне, что служба все еще существует, но помечена для удаления (код ошибки 1072). Реестр будет отражать это, поскольку подраздел был все еще там (под HKLM \ System \ CurrentControlSet \ Services), но для параметра «DeleteFlag» было установлено значение 1. С этого момента только перезагрузка может исправить ситуацию.
Некоторые вещи, которые не работают:
- Использование «СБН удалить»: это были те же проблемы, как и я вызов будет вернуться в порядке, но услуга не была на самом деле нет и до сих пор в реестре с DeleteFlag = 1.
- Удаление ключа в реестре. Кажется, что Service Manager хранит базу данных в памяти, а реестр - только ее копия для следующей загрузки.
- Добавление циклов ожидания, ожидающих, что файлы .exe будут готовы к перезаписыванию, уничтожению процесса и т. Д.
- Закрытие ручек к сервису. Какие??
Но вот что работает:
я заметил, в некоторых статьях на StackOverflow, что net.exe имеет старт/стоп функции, а (я только знал о sc.exe полезности). И как ни странно, работала «net stop svcname» плюс «sc delete svcname»! Поэтому net.exe должен делать то, что я не делаю.
Но net.exe не содержит импорт для ControlService(), и как он останавливает службу? Я узнал, что net.exe запускает net1.exe, но net1.exe не импортирует ControlService(). Я использовал большую утилиту API Monitor (http://www.rohitab.com/apimonitor), чтобы узнать, что такое net1.exe делает, но он никогда не называл ничего перспективного.
Но потом я увидел, что он импортирует NetServiceControl() из NETAPI32.DLL (у которого было хотя бы «Сервис» в его имени!). MSDN говорит, что эта функция устарела. Тем не менее, я нашел прототип в LMSvc.h и некоторые параметры здесь: http://cyberkinetica.homeunix.net/os2tk45/srvfpgr/369_L2_NetServiceControlorN.html. Когда вы загружаете NETAPI32.DLL и используете NetServiceControl(NULL, service_name, 3, 0, 0)
(3 для SERVICE_CTRL_UNINSTALL, который используется для остановки), служба останавливается впоследствии. И его можно удалить и переустановить впоследствии без DeleteFlag или перезагрузить!
Так что это никогда не было проблемой удаления, но и для правильной остановки обслуживания. И NetServiceControl() делает трюк. Извините за длинный пост, но я подумал, что это может помочь кому-то с похожими проблемами. (Только для справки, я использую Win7 SP1 x64.)
Спасибо всем за помощь! Я обнаружил, что источником моей проблемы был дескриптор файла .exe от WMI. См. Мой новый вопрос: http://stackoverflow.com/questions/302315/want-to-script-window-wmi-wmiprvseexe-to-release-handle-on-file – 2008-11-19 15:44:10
FYI, если у вас открыт диспетчер служб, вам нужно закрыть перед повторной установкой службы, иначе вы получите сообщение об ошибке «служба уже отмечена для удаления». – ChandlerPelhams 2012-07-03 21:20:15
В [моем опыте] (http://stackoverflow.com/a/16293612/1810429) «[SC] CreateService FAILED 1072: указанная служба была помечена для удаления» зависит от того, не была ли остановлена служба, которая была удалена , Я попытался воспроизвести ошибку, просто открыв инструмент администрирования служб и не смог. – J0e3gan 2013-05-01 05:16:14