Windows hizmetinin kaldırılmasını zorlama


174

İnstallUtil.exe kullanarak bir Windows hizmeti yükledim.

Kodu güncelledikten sonra, önce orijinal sürümü kaldırarak hizmeti yüklemek için installUtil.exe'yi tekrar kullandım.

Şimdi hizmeti kaldırmaya çalıştığımda, installUtil.exe kaldırma işlemini başarıyla tamamlar, ancak hizmet yine de görünür.

Özelliklerini değiştirmeye çalışırsam, 'hizmet silinmek üzere işaretlenir' iletisini alırım.

Silme işlemini nasıl zorlayabilirim (tercihen sunucuyu yeniden başlatmadan)?


Hizmet asılı ve silme işe yaramazsa bkz . Windows hizmetinin kaldırılması zorlama
Wernfried Domscheit

Yanıtlar:


470

Geçmişte beni yakalamış olan bir şey, eğer hizmet görüntüleyiciniz çalışıyorsa, o zaman hizmetlerin tamamen silinmesini önler, bu yüzden önceden kapatın


70
Görüntüleyicinin açık olması hizmet kaldırmaya son verdiğine inanamıyorum - ne kadar aptalca!
Draemon

1
Bu Microsoft'tan çok aptalca, ama gerçekten işe yarıyor. Açıklanamayan bir nedenden ötürü, hizmet görüntüleyicisinin açık olması, bazen düzgün bir şekilde silinmelerini önler.
ivantod

1
Bu cevabın yüzlerce benzer yorumu olacağını düşünüyorum. Bu aptal
sayıyla

2
Görünüşe göre SysInternals işlem gezgini de hizmetleri kilitler (ve belki de görev yöneticisi) bu yüzden bunları da kapattığınızdan emin olun!
danio

3
Ayrıca cmd istemini kullandığınızdan emin olun. PowerShell herhangi bir hata göstermez, ancak ikisini de silmez.
Bruno Faria

145

Makinenizi yeniden başlatmanız gerekmez. Cmd veya PowerShell'i yükseltilmiş modda başlatın.

sc.exe queryex <SERVICE_NAME>

O zaman biraz bilgi alacaksınız. Bir PID numarası görünecektir.

taskkill /pid <SERVICE_PID> /f

/ F durmaya zorlanacak yer.

Şimdi hizmetinizi yükleyebilir veya başlatabilirsiniz.


2
Yeniden başlatma dışında her şey başarısız oldu - iyi çalıştı!
DaveF

36
Bu benim için işe yaramadı - hizmetimin pid'i 0 döndürdü ve kritik bir sistem işlemini silmeme izin vermedi.
plazma147

4
A + harika. Sc delete ve yukarıdakileri kullanın.
Zone12

7
PID olarak 0 olarak çalışmadı, bu sorunumu çözdü - (SC) DeleteService FAILED 1072
Web-E

3
Kesinlikle yardımcı! Benim durumumda, yeniden başlatmadan kısa bir şey işe yaramadı. Kayıt Defteri'nde hizmet dizini bile silinmiyor! Ama bir tane var: PowerShell'de çalışıyorsanız: kullanın sc.exe queryex <SERVICENAME>. Çünkü scaynı zamanda bir başka adıdır Set-Contentbunu kullandığınızda, bu SESSİZ başarısız olur.
Ifedi Okonkwo

97

iyi, un-install herhangi bir şans eseri kaldırmazsa, herhangi bir Windows hizmeti zorla silmek için SC.EXE kullanabilirsiniz.

sc delete <Service_Name>

"MS Techno Bloglama" hakkında daha fazla bilgi Services MMC'den Zorla Hizmet Silme


5
Bunun için teşekkürler. "Hizmet adı" "Görünen ad" ile aynı değilse, hizmetin özelliklerinde "Hizmet adı" nı alabileceğinizi unutmayın.
GuiSim

8
sc deleteayrıca, hizmete açık bir tanıtıcı varsa "hizmet silinmek üzere işaretlenir" raporunu verir.
Matt

@GuiSim bunun için teşekkürler, birçok kişinin görünen adı olduğu gibi koyacağından şüpheleniyorum!
nik0lai

Bunu denedim ama şu mesajı aldım: [SC] DeleteService FAILED 1072: Belirtilen hizmet silinmek üzere işaretlendi.
Andrew W. Phillips

37

Bunun yardımcı olmayacağını biliyorum, ama gelecekte birine yardımcı olabilir.

Aynı problemi yaşadım, servis yöneticisini kapatıp tekrar açarak hem kayıt defterinden hem girişi kaldırdım hem de hizmetin kaldırılmasını tamamladım.

Bundan önce, hizmet yöneticisini yenilemek yardımcı olmamıştı.


1
İçeri girdiğiniz için teşekkürler. Deneyimim tam olarak tarif ettiğiniz gibiydi.
pk.

10
sc delete sericeName

Bunu yapmadan önce servisin durdurulduğundan emin olun. Bu işi çoğu zaman gördüm. Pencerelerin bir şeye takıldığını gördüğüm zamanlar var ve yeniden başlatma konusunda ısrar ediyor.


Sadece bir ek .. Başka kimse bu sorunla karşılaşırsa, sc delete komutunu çalıştırmak için erişim kazanmak için yönetici olarak dos istemi / .NET istemi çalıştırmak zorunda kaldı.
Dav.id

Silmeden önce hizmetin durdurulduğundan emin olmak için SC DELETE'den önce "NET STOP <serviceName>" komutunu çalıştırın
Adi

Bu da benim deneyim oldu, nihayet sadece kısmen kaldırıldı inatçı bir hizmeti kaldırmak için yeniden başlatmak zorunda kaldı (hala bir kod 2 ile ek ortaya çıktı). Yeniden başlatmak nihayet ortadan kalktı.
delliottg


4

Maalesef sunucuyu yeniden başlatmanız gerekiyor. Bu, "silinmiş" hizmeti kaldırmalıdır.


12
Hayır. Yeniden başlatmanız gerekmez. Çözümümü görün :)
johan

2
Aslında user186749'un çözümünü daha iyi seviyorum. Güzel ve temiz.
McKay

3

Bu cevabın birine yardım etmesi durumunda: burada bulunduğunuz gibi , Sysinternals Autoruns'u çalıştırmakta çok fazla sorun yaşayabilirsiniz yönetici olarak . "Hizmetler" sekmesine gidin ve hizmetinizi silin.

Kayıt defterini düzenleme iznimin olmadığı bir makinede benim için hile yaptı.


3

Hizmetinizin kayıt defteri anahtarını el ile silebilir HKLM\SYSTEM\CurrentControlSet\Services, bundan sonra hizmeti hizmet denetim yöneticisinde göremezsiniz (değişikliği görmek için yenilemeniz veya yeniden açmanız gerekir) ve hizmeti her zamanki gibi yeniden yükleyebilirsiniz.


Windows 2012 R2'de, Hizmetler MMC ek bileşeninin (Services.MSC) " Açıklama Okunamadı. Hata Kodu: 2 " görüntülenmesine neden oluyor. Diğer tüm MMC'lerin kapalı olmasına ve başka hiçbir kullanıcının oturum açmamasına rağmen.
Signal

Anlıyorum, sadece Windows 8 ve Windows 10'da test edildi (ve işe yaradı).
Fernando Gonzalez Sanchez 10'17

Bu sonunda sorunumu çözdü. Projeye bir hizmet yükleyici eklemeyi unuttum ve kurulumdan sonra hizmetimi kaldıramadım. İçindeki herhangi bir şeyi silmeden önce hizmet kaydı ağacının dışa aktarılmasını öneririm. Çok teşekkürler!
user3772108

2

Makineyi yeniden başlatmadan aşağıdakiler çalışır:

  1. \ HKEY_LOCAL_MACHINE Kayıt Defterinde <Hizmet Adınız> için arama yapın (hem anahtarlar hem de değerler)
  2. "Eski" değerini 0 olarak ayarlayın

1

Kaldırma işlemini çağırmadan önce hizmeti durdurmayı denediniz mi? Bu sorunu rasgele yaşadım. Bazen yeniden başlatmadan kaldırabilirim. Benim tahminim hala çalışan hizmet ile ilgili olduğunu


1

Geç kaldım, ancak garip görünebilecek bir alternatif eklemek istiyorum, ancak başka bir yol görmedim:

Windows Hizmetlerimi her gece bir CI işlemine yüklerken her zaman çalışan ve tamamen otomatik bir şeye ihtiyacım vardı. Bazı nedenlerden dolayı, hizmetler kaldırıldıktan sonra daima uzun bir süre (5 dakika veya daha fazla) silinmek üzere işaretlendi. Bu nedenle, hizmetin gerçekten silindiğinden emin olmak için yeniden yükleme toplu komut dosyasını genişlettim (basitleştirilmiş sürüm):

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

Ne görebiliyorum, hizmet sonunda geçene kadar yaklaşık 5 dakika (!) Silinmek için işaretlenmiş olmasıdır. Sonunda, daha fazla manuel müdahaleye ihtiyacım yok. Ben gelecekte bir şey belirli bir süre sonra (örneğin 30 dakika sonra bildirim) olur betiği genişletmek olacaktır.


1

Bu benim için çalıştı

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

Bundan çıktınız gösterilirse ReturnValue : 16, komut " Bu hizmet sistemden kaldırılıyor " ile başarısız oldu . Burada
ReturnValues

1

Eğer hizmet durduramazsan Services , içeri windows hizmet exe durduramaz Görev Yöneticisi . Bundan sonra hizmeti kaldırabilirsiniz.


0

Servis listesini yenilemek her zaman benim için yaptı. Hizmetler penceresi açıksa, bir nedenle belleğinin bir miktar hafızasını tutar. F5 ve tekrar yüklüyorum!


0

Ayrıca, çalıştırılabilir durumun hala etkin olmadığından da emin olun (belki herhangi bir nedenle, hizmetten bağımsız olarak çalışıyor olabilir).

MMC'yi açıp kapıyordum ve öldürmek için PID'leri arıyordum - ancak süreç gezginine bakarken unutulmuş bir programdan çalışan birkaç işlem vardı. Onları öldürdüm. İş bitmiş.


0

Bu konuda çok sayıda forum sorusu var.

Cevabı windows api'de buldum. Hizmeti kaldırdıktan sonra bilgisayarı yeniden başlatmanız gerekmez. Aramanız gerekiyor:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

Bu hizmetin sapını kapatır. Windows 7'de sorunumu çözdü. Yaparım:

  • hizmeti durdur
  • sapı kapat
  • kaldırma hizmeti
  • 3 saniye bekle
  • yeni exe'yi dizine kopyala
  • servisi yükle
  • hizmete başla
  • sapı kapat

2
Açık tanıtıcıya sahip programda değilseniz, tanıtıcıyı nerede kapatabilirsiniz?
Matt

0

TopShelf dağıldığında veya bir hizmet başka bir nedenden dolayı başarısız olduğunda, aşağıdaki PowerShell'i birkaç yerden Arnavut kaldırımlı olarak Octopus Deploy örnekleri için kullanıyorum.

$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

Ayrıca şunu belirtmek gerekir:

sc delete "ServiceName"

PowerShell'de çalışmaz, sc PowerShell'de cmdlet Set-Content için bir diğer addır. Yapman lazım:

sc.exe delete "ServiceName"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.