2011-08-25 2 views
192

내 응용 프로그램의 경로를 수정하고 싶지만 서비스가 여전히 이전 위치를 가리 키기 때문에 중단됩니다.Windows 서비스의 "실행 파일 경로"수정

Administrative Tools > Services으로 이동하면 속성 대화 상자를 열고 Path to executable을 볼 수는 있지만 변경할 방법이 없습니다.

사용자가 응용 프로그램을 다시 설치하지 않고도 서비스 경로를 수정할 수있는 방법이 있습니까?

답변

151

또한 레지스트리를 수정하는 대신 sc 명령 줄을 사용 this approach seen on SuperUser있다 binPath= 후 공간이 중요하다. 또한 사용하여 현재 구성을 조회 할 수 있습니다

[SC] QueryServiceConfig 성공

SERVICE_NAME : ServiceName은

TYPE    : 10 WIN32_OWN_PROCESS 
    START_TYPE   : 2 AUTO_START 
    ERROR_CONTROL  : 1 NORMAL 
    BINARY_PATH_NAME : C:\Services\ServiceName 
    LOAD_ORDER_GROUP : 
    TAG    : 0 
    DISPLAY_NAME  : <Display name> 
    DEPENDENCIES  : 
    SERVICE_START_NAME : [email protected] 
+11

올바른 해답이 될 수 있어야 있기 때문에 –

+2

그것은 또한 직접 레지스트리 수정 방법보다 배포 스크립트에서 아마 조금 좋네요. –

+0

달콤한. reg에서 주위에 mucking보다 청결한. ** 참고 : 변경 사항을 보려면 services.msc를 닫고 열어야합니다. – yonsk

264

레지스트리 편집이 포함되지만 서비스 정보는 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services에 있습니다. 리디렉션 할 서비스를 찾아 ImagePath 하위 키를 찾아 값을 변경하십시오.

sc config <service name> binPath= <binary path> 

참고 :

+2

마지막으로이 데이터를 레지스트리에 이르게하지만, 나는 특별한 윈도우가 존재한다는 것을 언급해야한다 서비스를 처리하는 API 함수. 직접 레지스트리 수정은 피해야한다 당신은 당신이 무엇인지 ** 절대 **하지 않는 한 (가, EXE 파일 f.e.을 경로를 수정하는 경우 Windows가 변화하고 다른 것을 확신 할 수 없기 때문에). – lospejos

+3

@lospejos 어느 것 ... "나는 서비스를 다루는 특별한 Windows API 함수가 존재한다는 것을 언급해야한다"? 는 sc –

+3

이 나쁜 대답이다. 많은 경로가 다음과 같이 MS SQL Server와 예를 들어, 입력 할 수있는 문자열을 인용 필요 : '사우스 캐롤라이나 설정 MSSQLSERVER binPath = "\"F : \ SQL DATA \ MSSQL10.MSSQLSERVER \ MSSQL \ BINN \ sqlservr.exe를 \ " -sMSSQLSERVER "' – Worthy7

0

당신을

sc qc <service name> 

이 유사한 출력을 표시합니다 서비스를 삭제할 수 있습니다 :

sc delete ServiceName 

그런 다음 서비스를 다시 만드십시오.

+1

이 작업을 수행 할 필요가 없습니다를 벗은 sc'이 – Liam

7

또한 PowerShell을 함께 할 수있다 :

Get-WmiObject win32_service -filter "Name='My Service'" ` 
    | Invoke-WmiMethod -Name Change ` 
    -ArgumentList @($null,$null,$null,$null,$null, ` 
    "C:\Program Files (x86)\My Service\NewName.EXE") 

또는 : 조금 더 깊이 'SC'명령을

Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\My Service" ` 
    -Name ImagePath -Value "C:\Program Files (x86)\My Service\NewName.EXE" 
-1

, 우리는 모든 '서비스 이름을'추출 할 수 있고있어 모든 'QueryServiceConfig':

>SC QUERY > "%computername%-services.txt" [enter] 

>FIND "SERVICE_NAME: " "%computername%-services.txt" /i > "%computername%-services-name.txt" [enter] 

>NOTEPAD2 "%computername%-services-name.txt" [enter] 

마 '작은'NOTEPAD2 편집 .. Imagine that we can do 'Replace All' within 'CMD'

그런 다음,

>FOR /F "DELIMS= SKIP=2" %S IN ('TYPE "%computername%-services-name.txt"') DO @SC QC "%S" >> "%computername%-services-list-config.txt" [enter] 

>NOTEPAD2 "%computername%-services-list-config.txt" [enter] 

it is 'SERVICES on Our Machine' 원시 데이터 결과는이 다음과 같이이다, 그래서 '미래의 배치 파일을'공급을위한 준비가 .. 'CMD'로

을 계속!
+ -------------+-------------------------+---------------------------+---------------+--------------------------------------------------+------------------+-----+----------------+--------------+--------------------+ 
| SERVICE_NAME | TYPE     | START_TYPE    | ERROR_CONTROL | BINARY_PATH_NAME         | LOAD_ORDER_GROUP | TAG | DISPLAY_NAME | DEPENDENCIES | SERVICE_START_NAME | 
+ -------------+-------------------------+---------------------------+---------------+--------------------------------------------------+------------------+-----+----------------+--------------+--------------------+ 
+ WSearch  | 10 WIN32_OWN_PROCESS | 2 AUTO_START (DELAYED) | 1 NORMAL | C:\Windows\system32\SearchIndexer.exe /Embedding | none    | 0 | Windows Search | RPCSS  | LocalSystem  | 
+ wuauserv  | 20 WIN32_SHARE_PROCESS | 2 AUTO_START (DELAYED) | 1 NORMAL | C:\Windows\system32\svchost.exe -k netsvcs  | none    | 0 | Windows Update | rpcss  | LocalSystem  | 

그러나, HTML 꽤 쉬울 것이다 : 개선을위한 D

모든 밝은 아이디어^_^환영 V입니다

+0

을하거나 '더 쉽게, 많이 sc'을 사용하여 적어도 3 개 더 나은 방법이있다 망칠 것 같지도 않고 – Liam