Cara memaksa penghapusan layanan windows


173

Saya menginstal layanan windows menggunakan installUtil.exe.

Setelah memperbarui kode saya menggunakan installUtil.exe lagi untuk menginstal layanan tanpa menghapus instalasi versi asli terlebih dahulu.

Ketika saya sekarang mencoba untuk menghapus instalasi layanan, installUtil.exe berhasil menyelesaikan uninstall, tetapi layanan masih muncul.

Jika saya mencoba mengubah propertinya, saya menerima pesan 'layanan ditandai untuk dihapus'.

Bagaimana saya bisa memaksa penghapusan (lebih disukai tanpa me-restart server)?


Jika layanan ini hang dan penghapusan tidak berfungsi lihat Bagaimana memaksa penghapusan layanan windows
Wernfried Domscheit

Jawaban:


469

Satu hal yang menarik saya di masa lalu adalah bahwa jika Anda memiliki layanan penampil berjalan maka itu mencegah layanan dari sepenuhnya dihapus, begitu dekat sehingga sebelumnya


70
Saya hampir tidak percaya bahwa memiliki pemirsa buka istirahat penghapusan layanan - betapa bodohnya!
Draemon

1
Ini sangat bodoh dari Microsoft, tetapi itu memang berhasil. Untuk beberapa alasan yang tidak dapat dijelaskan, membiarkan penampil layanan terbuka mencegahnya dihapus dengan benar kadang-kadang.
ivantod

1
Saya pikir jawaban ini akan memiliki ratusan komentar serupa. Saya baru saja kehilangan 30 menit dengan masalah bodoh ini ...
PierrOz

2
Tampaknya proses explorer SysInternals juga mengunci layanan (dan mungkin juga task manager) jadi pastikan Anda menutupnya juga!
danio

3
juga pastikan untuk menggunakan cmd prompt. PowerShell tidak menunjukkan kesalahan apa pun, tetapi tidak menghapus keduanya.
Bruno Faria

144

Anda tidak perlu me-restart mesin Anda. Mulai cmd atau PowerShell dalam mode tinggi.

sc.exe queryex <SERVICE_NAME>

Maka Anda akan mendapatkan beberapa info. Nomor PID akan ditampilkan.

taskkill /pid <SERVICE_PID> /f

Di mana / f adalah untuk memaksa berhenti.

Sekarang Anda dapat menginstal atau meluncurkan layanan Anda.


2
Bekerja dengan gagah berani di mana segala sesuatu selain reboot gagal - senang!
DaveF

36
Ini tidak berfungsi untuk saya - pid untuk layanan saya mengembalikan 0 dan itu tidak akan membiarkan saya menghapus proses sistem kritis.
plasma147

4
A + mengagumkan. Gunakan sc delete lalu di atas.
Zone12

7
tidak berfungsi karena PID muncul sebagai 0, ini menyelesaikan masalah saya - (SC) DeleteService FAILED 1072
Web-E

3
Benar-benar bermanfaat! Dalam kasus saya, tidak ada kekurangan dari reboot yang berfungsi. Bahkan tidak menghapus direktori layanan di Registry! Satu gotcha meskipun: Jika Anda bekerja di gunakan PowerShell: sc.exe queryex <SERVICENAME>. Karena scjuga merupakan alias untuk Set-Content, Diam-diam akan gagal ketika Anda menggunakannya.
Ifedi Okonkwo

97

baik, Anda dapat menggunakan SC.EXE untuk menghapus Windows service dengan paksa jika un-install tidak menghapus secara kebetulan.

sc delete <Service_Name>

Baca lebih lanjut tentang "MS Techno Blogging" Menghapus Layanan Secara Paksa dari Layanan MMC


5
Terima kasih untuk ini. Perhatikan bahwa jika "Nama layanan" tidak sama dengan "Nama tampilan", Anda bisa mendapatkan "Nama layanan" di properti layanan.
GuiSim

8
sc deletejuga akan melaporkan "layanan ditandai untuk dihapus" jika ada pegangan yang terbuka untuk layanan.
Matt

@ GuiSim terima kasih untuk itu, saya curiga banyak yang akan meletakkan nama tampilan seperti saya!
nik0lai

Mencoba itu tetapi menerima pesan ini: [SC] DeleteService FAILED 1072: Layanan yang ditentukan telah ditandai untuk dihapus.
Andrew W. Phillips

37

Saya tahu ini tidak akan membantu, tetapi mungkin membantu seseorang di masa depan.

Saya baru saja mengalami masalah yang sama, menutup dan membuka kembali manajer layanan menghapus entri dari registri dan menyelesaikan penghapusan instalasi layanan.

Sebelumnya, menyegarkan manajer layanan tidak membantu.


1
Terima kasih telah ikut serta. Pengalaman saya persis seperti yang Anda jelaskan.
pk.

10
sc delete sericeName

Pastikan layanan dihentikan sebelum melakukan ini. Saya sering melihat pekerjaan ini. Ada kalanya saya melihat windows macet pada sesuatu dan bersikeras reboot.


Sebagai tambahan .. Saya harus menjalankan dos prompt / .NET prompt sebagai administrator untuk mendapatkan akses untuk menjalankan perintah sc delete .. kalau-kalau ada orang lain yang mengalami masalah itu.
Dav.id

Jalankan "NET STOP <serviceName>" sebelum SC DELETE untuk memastikan layanan dihentikan sebelum menghapus
Adi

Ini adalah pengalaman saya juga, saya akhirnya harus reboot untuk menghapus layanan keras kepala yang hanya dihapus sebagian (masih muncul di snap dengan kode 2). Rebooting adalah apa yang akhirnya membuatnya pergi.
delliottg


4

Sayangnya, Anda harus memulai ulang server. Itu harus menghapus layanan "dihapus".


12
Tidak. Anda tidak perlu memulai ulang. Lihat solusi saya :)
johan

2
Saya sebenarnya menyukai solusi user186749 bahkan lebih baik. Bagus dan bersih.
McKay

3

Kalau-kalau jawaban ini membantu seseorang: seperti yang ditemukan di sini , Anda mungkin menyelamatkan diri Anda dari banyak kesulitan menjalankan Autoruns Sysinternals sebagai administrator. Buka saja tab "Layanan" dan hapus layanan Anda.

Itu melakukan trik untuk saya pada mesin di mana saya tidak memiliki izin untuk mengedit registri.


3

Anda dapat secara manual menghapus kunci registri untuk layanan Anda, yang terletak di HKLM\SYSTEM\CurrentControlSet\Services, setelah itu Anda tidak akan melihat layanan di manajer kontrol layanan (perlu menyegarkan atau membuka kembali untuk melihat perubahan), dan Anda dapat menginstal ulang layanan seperti biasa.


Pada Windows 2012 R2, menyebabkan snap-in MMC Layanan (Services.MSC) menampilkan " Gagal Membaca Deskripsi. Kode Kesalahan: 2 ". Meskipun memastikan semua MMC lainnya ditutup dan tidak ada pengguna lain yang masuk.
Signal15

Begitu ya, hanya diuji di Windows 8 & Windows 10 (dan berhasil).
Fernando Gonzalez Sanchez

YANG akhirnya menyelesaikan masalah saya. Saya lupa menambahkan installer layanan di proyek dan tidak bisa menghapus layanan saya setelah instalasi. Saya sarankan melakukan ekspor pohon reg layanan sebelum menghapus apa pun di dalamnya. Terima kasih banyak!
user3772108

2

Berikut ini akan berfungsi tanpa menghidupkan ulang mesin:

  1. Cari Registry \ HKEY_LOCAL_MACHINE untuk <Nama Layanan Anda> (kunci dan nilai)
  2. Tetapkan nilai "Warisan" ke 0

1

Sudahkah Anda mencoba menghentikan layanan sebelum menelepon untuk menghapus instalan? Saya punya masalah ini secara acak. Kadang saya bisa menghapusnya tanpa memulai ulang. Dugaan saya adalah bahwa hal itu berkaitan dengan layanan yang masih berjalan


1

Saya terlambat, tetapi ingin menambahkan alternatif, yang mungkin terlihat aneh, tetapi saya tidak melihat cara lain:

Ketika saya menginstal Layanan Windows saya dalam proses CI setiap malam, saya membutuhkan sesuatu yang berfungsi sepanjang waktu dan sepenuhnya otomatis. Untuk beberapa alasan, layanan selalu ditandai untuk dihapus untuk waktu yang lama (5 menit atau lebih) setelah mencopotnya. Oleh karena itu, saya memperluas skrip batch instalasi ulang untuk memastikan bahwa layanan tersebut benar-benar dihapus (versi yang disederhanakan):

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

Apa yang bisa saya lihat, adalah bahwa layanan ditandai untuk dihapus selama sekitar 5 menit (!) Sampai akhirnya melewati. Akhirnya, saya tidak membutuhkan intervensi manual lagi. Saya akan memperpanjang skrip di masa depan sehingga sesuatu terjadi setelah waktu tertentu (mis. Pemberitahuan setelah 30 menit).


1

Ini berhasil untuk saya

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

Jika output Anda dari itu menunjukkan ReturnValue : 16, maka perintah gagal dengan " Layanan ini sedang dihapus dari sistem ". Daftar lengkap ReturnValues ​​dari Microsoft di sini
Signal15

1

Jika Anda tidak dapat menghentikan layanan di Layanan , Anda dapat menghentikan exe layanan windows di Task Manager . Setelah itu, Anda dapat menghapus layanan.


0

Menyegarkan daftar layanan selalu berhasil untuk saya. Jika jendela layanan terbuka, itu akan menampung sebagian memori yang ada karena suatu alasan. F5 dan saya menginstal ulang lagi!


0

Pastikan juga bahwa tidak ada contoh executable yang masih aktif (mungkin yang dijalankan, untuk alasan apa pun, terlepas dari layanan).

Saya membuka dan menutup MMC dan mencari PID untuk dibunuh - tetapi ketika mencari di penjelajah proses ada beberapa proses yang masih berjalan dari batch terjadwal yang terlupakan. Membunuh mereka. Pekerjaan selesai.


0

Ada banyak pertanyaan di forum tentang hal itu.

Saya telah menemukan jawabannya di windows api. Anda tidak perlu me-restart komputer setelah menghapus instalasi layanan. Anda harus menelepon:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

Itu menutup pegangan layanan. Pada windows 7 itu memecahkan masalah saya. Saya lakukan:

  • hentikan layanan
  • pegangan dekat
  • uninstall layanan
  • tunggu 3 detik
  • salin exe baru ke direktori
  • instal layanan
  • memulai layanan
  • pegangan dekat

2
Di mana Anda mendapatkan pegangan untuk menutup jika Anda tidak ada dalam program yang memiliki pegangan terbuka?
Matt

0

Saya menggunakan PowerShell berikut ini yang dirangkai bersama dari beberapa tempat untuk contoh Octopus Deploy kami ketika TopShelf kacau atau layanan gagal karena alasan lain.

$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

Perlu juga dicatat bahwa ini:

sc delete "ServiceName"

tidak bekerja di PowerShell, sc adalah alias untuk Set-Content cmdlet di PowerShell. Yang perlu Anda lakukan:

sc.exe delete "ServiceName"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.