วิธีบังคับให้ถอนการติดตั้งบริการ windows


173

ฉันติดตั้งบริการ windows โดยใช้ installUtil.exe

หลังจากอัปเดตรหัสฉันใช้ installUtil.exe อีกครั้งเพื่อติดตั้งบริการโดยไม่ต้องถอนการติดตั้งเวอร์ชันเดิมก่อน

เมื่อฉันพยายามถอนการติดตั้งบริการ installUtil.exe ทำการถอนการติดตั้งเสร็จสมบูรณ์ แต่บริการยังคงปรากฏขึ้น

หากฉันพยายามเปลี่ยนคุณสมบัติฉันได้รับข้อความ 'บริการถูกทำเครื่องหมายเพื่อลบ'

ฉันจะบังคับให้ลบได้อย่างไร (ควรรีสตาร์ทเซิร์ฟเวอร์โดยไม่เลือก)


หากบริการหยุดทำงานและการลบไม่ทำงานดูวิธีบังคับให้ถอนการติดตั้งบริการ windows
Wernfried Domscheit

คำตอบ:


469

สิ่งหนึ่งที่เคยชินกับฉันในอดีตคือถ้าคุณเปิดใช้งานวิวเวอร์เซอร์วิสไว้นั่นจะทำให้บริการไม่ถูกลบอย่างสมบูรณ์ดังนั้นให้ปิดก่อน


70
ฉันแทบจะไม่เชื่อเลยว่าการเปิดให้ผู้ชมหยุดพักการลบบริการ - มันช่างโง่เหลือเกิน!
Draemon

1
นี่มันโง่มากจาก Microsoft แต่มันใช้งานได้จริง ด้วยเหตุผลบางอย่างที่อธิบายไม่ได้การเปิดใช้งานวิวเวอร์เซอร์วิสจะป้องกันไม่ให้ถูกลบในบางครั้ง
ivantod

1
ฉันคิดว่าคำตอบนี้จะมีร้อยความคิดเห็นที่คล้ายกัน ฉันเพิ่งสูญเสีย 30 นาทีกับปัญหาโง่ ๆ นี้ ...
PierrOz

2
ดูเหมือนว่านักสำรวจกระบวนการ SysInternals จะล็อคบริการ (และอาจเป็นผู้จัดการงาน) ดังนั้นโปรดปิดบริการเหล่านั้นด้วย!
danio

3
ตรวจสอบให้แน่ใจว่าใช้พรอมต์คำสั่ง PowerShell ไม่แสดงข้อผิดพลาด แต่จะไม่ลบอย่างใดอย่างหนึ่ง
Bruno Faria

145

คุณไม่ต้องรีสตาร์ทเครื่อง เริ่ม cmd หรือ PowerShell ในโหมดยกระดับ

sc.exe queryex <SERVICE_NAME>

จากนั้นคุณจะได้รับข้อมูล หมายเลข PID จะปรากฏขึ้น

taskkill /pid <SERVICE_PID> /f

ตำแหน่ง / f คือบังคับให้หยุด

ตอนนี้คุณสามารถติดตั้งหรือเปิดใช้บริการของคุณ


2
ทำงานอย่างไม่หยุดหย่อนในทุกสิ่งที่นอกเหนือจากการรีบูตล้มเหลว - ยินดีเป็นอย่างยิ่ง!
DaveF

36
สิ่งนี้ไม่ได้ผลสำหรับฉัน - pid สำหรับบริการของฉันส่งคืนค่า 0 และจะไม่ให้ฉันลบกระบวนการของระบบที่สำคัญ
plasma147

4
A + ยอดเยี่ยม ใช้ sc ลบแล้วข้างต้น
Zone12

7
ไม่ทำงานเนื่องจาก PID มาเป็น 0 สิ่งนี้แก้ไขปัญหาของฉัน - (SC) DeleteService FAILED 1072
Web-E

3
มีประโยชน์อย่างแน่นอน! ในกรณีของฉันไม่มีอะไรรีบูตได้เลย ไม่แม้แต่จะลบไดเรกทอรีบริการใน Registry! หนึ่ง gotcha แม้ว่า: หากคุณกำลังทำงานในการใช้งาน sc.exe queryex <SERVICENAME>PowerShell: เนื่องจากscเป็นนามแฝงสำหรับSet-Contentมันจะล้มเหลวอย่างเงียบ ๆ เมื่อคุณใช้สิ่งนั้น
Ifedi Okonkwo

97

คุณสามารถใช้ SC.EXE เพื่อลบบริการ windows ใด ๆ ได้อย่างแรงถ้าการถอนการติดตั้งไม่ได้ลบออกโดยโอกาสใด ๆ

sc delete <Service_Name>

อ่านเพิ่มเติมเกี่ยวกับ "MS Techno บล็อก" การลบบริการอย่างแข็งขันจาก Services MMC


5
ขอบคุณสำหรับสิ่งนี้. โปรดทราบว่าหาก "ชื่อบริการ" ไม่เหมือนกับ "ชื่อที่แสดง" คุณสามารถได้รับ "ชื่อบริการ" ในคุณสมบัติของบริการ
GuiSim

8
sc deleteจะรายงานว่า "บริการถูกทำเครื่องหมายสำหรับการลบ" หากมีหมายเลขอ้างอิงที่เปิดให้บริการ
แมตต์

@ GuiSim ขอบคุณสำหรับสิ่งนั้นฉันสงสัยว่าหลายคนจะใช้ชื่อที่แสดงเหมือนฉัน!
nik0lai

พยายาม แต่ได้รับข้อความนี้: [SC] DeleteService FAILED 1072: บริการที่ระบุได้รับการทำเครื่องหมายว่าเป็นการลบ
Andrew W. Phillips

37

ฉันรู้ว่านี่จะไม่ช่วย แต่อาจช่วยคนอื่นในอนาคต

ฉันเพิ่งมีปัญหาเดียวกันการปิดและเปิดตัวจัดการบริการอีกครั้งได้ลบทั้งรายการออกจากรีจิสตรีและทำการถอนการติดตั้งของบริการเสร็จแล้ว

ก่อนหน้านั้นการรีเฟรชผู้จัดการบริการไม่ได้ช่วย


1
ขอบคุณสำหรับการตีระฆังประสบการณ์ของฉันเป็นไปตามที่คุณอธิบาย
pk

10
sc delete sericeName

เพียงตรวจสอบให้แน่ใจว่าบริการหยุดก่อนที่จะทำ ฉันได้เห็นงานนี้เกือบทุกครั้ง มีบางครั้งที่ฉันเคยเห็นหน้าต่างติดอะไรบางอย่างและมันยืนยันในการรีบูต


นอกจากนี้ .. ฉันต้องเรียกใช้พรอมต์ DOS /. NET ของฉันในฐานะผู้ดูแลระบบเพื่อเข้าถึงการเรียกใช้คำสั่ง sc ลบ .. ในกรณีที่บุคคลอื่นประสบปัญหานั้น
Dav.id

เรียกใช้ "NET STOP <serviceName>" ก่อน SC SCETETE เพื่อให้แน่ใจว่าบริการจะหยุดก่อนที่จะลบ
Adi

นี่เป็นประสบการณ์ของฉันเช่นกันในที่สุดฉันก็ต้องรีบูตเพื่อลบบริการที่ดื้อรั้นที่ถูกถอนการติดตั้งเพียงบางส่วนเท่านั้น (มันยังปรากฏขึ้นอย่างรวดเร็วด้วยรหัส 2) การรีบูตเครื่องเป็นสิ่งที่ทำให้มันหายไปในที่สุด
delliottg

5

ปิด cmd และหน้าต่างบริการถ้าเปิดขึ้นมาจากนั้นเริ่ม cmd อีกครั้งโดยคลิกขวาแล้วเลือก run as administrator ถ้าsc delete sericeNameไม่ทำงานหรืออะไรไม่ทำงาน

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


4

น่าเสียดายที่คุณต้องรีสตาร์ทเซิร์ฟเวอร์ ควรลบบริการ "ลบแล้ว"


12
ไม่คุณไม่จำเป็นต้องรีสตาร์ท ดูวิธีการแก้ปัญหาของฉัน :)
Johan

2
ฉันชอบโซลูชั่นของ user186749 ยิ่งกว่า สวยและสะอาด
McKay

3

ในกรณีที่คำตอบนี้ช่วยใครซักคน: เท่าที่พบที่นี่คุณอาจช่วยตัวเองได้มากในการใช้Sysinternals Autorunsในฐานะผู้ดูแลระบบ เพียงไปที่แท็บ "บริการ" และลบบริการของคุณ

มันเป็นการหลอกลวงสำหรับฉันในเครื่องที่ฉันไม่ได้รับอนุญาตให้แก้ไขรีจิสทรี


3

คุณสามารถลบรีจิสตรีคีย์สำหรับบริการของคุณได้ด้วยตนเองตั้งอยู่ที่HKLM\SYSTEM\CurrentControlSet\Servicesหลังจากนั้นคุณจะไม่เห็นบริการในตัวจัดการควบคุมบริการ (จำเป็นต้องรีเฟรชหรือเปิดใหม่เพื่อดูการเปลี่ยนแปลง) และคุณสามารถติดตั้งบริการได้ตามปกติ


บน Windows 2012 R2 ทำให้ Services MMC snap-in (Services.MSC) แสดง " ล้มเหลวในการอ่านคำอธิบายรหัสข้อผิดพลาด: 2 " แม้จะมั่นใจได้ว่า MMC อื่น ๆ ทั้งหมดถูกปิดและไม่มีผู้ใช้คนอื่นเข้าสู่
สัญญาณ 15

ฉันเห็นเฉพาะการทดสอบใน Windows 8 และ Windows 10 (และใช้งานได้)
Fernando Gonzalez Sanchez

ในที่สุดก็แก้ปัญหาของฉัน ฉันลืมเพิ่มตัวติดตั้งบริการในโครงการและไม่สามารถลบบริการของฉันหลังจากการติดตั้ง ฉันขอแนะนำให้ทำการส่งออกแผนผังบริการ reg ก่อนที่จะลบสิ่งใด ๆ ในนั้น ขอบคุณมาก!
3772108

2

ต่อไปนี้จะทำงานโดยไม่ต้องรีสตาร์ทเครื่อง:

  1. ค้นหา Registry \ HKEY_LOCAL_MACHINE สำหรับ <ชื่อบริการของคุณ> (ทั้งคีย์และค่า)
  2. ตั้งค่า "Legacy" เป็น 0

1

คุณลองหยุดบริการก่อนโทรถอนการติดตั้งหรือไม่ ฉันมีปัญหานี้แบบสุ่ม บางครั้งฉันสามารถลบออกได้โดยไม่ต้องรีสตาร์ท ฉันเดาว่ามันเกี่ยวข้องกับบริการที่ยังทำงานอยู่


1

ฉันมาสาย แต่ต้องการเพิ่มทางเลือกซึ่งอาจดูแปลก แต่ฉันไม่เห็นวิธีอื่น:

เมื่อฉันติดตั้ง Windows Services ของฉันในกระบวนการ CI ทุกคืนฉันต้องการบางสิ่งที่ทำงานได้ตลอดเวลาและเป็นไปโดยอัตโนมัติอย่างสมบูรณ์ ด้วยเหตุผลบางอย่างบริการถูกทำเครื่องหมายว่าจะลบเป็นเวลานาน (5 นาทีขึ้นไป) หลังจากถอนการติดตั้ง ดังนั้นฉันจึงขยายสคริปต์แบตช์การติดตั้งใหม่เพื่อให้แน่ใจว่าบริการถูกลบจริงๆ (เวอร์ชั่นที่ง่าย):

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

สิ่งที่ฉันเห็นคือบริการถูกทำเครื่องหมายเพื่อลบประมาณ 5 นาที (!) จนกระทั่งในที่สุดก็ผ่านไป ในที่สุดฉันไม่ต้องการการแทรกแซงด้วยตนเองอีกต่อไป ฉันจะขยายสคริปต์ในอนาคตเพื่อให้บางสิ่งบางอย่างเกิดขึ้นหลังจากระยะเวลาหนึ่ง (เช่นการแจ้งเตือนหลังจาก 30 นาที)


1

สิ่งนี้ใช้ได้สำหรับฉัน

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

หากผลลัพธ์ของคุณจากที่แสดงReturnValue : 16นั้นคำสั่งล้มเหลวด้วย " บริการนี้จะถูกลบออกจากระบบ " รายการ ReturnValues ​​ทั้งหมดจาก Microsoft ที่นี่
สัญญาณ 15

1

ถ้าคุณไม่สามารถหยุดให้บริการในบริการคุณสามารถหยุดของคุณ exe บริการหน้าต่างที่ Task Manager หลังจากนั้นคุณสามารถลบบริการได้


0

การรีเฟรชรายการบริการจะทำเพื่อฉันเสมอ หากหน้าต่างบริการเปิดอยู่จะมีหน่วยความจำอยู่บ้างด้วยเหตุผลบางประการ F5 และฉันติดตั้งอีกครั้ง!


0

ตรวจสอบให้แน่ใจด้วยว่าไม่มีอินสแตนซ์ของการปฏิบัติการที่ยังทำงานอยู่ (อาจเป็นกรณีที่อาจมีการเรียกใช้ไม่ว่าด้วยเหตุผลใดก็ตามโดยไม่ขึ้นกับบริการ)

ฉันกำลังเปิดและปิด MMC และมองหา PID เพื่อฆ่า - แต่เมื่อมองในตัวสำรวจกระบวนการก็มีกระบวนการที่ยังหลงเหลืออยู่สองกระบวนการที่ทำงานอยู่จากชุดที่ถูกลืม ฆ่าพวกเขา งานเสร็จแล้ว


0

มีคำถามมากมายในฟอรัมในเรื่องนั้น

ฉันพบคำตอบใน windows api แล้ว คุณไม่จำเป็นต้องรีสตาร์ทคอมพิวเตอร์หลังจากถอนการติดตั้งบริการ คุณต้องโทร:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

ที่ปิดการจัดการบริการ บน windows 7 มันแก้ไขปัญหาของฉัน ฉันทำ:

  • หยุดบริการ
  • จับปิด
  • ถอนการติดตั้งบริการ
  • รอ 3 วินาที
  • คัดลอก exe ใหม่ไปยังไดเรกทอรี
  • ติดตั้งบริการ
  • เริ่มบริการ
  • จับปิด

2
คุณจะได้รับหมายเลขอ้างอิงการปิดถ้าไม่อยู่ในโปรแกรมที่มีจุดจับเปิด
แมตต์

0

ฉันใช้ PowerShell ต่อไปนี้ปูด้วยกันจากสถานที่ไม่กี่แห่งสำหรับอินสแตนซ์ Octopus Deploy เมื่อ TopShelf เกิดความยุ่งเหยิงหรือบริการล้มเหลวด้วยเหตุผลอื่น

$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

นอกจากนี้ยังเป็นที่น่าสังเกตว่า:

sc delete "ServiceName"

ไม่ทำงานใน PowerShell sc เป็นนามแฝงสำหรับ cmdlet Set-Content ใน PowerShell คุณต้องทำ:

sc.exe delete "ServiceName"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.