Cara mengatasi kesalahan "Layanan yang ditentukan telah ditandai untuk dihapus"

584

Saya mencoba menghapus Layanan Windows dengan sc delete <service name>, dan menemukan kesalahan berikut:

[SC] DeleteService GAGAL 1072:

Layanan yang ditentukan telah ditandai untuk dihapus.

Apa yang sudah saya lakukan:

Masalahnya masih ada.

Apa langkah selanjutnya?

Arseni Mourzenko
sumber
4
Sebuah reboot biasanya akan menghapus status yang tersisa.
Damien_The_Unbeliever
14
Aku tahu. Tetapi saya memikirkan solusi yang kurang radikal. Memulai ulang tiga puluh kali sehari tidak akan menjadi solusi yang dapat diterima dalam kasus saya.
Arseni Mourzenko
54
"Mengapa kamu menghapus layanan ini secara teratur?" : Saya sedang menulis layanan Windows. Setiap kali dikompilasi, itu harus dimulai kembali. "Namun, meretas registri sebanyak 30 kali sehari dapat diterima?" : sama sekali. Menghapus kunci dari registri tidak memaksa saya untuk menyimpan semuanya, tutup setiap aplikasi yang dibuka, tunggu sebentar, lalu buka kembali semuanya.
Arseni Mourzenko
46
Saya sudah menulis layanan windows. Kecuali jika Anda mengubah kode aktual yang melakukan pendaftaran, tidak perlu menghapus dan menginstalnya kembali setiap kali Anda membangun. Selama jalurnya masih sama, informasi pendaftaran yang lebih lama akan tetap valid.
Damien_The_Unbeliever
4
@NickTurner - tautan ke laporan bug apa pun? Bug apa pun yang Anda maksudkan, saya belum menemukan. Dan saya tidak yakin bagaimana MSI terlibat karena kita mungkin berbicara tentang membangun dan menjalankan layanan pada mesin dev (yang setidaknya tampaknya menjadi konteks pertanyaan 5 tahun ini)
Damien_The_Unbeliever

Jawaban:

1245

Mungkin ada beberapa penyebab yang menyebabkan layanan macet di "ditandai untuk dihapus".

  1. Explorer Proses SysInternals dibuka . Menutupnya harus mengarah pada penghapusan layanan secara otomatis.

  2. Pengelola Tugas dibuka .

  3. Microsoft Management Console (MMC) dibuka . Untuk memastikan semua instance ditutup, jalankan taskkill /F /IM mmc.exe.

  4. Konsol layanan dibuka . Ini sama dengan poin sebelumnya, karena konsol Layanan di-host oleh MMC.

  5. Peraga Peristiwa dibuka . Sekali lagi, ini sama dengan poin ketiga.

  6. Kunci HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {service name} ada .

  7. Orang lain masuk ke server dan membuka salah satu aplikasi yang disebutkan sebelumnya.

  8. Sebuah instance dari Visual Studio yang digunakan untuk debug layanan terbuka.

Arseni Mourzenko
sumber
9
Manajer tugas tampaknya melakukan hal yang sama. Dan seperti disebutkan di bawah ini, membiarkan konsol Layanan tetap terbuka dapat menyebabkan hal ini juga.
CodingBarfield
4
... dan jika menutup semua ini masih tidak membantu dan Anda masih melihat layanan sebagai "ditandai untuk dihapus" lakukan logoff sederhana alih-alih restart penuh. itu membantu saya beberapa kali.
Nedko
2
Satu alur kerja umum: kolega jahat Anda juga masuk ke server jarak jauh, dan mereka semua memiliki sesuatu yang terbuka ...
Chris O
72
Menutup konsol layanan memecahkan masalah ini untuk saya! Proses saya adalah sebagai berikut: Dalam VS2012 x64 Native Tools Command Prompt -> Navigasikan ke direktori dengan layanan exectuable -> installutil / u servicename.exe (untuk menghapus layanan usang) -> salin exe layanan yang baru dibangun - > installutil servicename.exe (untuk menginstal layanan yang diperbarui) . Saya biasanya dapat menghapus dan menginstal ulang segera tanpa masalah. Sampai saya secara acak tidak bisa. Menutup konsol layanan menyelesaikannya. Terima kasih atas tipnya!
thehelix
17
Process Explorer adalah yang besar di sini, menurut saya. Saya sarankan tebal dan / atau pindahkan ke bagian atas daftar.
Coxy
224

Ini juga dapat disebabkan oleh membiarkan konsol Layanan terbuka. Windows tidak akan benar-benar menghapus layanan sampai ditutup.

terpaksa
sumber
3
Seperti yang saya tunjukkan dalam pertanyaan saya, "Konsol Manajemen Microsoft telah ditutup" selama pengujian.
Arseni Mourzenko
25
Dalam kasus saya, konsol Layanan adalah masalahnya. Segera setelah saya menutupnya dan membukanya kembali, layanan yang dihapus itu hilang.
Farrukh Najmi
3
Sulit dipercaya bahwa menjaga jendela tetap terbuka adalah masalahnya ... Terima kasih!
Karol Tyl
Ini bekerja untuk saya juga, walaupun anehnya ada banyak kasus di mana hanya menekan F5 akan menyegarkan daftar dengan layanan dihapus.
Steve Smith
1
Anda menyelamatkan hari saya
Pranoy Sarkar
50

Saya memiliki masalah yang sama, akhirnya saya memutuskan untuk menghentikan proses layanan.

untuk itu coba langkah-langkah di bawah ini:

  • dapatkan proses id layanan dengan

    sc queryex <service name>

  • bunuh proses dengan

    taskkill /F /PID <Service PID>

Ali Sadri
sumber
2
PID saya adalah 0 jadi saya lebih baik tidak membunuh itu!
merampok
Anda dapat menghapus layanan untuk itu, lakukan di bawah ini langkah-langkah 1- jalankan cmd 2- ubah arah menjadi file .exe dari layanan Anda temukan bahwa 3- jalankan perintah installutil / u <yourfilename.exe>
Ali Sadri
+1 untuk sc queryex saya akan dapat menggunakannya untuk mendapatkan PID jika saya ingin melampirkan debugger
Paul McCarthy
44

Dalam kasus saya ini berhasil setelah menutup Services. Periksa apakah Services.mscini terbuka, jika ya tutup dan periksa semua proses layanan ditemukan Task Manager.

Sumit Agrawal
sumber
13

Itu berarti layanan masih terdaftar sebagai dinonaktifkan di services.msc. Tutup saja services.msc dan buka kembali sebagai administrator ... Layanan tidak akan terdaftar. Sekarang, instal layanan menggunakan perintah,

installutil "jalur layanan"

Amey P Naik
sumber
11

Menghapus kunci registri seperti yang disarankan di atas membuat layanan saya macet dalam status berhenti. Prosedur berikut ini berhasil untuk saya:

buka task manager> pilih tab layanan> pilih layanan> klik kanan dan pilih "pergi ke proses"> klik kanan pada proses dan pilih Akhiri proses

Layanan harus hilang setelah itu

mathart63
sumber
7

Ditemukan satu hal lagi untuk diperiksa - lihat di Task manager - jika pengguna lain terhubung ke kotak ini, bahkan jika mereka 'terputus' Anda harus benar-benar keluar untuk mendapatkan layanan yang akhirnya dihapus.

Kathy Gryta
sumber
4
Tidak perlu Anda hanya perlu memastikan semua orang keluar dari Microsoft Management Console (MMC) dan panel kontrol Layanan.
Marquis of Lorne
6

Tampaknya pada versi Windows lebih lama dari Windows 7 (tidak diverifikasi, tetapi berdasarkan pengalaman terbaru dengan Windows Server 2012 R2), Service Control Manager (SCM) lebih ketat.

Sementara di Windows 7 hanya memunculkan proses lain, sekarang memeriksa apakah proses layanan masih ada dan dapat mengembalikan ERROR_SERVICE_MARKED_FOR_DELETE (1072) untuk panggilan selanjutnya ke CreateService / DeleteService bahkan jika layanan tampaknya dihentikan.

Saya berbicara kode Windows API di sini, tetapi saya ingin menguraikan dengan jelas apa yang terjadi, jadi urutan ini dapat menyebabkan kesalahan yang disebutkan:

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

Alasan proses layanan masih ada setelah sudah melaporkan status SERVICE_STOPPEDnya tidak mengejutkan. Ini adalah proses reguler, yang utas utamanya 'macet' dalam panggilannya keStartServiceCtrlDispatcher API, jadi ia pertama-tama bereaksi terhadap tindakan pengendalian berhenti, tetapi kemudian harus menjalankan urutan kode yang tersisa.

Sangat disayangkan SCM / OS tidak menangani ini dengan baik untuk kita. Solusi terprogram agak sederhana dan akurat: dapatkan pegangan proses yang dapat dieksekusi layanan sebelum menghentikan layanan, kemudian tunggu hingga gagang ini diberi sinyal.

Jika mendekati masalah dari perspektif administrasi sistem solusinya adalah juga menunggu proses layanan menghilang sepenuhnya.

klaus triendl
sumber
6

Inilah yang bekerja untuk saya: - Saya mengalami masalah yang sama: layanan saya macet di 'ditandai untuk dihapus'. - Saya membuka services.msc Layanan saya memang terlihat berjalan, meskipun sudah dihapus. - Saya mengklik Berhenti Menerima pesan kesalahan, mengatakan layanan tidak dalam keadaan menerima pesan kontrol. Namun demikian, layanan itu dihentikan. - Tutup service.msc. - Layanan yang dibuka kembali.msc. - Layanan hilang (tidak lagi ditampilkan dalam daftar layanan).

(Lingkungan adalah Windows 7.)

balintn
sumber
2
Windows 2008 di sini, saya harus menutup panel layanan
Mathijs Segers
5

Dalam kasus saya, saya mengeksekusi taskkill /f /im dongleserver.exe, di mana dongleserver.exefile exe program saya.

Maka saya sudah bisa menginstal ulang program saya.

Sian Chiew See
sumber
4

Dalam kasus saya, itu disebabkan oleh pengecualian yang tidak ditangani saat membuat sumber eventLog. Gunakan coba tangkap untuk menunjukkan titik penyebabnya.

Arijus Gilbrantas
sumber
4

Menutup setiap jendela yang saat ini terbuka diikuti dengan menjalankan perintah berikut memecahkan masalah bagi saya:

taskkill /F /IM mmc.exe
Tshilidzi Mudau
sumber
3

Menutup konsol layanan seperti yang disarankan oleh beberapa jawaban di sini memungkinkan saya untuk menghapus layanan. Dalam skenario saya ini hanya perbaikan jangka pendek karena semua menginstal ulang dan menghapus layanan selanjutnya akan mengharuskan saya untuk mengambil langkah-langkah tambahan ini. Meninjau file web.config saya, ditemukan bahwa ada kesalahan yang pernah diperbaiki, memungkinkan saya untuk dengan mudah menghapus layanan tanpa tambahan langkah konsol layanan.

GatesReign
sumber
1

Ini bekerja untuk saya.

  • Buka Task Manager
  • Pilih tab layanan
  • Pilih layanan dengan masalah ini
  • Klik kanan dan pilih "Pergi ke detail"
  • Klik kanan pada layanan dan pilih "Akhiri pohon proses"

Pohon proses akhir akan mengakhiri proses dan semua proses yang dibuat oleh proses.

Kemudian, Anda dapat menginstal ulang layanan.

OIbuoye
sumber
1

Dalam kasus saya, nama layanannya adalah 'Monitor' yang juga digunakan oleh layanan windows yang disebut 'Monitor', ketika saya mencoba memperbarui layanan saya, saya mencoba mencopotnya, installer mencoba menghapus layanan windows 'Monitor' yang tidak bisa, dan instalasi selalu dibatalkan.

Saya akhirnya mengganti nama layanan saya ke sesuatu yang lain

Yaman
sumber
0

Jika langkah-langkah yang diberikan oleh @MainMa tidak berhasil ikuti langkah-langkah berikut

Langkah 1 Cobalah mematikan proses dari windows task manager atau menggunakan taskkill / F / PID. Anda dapat menemukan pid dari proses dengan perintah 'sc queryex'. Coba langkah berikutnya jika Anda masih tidak dapat menghapus.

Langkah 2 Jika di atas

Jalankan Autoruns untuk Windows, Cari layanan berdasarkan nama dan hapus hasil.

Charith
sumber
0

Alasan utama untuk kesalahan adalah proses tidak berhenti. untuk menyelesaikannya, mulailah manajer tugas pergi ke layanan dan lihat apakah Anda masih dapat melihat layanan Anda daripada pergi ke proses layanan itu dan proses akhir. Daripada masalah akan diselesaikan sepenuhnya.

Gaurav Tyagi
sumber
0

Saya mengalami masalah ini ketika saya menggunakan Application Verifier untuk memverifikasi layanan win saya. Bahkan setelah saya menutup App Ver, layanan saya diblokir dari penghapusan. Hanya menghapus layanan dari App Ver yang menyelesaikan masalah dan layanan segera dihapus. Sepertinya beberapa proses masih menggunakan layanan Anda setelah Anda mencoba menghapusnya.

vadzvnik
sumber
0

langkah-langkah yang harus diikuti:

langkah-1 kebagian lokasi C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

langkah-2 jalankan perintah: installutil / u full-path / servicename.exe

langkah-3 tutup panel layanan dan buka kembali

langkah-4 jalankan perintah: installutil full-path / servicename.exe

Divyang Shah
sumber
1
catatan tambahan: installutil HANYA berfungsi sebagai admin, jadi buka shell sebagai admin.
ingconti
0

Kemungkinan besar menghapus layanan gagal karena

protected override void OnStop()

melempar kesalahan saat menghentikan layanan. membungkus barang-barang di dalam try catch akan mencegah tanda kesalahan penghapusan

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

}

e03050
sumber
0

Kadang-kadang ini bisa terjadi selama penghapusan layanan melalui skrip sesi jarak jauh PowerShell, terutama ketika Anda mencoba untuk menghapus layanan beberapa kali. Dalam hal ini, cobalah untuk membuat ulang sesi sebelum penghapusan:

Remove-PSSession -Session $session
$newSession = New-PSSession -ComputerName $Name  -Credential $creds -ErrorAction Stop
Enter-PSSession $newSession
Alex Podles
sumber