기본적으로 Windows 서비스는 sytem32 디렉토리 (일반적으로 C:\WINDOWS\system32
) 에서 시작합니다 .
다른 작업 디렉토리를 설정하는 방법이 있습니까? 아래의 일부 레지스트리 매개 변수를 생각하고 있습니다 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
.
그래서-이것을 할 수 있습니까?
기본적으로 Windows 서비스는 sytem32 디렉토리 (일반적으로 C:\WINDOWS\system32
) 에서 시작합니다 .
다른 작업 디렉토리를 설정하는 방법이 있습니까? 아래의 일부 레지스트리 매개 변수를 생각하고 있습니다 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
.
그래서-이것을 할 수 있습니까?
답변:
SetCurrentDirectory
프로세스가 이미 시작된 후 DLL 주입을 사용하여 호출 할 수 있습니다 . 인젝터 응용 프로그램과 삽입 할 DLL을 빌드해야합니다. 일부 튜토리얼이 존재합니다. 아마 내가 찾은 가장 좋은 두 가지는 다음과 같습니다.
이를 위해서는 알맞은 양의 C ++ 프로그래밍 배경 및 작업 환경이 필요합니다.
그러나 이것은 서비스가 현재 디렉토리를보고 있다고 가정합니다. 또 다른 가능성은을 사용하고 있다는 것 %path%
입니다. 당신은 그것이 "에서 시작하고 system32
, 더 많은 위치를 시도하고 결국에는 자신의 디렉토리를 시도 한다"고 말하는데 , 이것은 나에게 더 가능성이있는 것 같습니다.
표시된 디렉토리를와 비교 procmon
하십시오 %path%
. 동일한 경우 서비스를 실행하는 사용자 의 SYSTEM %path%
또는 하나를 수정 %path%
하여 검색하려는 디렉토리가 첫 번째가되도록하십시오.
하지만 Fred가 옳다고 생각 합니다. 매우 자주 발생하지 않는 한이 작업을 수행하면 성능에 큰 이점이 없을 것 입니다. 간단한 파일 열기 작업은 특히 로컬 경로이고 파일이 실제로 존재하지 않는 경우 특히 비싸지 않습니다.
%PATH%
그러나 서비스가 실행되는 사용자 계정을 수정 하는 것은 괜찮은 아이디어입니다.
"AppDirectory"문자열 값을 매개 변수 키에 추가하고 원하는 작업 디렉토리로 값을 설정하십시오.
srvany
. 정상적인 서비스가 확실하지 않습니다.
서비스 기본 기능 내에서이를 수행하십시오.
GetModuleFilename
겁니다. 경로를 포함하여 모듈 (exe) 파일 이름을 형식으로 검색 C:\path\to\exe\your_service.exe
합니다.std::string
function 사용 가능)을 사용하십시오 find_last_of()
. 거기에서 문자열을 제거하거나 잘라서 모듈의 경로와 exe의 디렉토리를 얻습니다.SetCurrentDirectory
과 voila를 호출하십시오 !