Windows 서비스 : 현재 작업 디렉토리를 구성 할 수 있습니까?


11

기본적으로 Windows 서비스는 sytem32 디렉토리 (일반적으로 C:\WINDOWS\system32) 에서 시작합니다 .

다른 작업 디렉토리를 설정하는 방법이 있습니까? 아래의 일부 레지스트리 매개 변수를 생각하고 있습니다 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService.

그래서-이것을 할 수 있습니까?


3
@Tomalak : 그것은 당신이 쓴 서비스입니까? 코드를 통해 할 수는 있지만 서비스 설정에는 방법이 없다고 생각합니다.
MattB

아니요, 제가 작성한 서비스가 아닙니다. 나는 약간의 알려진 레지스트리 설정을 원했습니다.
Tomalak

그것을하는 목적은 무엇입니까?
user35115

@ user35115 : 글쎄, 솔직히 말해서… procmon과 관련이없는 문제를 추적하는 동안 특정 I / O가 많은 서비스 (전체 텍스트 인덱서)가 잘못된 위치 (예 : 멍청한)에서 자체 파일을 지속적으로 확인한다는 것을 알았습니다. system32에서 시작하여 더 많은 위치를 시도하고 결국 자체 디렉토리를 시도합니다. 나는 그것이 자신의 디렉토리에서 즉시 실행될 때, 불필요한 파일 검사를 덜 할 것이라고 생각했습니다. 현재 작동 하지는 않지만 개선의 여지가 있는지 궁금해했습니다.
Tomalak

1
@ user35115, 작업 디렉토리와 관련된 특정 앱 (예 : Apache 등)의 구성 설정을 대량으로 변경하지 않아도됩니다 .
Pacerier

답변:


5

SetCurrentDirectory프로세스가 이미 시작된 후 DLL 주입을 사용하여 호출 할 수 있습니다 . 인젝터 응용 프로그램과 삽입 할 DLL을 빌드해야합니다. 일부 튜토리얼이 존재합니다. 아마 내가 찾은 가장 좋은 두 가지는 다음과 같습니다.

이를 위해서는 알맞은 양의 C ++ 프로그래밍 배경 및 작업 환경이 필요합니다.

그러나 이것은 서비스가 현재 디렉토리를보고 있다고 가정합니다. 또 다른 가능성은을 사용하고 있다는 것 %path%입니다. 당신은 그것이 "에서 시작하고 system32, 더 많은 위치를 시도하고 결국에는 자신의 디렉토리를 시도 한다"고 말하는데 , 이것은 나에게 더 가능성이있는 것 같습니다.

표시된 디렉토리를와 비교 procmon하십시오 %path%. 동일한 경우 서비스를 실행하는 사용자 의 SYSTEM %path%또는 하나를 수정 %path%하여 검색하려는 디렉토리가 첫 번째가되도록하십시오.

하지만 Fred가 옳다고 생각 합니다. 매우 자주 발생하지 않는 한이 작업을 수행하면 성능에 큰 이점이 없을 것 입니다. 간단한 파일 열기 작업은 특히 로컬 경로이고 파일이 실제로 존재하지 않는 경우 특히 비싸지 않습니다.


시스템 PATH 환경 변수가 가장 먼저 떠 올랐습니다. 그러나 PATH 변수의 시작 부분에 서비스 경로를 삽입하면 거의 모든 다른 응용 프로그램의 성능에 부정적인 영향을 미치므로 권장하지 않습니다.
Marnix van Valen

나는 이것을 어느 쪽이든 백업 할 수있는 어려운 숫자는 없지만 내 직감에 따르면 경로를 수정해도 실질적인 성능 향상이나 손실이 발생하지 않을 것입니다. 이것은 매우 일반적인 시나리오입니다. 설치 중에 경로를 수정할 때 시스템 성능에 부정적인 영향을 미친다고 아무도 Windows 지원 도구 또는 SQL Server를 비난하지 않습니다. 나는 누군가가 procmon을보고 "omg, 모든 파일 접근을 봐라!"라는 것을 처음 본 것은 아니며 대부분의 응용 프로그램에서 일반적이라는 것을 깨닫지 못했습니다.
핵분열

창의력 +1 :-) 이러한 파일 작업이 성능에 상당한 영향을 미치지 않는다는 것을 완전히 이해하고 있으므로 실제로 DLL 삽입 솔루션 작성을 방해하지는 않습니다. %PATH%그러나 서비스가 실행되는 사용자 계정을 수정 하는 것은 괜찮은 아이디어입니다.
Tomalak 2019

1
이 서비스 만 실행하도록 특수 사용자를 작성하고이 사용자에 대한 % PATH %를 수정하면 매우 좋은 방법으로 들립니다. +1
Sunny

@fission : 네, 당신의 대답을 받아들입니다. ;) 그것은 내가 기대했던 것이 아니지만, 그것이 가까워지는 것 같아요.
Tomalak

1

MattB와 마찬가지로 소스 코드에 액세스하지 않고 서비스 작업 디렉토리를 변경하는 방법을 모릅니다. 이 특정 시나리오의 경우 추가 디렉토리 검사로 전체 텍스트 인덱싱 작업에 필요한 I / O의 양과 관련하여 불필요한 디스크 활동이 많이 발생하지 않을 수 있습니다. 당신이 그들을 멀리 최적화 할 수있다하더라도, 전체 텍스트 인덱스는 짐승의 본질에 의해 디스크를 많이 사용합니다.


1

"AppDirectory"문자열 값을 매개 변수 키에 추가하고 원하는 작업 디렉토리로 값을 설정하십시오.


흠. 방금 테스트했지만 작동하지 않는 것 같습니다 (Windows 7의 경우 REG_EXPAND_SZ 데이터 유형 사용). 이것이 실제로 효과가 있는지 다시 확인할 수 있습니까?
Tomalak

사용하면 작동합니다 srvany. 정상적인 서비스가 확실하지 않습니다.
Konstantin Spirin

1

서비스 기본 기능 내에서이를 수행하십시오.

  • 에 전화를 GetModuleFilename겁니다. 경로를 포함하여 모듈 (exe) 파일 이름을 형식으로 검색 C:\path\to\exe\your_service.exe합니다.
  • 마지막 백 슬래시를 찾으려면 문자열 조작 ( std::stringfunction 사용 가능)을 사용하십시오 find_last_of(). 거기에서 문자열을 제거하거나 잘라서 모듈의 경로와 exe의 디렉토리를 얻습니다.
  • 기능 SetCurrentDirectory과 voila를 호출하십시오 !

1
GetModuleFilename 함수 호출에서 HMODULE 매개 변수에 널을 전달하는 것을 잊지 마십시오. :)
uprightech
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.