Manu
Manu

Reputation: 29153

How to force uninstallation of windows service

I installed a windows service using installUtil.exe.

After updating the code I used installUtil.exe again to install the service w/o uninstalling the original version first.

When I now try to uninstall the service, installUtil.exe completes the uninstall successfully, but the service still appears.

If I try to change its properties, I receive the message 'service is marked for deletion'.

How can I force the deletion (preferrably w/o restarting the server)?

Upvotes: 202

Views: 242861

Answers (22)

Yola
Yola

Reputation: 19061

If you are using Power Shell then sc may refer to cmdlet Set-Content so you need to use sc.exe instead.

sc.exe delete ...

Upvotes: 0

martin
martin

Reputation: 990

as per this problem here. Sometimes you have to force kill the process in order to remove it and sc delete won't always work. So you can do:

taskkill /pid (sc.exe queryex MyService | Select-String 'PID\s+:\s+(\d+)' | ForEach-Object { $_.Matches.Groups[1].Value }) /f

Upvotes: 0

Alper Ebicoglu
Alper Ebicoglu

Reputation: 9634

This worked for me:

net stop "MyWindowsService"
taskkill /F /IM mmc.exe
sc delete "MyWindowsService"

Upvotes: 7

incomplete
incomplete

Reputation: 546

Close cmd and services window if opened, then start cmd again by right clicking and selecting run as administrator. If sc delete serviceName does not work or anything does not work.

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

Upvotes: 5

Richard
Richard

Reputation: 3367

It is also worth noting that this:

sc delete "ServiceName"

does not work in PowerShell, sc is an alias for the cmdlet Set-Content in PowerShell. You need to do:

sc.exe delete "ServiceName"

Upvotes: 16

OguzhanKircali
OguzhanKircali

Reputation: 484

If you can not stop the service in Services, you can stop your windows service exe in Task Manager. After that, you can remove the service.

Upvotes: 1

expirat001
expirat001

Reputation: 2215

This worked for me

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

Upvotes: 6

johan
johan

Reputation: 6666

You don't have to restart your machine. Start cmd or PowerShell in elevated mode.

sc.exe queryex <SERVICE_NAME>

Then you'll get some info. A PID number will show.

taskkill /pid <SERVICE_PID> /f

Where /f is to force stop.

Now you can install or launch your service.

Upvotes: 163

dragon788
dragon788

Reputation: 3931

I use the following PowerShell cobbled together from a few places for our Octopus Deploy instances when TopShelf messes up or a service fails for some other reason.

$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

Upvotes: 0

You can manually delete the registry key for your service, located at HKLM\SYSTEM\CurrentControlSet\Services, after that you won't see the service in service control manager (need to refresh or reopen to see the change), and you can reinstall the service as usual.

Upvotes: 3

Tan
Tan

Reputation: 241

Just in case this answer helps someone: as found here, you might save yourself a lot of trouble running Sysinternals Autoruns as administrator. Just go to the "Services" tab and delete your service.

It did the trick for me on a machine where I didn't have any permission to edit the registry.

Upvotes: 3

marco
marco

Reputation: 667

I am late, but would like to add an alternative, which may look strange, but I didn't see another way:

As I install my Windows Services in a CI process each night, I needed something that works all the time and is completely automated. For some reason, the services were always marked for deletion for a long time (5 minutes or more) after uninstalling them. Therefore, I extended the reinstallation batch script to make sure that the service is really deleted (simplified version):

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

What I can see, is that the service is marked for deletion for about 5 minutes (!) until it finally goes through. Finally, I don't need any more manual interventions. I will extend the script in the future so that something happens after a certain time (e.g. notification after 30 minutes).

Upvotes: 1

Gabor Balazs
Gabor Balazs

Reputation: 1

There are plenty of forum questions in that subject.

I have found the answer in windows api. You don't need to restart the computer after uninstalling the service. You have to call:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

That closes the handle of the service. On windows 7 it solved my problem. I do:

  • stop service
  • close handle
  • uninstall service
  • wait 3 sec
  • copy new exe to the directory
  • install the service
  • start service
  • close handle

Upvotes: -1

Unsliced
Unsliced

Reputation: 10552

Also make sure that there are no instances of the executable still active (perhaps one that might have been running, for whatever reason, independently of the service).

I was opening and closing MMC and looking for the PIDs to kill - but when looking in process explorer there were a couple of extant processes running from a forgotten scheduled batch. Killed them. Job done.

Upvotes: 0

Dmitry
Dmitry

Reputation: 399

The following will work without restarting the machine:

  1. Search the Registry \ HKEY_LOCAL_MACHINE for < Your Service Name > (both keys and values)
  2. Set "Legacy" value to 0

Upvotes: 2

Martin
Martin

Reputation: 1375

I know this isn't going to help, but it might help someone in the future.

I've just had the same problem, closing and re-opening the services manager removed both the entry from the registry and completed the uninstall of the service.

Previous to that, refreshing the services manager hadn't helped.

Upvotes: 41

the_mandrill
the_mandrill

Reputation: 30862

One thing that has caught me out in the past is that if you have the services viewer running then that prevents the services from being fully deleted, so close that beforehand

Upvotes: 548

Jer
Jer

Reputation: 1

Refreshing the service list always did it for me. If the services window is open, it will hold some memory of it existing for some reason. F5 and I'm reinstalling again!

Upvotes: 0

user186749
user186749

Reputation:

well, you can use SC.EXE to delete any windows Service forcefully if un-install doesnt removes by any chance.

sc delete <Service_Name>

Read more on "MS Techno Blogging" Deleting Services Forcefully from Services MMC

Upvotes: 108

Aaron Weiker
Aaron Weiker

Reputation: 2531

sc delete sericeName

Just make sure the service is stopped before doing this. I have seen this work most times. There are times where I have seen windows get stuck on something and it insists on a reboot.

Upvotes: 13

faulty
faulty

Reputation: 8347

Have you try stopping the service before calling uninstall? I had this problem randomly. Sometime I could remove it without restarting. My guess is that it has to do with the service still running

Upvotes: 1

seanyboy
seanyboy

Reputation: 5693

Unfortunately, you need to restart the server. That should remove the "deleted" service.

Upvotes: 4

Related Questions