Windows 서비스는 어떤 디렉토리에서 실행됩니까?


86

매우 간단한 .NET Windows 서비스를 만들고 InstallUtil.exe 유틸리티를 사용하여 설치했습니다.

서비스에는 다음과 같은 코드가 있습니다.

if (File.Exists("test_file.txt"))
{
   // Do something clever
}

서비스와 동일한 디렉토리에 test_file.txt라는 파일을 만들었지 만 코드의 주석 처리 된 부분이 실행되지 않습니다 ...?


서비스를 실행하는 사용자에게 파일에 대한 올바른 권한이 있습니까?
CSharpAtl

답변:


80

서비스는 Service Control Manager라는 응용 프로그램에서 시작됩니다. 이 응용 프로그램은 시스템 디렉터리 % WinDir % \ System32에 있습니다.

Windows 7 Ultimate-64 비트에서이 경로는 실제로 : % WinDir % \ SysWOW64입니다.

자세한 내용은 MSDN의 서비스 제어 관리자를 참조하십시오 .

원래 게시물의 문제를 지적 해 주신 Harper Shelby에게 감사드립니다.


1
svchost.exe는 대부분의 내부 Windows 서비스를위한 서비스 호스트입니다. 서비스는 Windows가 아닌 서비스의 경우 다른 exe 호스트에서 실행될 수 있습니다.
Michael

1
감사합니다. 파일을 거기에 놓으면 작동하므로 위치를 확인할 수 있습니다. c : \ windows \ system32
Guy

1
@Guy-나는 그것을 조사하려고 노력했습니다. SCM (Service Control Manager)이 실행되는 디렉토리이기 때문에 '좋은'이유를 찾을 수 없습니다. 그래서 상위 프로세스의 환경에서 하위 프로세스 (서비스)로 전달됩니다.
Harper Shelby

서비스는 % WINDIR % \ system32에있는 서비스 제어 관리자 (services.exe)에 의해 시작됩니다. en.wikipedia.org/wiki/Service_Control_Manager
Dirk Vollmar

2
나에게는 (64 비트 Windows 7에서) %WinDir%\SysWOW64대신
Strigoides

97
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory());

현재 디렉토리를 출력합니다. 해당 코드를 서비스의 시작 방법에 넣고 DebugView 와 같은 도구를 사용 하여 출력을 확인하십시오. 그러면 서비스의 시작 폴더를 알 수 있습니다.

이 간단한 기술은 서비스 개발의 많은 문제, 특히 서비스 시작을 디버그하는 데 유용합니다.

서비스의 작업 폴더가 서비스 실행 파일이있는 폴더가 될 것으로 예상했을 것입니다 (저도 마찬가지). 다음 코드 줄을 사용하여 해당 폴더로 변경할 수 있습니다.

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);

16

다음과 같이 작동하도록 만들 수 있습니다.

string cwd = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
Directory.SetCurrentDirectory(cwd ?? ".");

1
+1, 이렇게하면 나머지 응용 프로그램이 현재 디렉터리가 경로 인 정상적으로 호출 된 .exe 인 것처럼 작동 할 수 있습니다. 고마워요, 이것이 바로 제가 필요한 것입니다! 상대 경로를 사용하는 코드를 다시 작성할 필요가 없습니다.
Paul

3

또한 Windows 서비스가 실행중인 폴더를 알고 싶었지만 소스 코드가 내 것이 아니 어서 수정할 수 없었습니다. 명령 프롬프트에 입력 sc qc <service name>하면 BINARY_PATH_NAME의 폴더가 표시됩니다.

C:\>sc qc
DESCRIPTION:
        Queries the configuration information for a service.
USAGE:
        sc <server> qc [service name] <bufferSize>

MyService를 쿼리하면 다음을 얻을 수 있습니다.

C :> sc qc MyService

[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: MyService
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 3   DEMAND_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : "D:\Routines\MyService\MyService.exe"
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : MyService
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem

이는 서비스 바이너리가있는 경로이며, (서비스) 프로세스의 가동 시간 동안 여러 번 변경 될 수있는 서비스의 "현재 작업"디렉토리와 동일하지 않을 수도 있습니다. 상대 파일 이름 (OPs 예제에서와 같이)은 실행 가능한 바이너리가있는 디렉토리가 아닌 현재 작업 디렉토리에 대해 확인됩니다.
Christian.K

sc qc apache2.4...BINARY_PATH_NAME : "E:\root\Public Cache\Apache Httpd\httpd-2.4.20-x86-vc11\Apache24\bin\httpd.exe" -k runservice,하지만 작업 디렉토리 대신입니다%WinDir%\System32
Pacerier

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.