기본적으로 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::stringfunction 사용 가능)을 사용하십시오 find_last_of(). 거기에서 문자열을 제거하거나 잘라서 모듈의 경로와 exe의 디렉토리를 얻습니다.SetCurrentDirectory과 voila를 호출하십시오 !