2011-03-16 6 views
2

때때로 (WIX로 작성된) 설치 프로그램을 제거하면 서비스가 삭제로 표시되고 사용자가 다시 설치하려면 컴퓨터를 다시 시작해야합니다. 서비스가 삭제로 표시되었는지 확인하고 다른 설치를하기 전에 컴퓨터를 다시 시작하라고 사용자에게 알릴 수 있습니까?서비스가 삭제로 표시되었는지 확인

+0

'ServiceController' : ServiceController.GetServices()에서 찾을 수 있는지 확실하지 않지만 한번 시도해 볼 가치는 있습니다. –

답변

3
일반적으로

말하기,이 시나리오가 발생 레지스트리에서 해당 구성을 제거합니다. (대부분의 경우 단순히 서비스 애플릿 인 services.msc가 백그라운드에서 우연히 열려 있습니다.)

탐지를 위해 CreateService 및 기타 Service API을 읽는 것이 좋습니다. 예를 들어, 서비스가 삭제로 표시되면 CreateService를 호출 할 때 ERROR_SERVICE_MARKED_FOR_DELETE를 받게됩니다.

제안 된 재부팅 솔루션에 관해서 ... Windows는 거의 모든 이유로 거의 다시 부팅하지 않아도됩니다. 전문화 된 커널 드라이버를 설치하지 않는 한 재부팅 할 필요가 없습니다. 게으르지 마라! 사용자를 염두에 두십시오! 설치 프로그램 논리를 변경하여 서비스 애플릿과 같이 잠재적으로 충돌하는 실행중인 프로그램을 감지하고 종료를 제안하는 것이 좋습니다.

+1

mmc에 서비스 애플릿이로드되었는지 어떻게 감지합니까? – vkrzv

2

여기에 도움이 될만한 게시물이 있습니다. 원래 질문은 서비스 설치를위한 것이지만 대답은 설치 제거 및 상태에 대해서도 설명합니다. 여기

How to install a windows service programmatically in C#?

는 처음에 "표시 삭제"메시지가 나타납니다 어떻게 극복하는 이유를 설명하는 글이다.

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

편집하는 것은

당 크리스토퍼 페인터의 의견, 내가 의도 모범 사례를 촉진하기위한이 답변을 업데이트하고 있습니다. "deleted for marked"메시지를받는 것이 (내 경험상) 출시되지 않은 리소스보다 services.msc 콘솔을 사용하는 경우가 많았지 만 재부팅 할 사용자 지정 동작을 작성하는 것이 최선의 방법은 아닙니다.

이 윅스 XML을 사용 윅스 처리 후 재부팅을 예약하려면 (설명 방법 윅스 # here 포함)을 다음과 같이 뭔가에서 Windows를 방지, 해당 서비스에 래치 상태를 유지하는 경우

<?xml version='1.0' encoding='windows-1252'?> 
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'> 
    ... 
    <InstallExecuteSequence> 
     <ScheduleReboot After="InstallFinalize"/> 
    <InstallExecuteSequence> 
</Wix> 
+0

-1이 설명되면 멋질 것입니다. – bitxwise

+0

WiX는 설치/제거 서비스를 지원하는 Windows Installer를 사용합니다. 설치 프로그램에서 사용자 지정 작업을 작성하려는 시도는 나쁜 습관으로 간주됩니다. 참조 : http://robmensching.com/blog/posts/2007/8/17/Zataoca-Custom-actions-are-generally-an-admission-of-failure –

+0

설명 주셔서 감사합니다. 나는 당신이 링크 된 블로그 포스트에서 만들어진 많은 포인트들에 동의하지만, 포스트에 대한 귀하의 해석에 전적으로 동의하지는 않습니다. 전쟁을 시작하려하지는 않지만 게시자는 개발자가 사용자 지정 작업을 작성하는 이유에 대해 나열된 이유 때문에 사용자 지정 작업이 일반적으로 권장되지 않는다고 강조했습니다. 즉, OP는 아마도 더 나은 연습을 위해 사용자 지정 작업을 작성하는 대신 WiX XML을 통해 태그에 를 사용해야합니다. 이를 반영하여 답변을 업데이트하겠습니다. – bitxwise

0

제거하는 동안 ServiceControl 요소/테이블을 사용하여 서비스를 중지 하시겠습니까? 그렇다면 서비스가 중단됩니까? 그렇지 않다면 서비스 내부에서 진행중인 작업을 조사하여 리소스를 모두 해제하고 요청시 정상적으로 종료하십시오.

프로그래밍 방식으로 SCM API를 호출하기 위해 사용자 지정 동작을 작성할 필요는 없습니다. Windows Installer가이 문제를 처리 할 수 ​​있어야합니다. DeleteFlag=1 (REG_DWORD) 값을 포함

나는 (두 가지는 바람직하지 않은 부작용 CreateService 또는 DeleteService 중 하나를 호출 포함되지 않습니다) 그것을 할 수있는 API의 방법을 찾을 수 없습니다
+0

이 질문에 대답하지 않습니다. 일부 서비스는 중지 할 수 없습니다. 서비스가 안전하게 언로드 될 수없는 장치 드라이버에 속한 경우 – Ilya

+0

당신이 놓친 요점은 이것이 설치자 문제가 아니며 서비스 코드를 들여다 보는 것입니다. 서비스를 중지 할 수없는 경우 설치 프로그램에 서비스를 중지하도록 요청하지 마십시오. –

+0

제거 프로그램의 목표는 서비스를 삭제하는 것입니다. 설치 제거 프로그램이 먼저 중지해야하지만 멈출 수없는 경우 제거가 가능하면 시스템 삭제시이를 표시합니다. 사용자가 제거 프로그램을 끝내고 다시 시작하지 않고 다시 설치하려고하면 설치 프로그램에서 다시 서비스를 만들 때 문제가 발생할 수 있습니다. – Ilya

1

하지만 HKLM\SYSTEM\CurrentControlSet\Services\ServiceName은 꽤 나타내는 것 같다 이 불행한 상태.

0

제 경우에는 제대로 제거하지 않았기 때문에 서비스가 삭제 된 것으로 표시되었습니다 (제 경우에는 rabbitmq-connection).

이 질문에 대한 직접적인 대답은 아니지만 문제의 근본적인 문제를 해결하는 데 도움이 될 수 있습니다.

관련 문제