Làm thế nào để buộc gỡ cài đặt dịch vụ windows


173

Tôi đã cài đặt một dịch vụ windows bằng installUtil.exe.

Sau khi cập nhật mã, tôi lại sử dụng installUtil.exe để cài đặt dịch vụ trước khi gỡ cài đặt phiên bản gốc.

Khi tôi cố gắng gỡ cài đặt dịch vụ, installUtil.exe hoàn tất việc gỡ cài đặt thành công, nhưng dịch vụ vẫn xuất hiện.

Nếu tôi cố gắng thay đổi thuộc tính của nó, tôi nhận được thông báo 'dịch vụ được đánh dấu để xóa'.

Làm cách nào tôi có thể buộc xóa (tốt nhất là không khởi động lại máy chủ)?


Nếu dịch vụ bị treo và xóa không hoạt động, hãy xem Cách buộc gỡ cài đặt dịch vụ windows
Wernfried Domscheit

Câu trả lời:


469

Một điều khiến tôi chú ý trong quá khứ là nếu bạn có trình xem dịch vụ đang chạy thì điều đó ngăn các dịch vụ bị xóa hoàn toàn, hãy đóng lại trước đó


70
Tôi khó có thể tin rằng việc người xem mở sẽ phá vỡ dịch vụ - thật ngu ngốc!
Draemon

1
Điều này thật ngu ngốc từ Microsoft, nhưng nó thực sự hoạt động. Đối với một số lý do không thể giải thích được, việc mở trình xem dịch vụ sẽ ngăn không cho chúng bị xóa đúng cách.
ivantod

1
Tôi nghĩ rằng câu trả lời này sẽ có hàng trăm bình luận tương tự. Tôi vừa mất 30 phút với vấn đề ngu ngốc này ...
PierrOz

2
Có vẻ như trình thám hiểm quy trình SysIternals cũng khóa các dịch vụ (và có thể cả trình quản lý tác vụ), vì vậy hãy đảm bảo bạn cũng đóng các dịch vụ đó!
danio

3
cũng đảm bảo sử dụng dấu nhắc cmd. PowerShell không hiển thị bất kỳ lỗi nào, nhưng cũng không xóa.
Bruno Faria

144

Bạn không phải khởi động lại máy. Bắt đầu cmd hoặc PowerShell ở chế độ nâng cao.

sc.exe queryex <SERVICE_NAME>

Sau đó, bạn sẽ nhận được một số thông tin. Một số PID sẽ hiển thị.

taskkill /pid <SERVICE_PID> /f

Trong đó / f là buộc dừng lại.

Bây giờ bạn có thể cài đặt hoặc khởi chạy dịch vụ của bạn.


2
Làm việc mạnh mẽ khi mọi thứ khác ngoài khởi động lại đều thất bại - rất vui!
DaveF

36
Điều này không hiệu quả với tôi - pid cho dịch vụ của tôi trả về 0 và nó sẽ không cho phép tôi xóa một quy trình hệ thống quan trọng.
plasma147

4
A + tuyệt vời. Sử dụng sc xóa rồi ở trên.
Khu 12

7
đã không hoạt động khi PID là 0, điều này đã giải quyết vấn đề của tôi - (SC) DeleteService FAILED 1072
Web-E

3
Hoàn toàn hữu ích! Trong trường hợp của tôi, không có gì ngắn khi khởi động lại làm việc. Thậm chí không xóa thư mục dịch vụ trong Registry! Mặc dù vậy, một Gotcha: Nếu bạn đang làm việc trong PowerShell, hãy sử dụng : sc.exe queryex <SERVICENAME>. Bởi vì sccũng là một bí danh cho Set-Content, nó sẽ thất bại khi bạn sử dụng nó.
Ifedi Okonkwo

97

tốt, bạn có thể sử dụng SC.EXE để xóa bất kỳ cửa sổ nào Dịch vụ mạnh mẽ nếu hủy cài đặt không xóa bất kỳ cơ hội nào.

sc delete <Service_Name>

Đọc thêm về "Viết blog kỹ thuật MS" Xóa dịch vụ mạnh mẽ khỏi dịch vụ MMC


5
Cảm ơn vì điều đó. Lưu ý rằng nếu "Tên dịch vụ" không giống với "Tên hiển thị", bạn có thể nhận được "Tên dịch vụ" trong thuộc tính của dịch vụ.
GuiSim

8
sc deletecũng sẽ báo cáo "dịch vụ được đánh dấu để xóa" nếu có một điều khiển mở cho dịch vụ.
Matt

@GuiSim cảm ơn vì điều đó, tôi nghi ngờ nhiều người sẽ đặt tên hiển thị như tôi!
nik0lai

Đã thử nhưng đã nhận được thông báo này: [SC] DeleteService FAILED 1072: Dịch vụ được chỉ định đã được đánh dấu để xóa.
Andrew W. Phillips

37

Tôi biết điều này sẽ không giúp ích gì, nhưng nó có thể giúp được ai đó trong tương lai.

Tôi cũng gặp vấn đề tương tự, đóng và mở lại trình quản lý dịch vụ đã xóa cả mục nhập khỏi sổ đăng ký và hoàn tất việc gỡ cài đặt dịch vụ.

Trước đó, làm mới người quản lý dịch vụ đã không giúp đỡ.


1
Cảm ơn cho chiming. Kinh nghiệm của tôi là chính xác như bạn mô tả.
pk.

10
sc delete sericeName

Chỉ cần chắc chắn rằng dịch vụ đã dừng lại trước khi làm điều này. Tôi đã thấy công việc này hầu hết các lần. Có những lúc tôi đã thấy các cửa sổ bị kẹt vào một cái gì đó và nó khăng khăng đòi khởi động lại.


Chỉ là một bổ sung .. Tôi đã phải chạy nhắc nhở dos / .NET của tôi với tư cách quản trị viên để có quyền truy cập để chạy lệnh sc xóa .. chỉ trong trường hợp bất kỳ ai khác gặp phải vấn đề đó.
Dav.id

Chạy "NET STOP <serviceName>" trước SC DELETE để đảm bảo dịch vụ đã bị dừng trước khi xóa
Adi

Đây cũng là kinh nghiệm của tôi, cuối cùng tôi đã phải khởi động lại để xóa một dịch vụ cứng đầu chỉ được gỡ cài đặt một phần (nó vẫn xuất hiện trong tích tắc với mã 2). Khởi động lại là những gì cuối cùng đã làm cho nó đi.
delliottg


4

Thật không may, bạn cần phải khởi động lại máy chủ. Điều đó sẽ loại bỏ dịch vụ "bị xóa".


12
Không. Bạn không cần khởi động lại. Xem giải pháp của tôi :)
johan

2
Tôi thực sự thích giải pháp của user186749 thậm chí còn tốt hơn. Đẹp và sạch sẽ.
McKay

3

Chỉ trong trường hợp câu trả lời này giúp được ai đó: như được tìm thấy ở đây , bạn có thể tiết kiệm cho mình rất nhiều rắc rối khi chạy Sysiternals Autorun với tư cách quản trị viên. Chỉ cần chuyển đến tab "Dịch vụ" và xóa dịch vụ của bạn.

Nó đã lừa tôi trên một máy mà tôi không có quyền chỉnh sửa sổ đăng ký.


3

Bạn có thể xóa thủ công khóa đăng ký cho dịch vụ của mình, tại đó HKLM\SYSTEM\CurrentControlSet\Services, sau đó bạn sẽ không thấy dịch vụ trong trình quản lý kiểm soát dịch vụ (cần làm mới hoặc mở lại để xem thay đổi) và bạn có thể cài đặt lại dịch vụ như bình thường.


Trên Windows 2012 R2, làm cho phần đính vào Dịch vụ MMC (Services.MSC) hiển thị " Không thể đọc Mô tả. Mã lỗi: 2 ". Mặc dù đảm bảo tất cả các MMC khác đã bị đóng và không có người dùng nào khác đăng nhập.
Tín hiệu15

Tôi thấy, chỉ được thử nghiệm trong Windows 8 & Windows 10 (và nó đã hoạt động).
Fernando Gonzalez Sanchez

RATNG cuối cùng đã giải quyết vấn đề của tôi. Tôi đã quên thêm trình cài đặt dịch vụ trong dự án và không thể xóa dịch vụ của tôi sau khi cài đặt. Tôi khuyên bạn nên thực hiện xuất khẩu cây reg dịch vụ trước khi xóa bất cứ thứ gì trong đó. Cảm ơn rất nhiều!
dùng3772108

2

Sau đây sẽ hoạt động mà không cần khởi động lại máy:

  1. Tìm kiếm Sổ đăng ký \ HKEY_LOCAL_MACHINE cho <Tên dịch vụ của bạn> (cả khóa và giá trị)
  2. Đặt giá trị "Di sản" thành 0

1

Bạn đã thử dừng dịch vụ trước khi gọi gỡ cài đặt chưa? Tôi đã có vấn đề này ngẫu nhiên. Đôi khi tôi có thể loại bỏ nó mà không cần khởi động lại. Tôi đoán là nó phải làm với dịch vụ vẫn đang chạy


1

Tôi đến trễ, nhưng muốn thêm một giải pháp thay thế, có thể trông lạ, nhưng tôi không thấy một cách khác:

Khi tôi cài đặt Dịch vụ Windows của mình trong quy trình CI mỗi tối, tôi cần thứ gì đó hoạt động mọi lúc và hoàn toàn tự động. Vì một số lý do, các dịch vụ luôn được đánh dấu để xóa trong một thời gian dài (5 phút trở lên) sau khi gỡ cài đặt chúng. Do đó, tôi đã mở rộng tập lệnh bó cài đặt lại để đảm bảo rằng dịch vụ thực sự bị xóa (phiên bản đơn giản hóa):

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

Những gì tôi có thể thấy, là dịch vụ được đánh dấu để xóa trong khoảng 5 phút (!) Cho đến khi cuối cùng nó đi qua. Cuối cùng, tôi không cần thêm bất kỳ sự can thiệp thủ công nào. Tôi sẽ mở rộng kịch bản trong tương lai để có điều gì đó xảy ra sau một thời gian nhất định (ví dụ: thông báo sau 30 phút).


1

Điều này làm việc cho tôi

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

Nếu đầu ra của bạn từ đó hiển thị ReturnValue : 16, thì lệnh thất bại với " Dịch vụ này đang bị xóa khỏi hệ thống ". Danh sách đầy đủ của ReturnValues ​​từ Microsoft tại đây
Signal15

1

Nếu bạn không thể dừng dịch vụ trong Dịch vụ , bạn có thể dừng dịch vụ windows của mình trong Trình quản lý tác vụ . Sau đó, bạn có thể loại bỏ dịch vụ.


0

Làm mới danh sách dịch vụ luôn luôn làm điều đó cho tôi. Nếu cửa sổ dịch vụ mở, nó sẽ giữ một số bộ nhớ của nó vì một số lý do. F5 và tôi đang cài đặt lại!


0

Ngoài ra, hãy đảm bảo rằng không có phiên bản nào của chương trình thực thi vẫn hoạt động (có thể là phiên bản có thể đã chạy, vì bất kỳ lý do gì, độc lập với dịch vụ).

Tôi đã mở và đóng MMC và tìm kiếm các PID để tiêu diệt - nhưng khi tìm kiếm trong trình thám hiểm quy trình, có một vài quy trình còn tồn tại đang chạy từ một đợt bị lãng quên theo lịch trình. Giết họ. Công việc hoàn thành.


0

Có rất nhiều câu hỏi diễn đàn trong chủ đề đó.

Tôi đã tìm thấy câu trả lời trong windows api. Bạn không cần phải khởi động lại máy tính sau khi gỡ cài đặt dịch vụ. Bạn phải gọi:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

Điều đó đóng tay cầm của dịch vụ. Trên windows 7 nó đã giải quyết vấn đề của tôi. Tôi làm:

  • dừng phục vụ
  • xử lý chặt chẽ
  • gỡ cài đặt dịch vụ
  • chờ 3 giây
  • sao chép exe mới vào thư mục
  • cài đặt dịch vụ
  • bắt đầu dịch vụ
  • xử lý chặt chẽ

2
Nơi nào bạn có thể xử lý để đóng nếu không có trong chương trình có xử lý mở?
Matt

0

Tôi sử dụng PowerShell sau đây được ghép lại từ một vài nơi cho các trường hợp Triển khai Octopus của chúng tôi khi TopShelf gây rối hoặc dịch vụ không thành công vì một số lý do khác.

$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

Điều đáng chú ý là:

sc delete "ServiceName"

không hoạt động trong PowerShell, sc là bí danh cho cmdlet Set-Content trong PowerShell. Bạn cần phải làm:

sc.exe delete "ServiceName"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.