Por padrão, os serviços do Windows iniciam no diretório sytem32 (geralmente C:\WINDOWS\system32
).
Existe uma maneira de configurar um diretório de trabalho diferente? Estou pensando em algum parâmetro do registro abaixo HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
.
Então - isso pode ser feito?
windows
configuration
service
directory
Tomalak
fonte
fonte
Respostas:
Você pode usar a injeção de DLL para chamar
SetCurrentDirectory
depois que o processo já foi iniciado. Isso exigiria a criação de um aplicativo injetor, além da DLL para injetar. Existem alguns tutoriais; provavelmente os dois melhores que eu encontrei são:Você precisará de uma quantidade razoável de experiência em programação C ++ (e um ambiente de construção funcional) para superar isso.
No entanto, isso pressupõe que o serviço esteja olhando para o diretório atual. Outra possibilidade é que esteja usando
%path%
. Você diz que "começa emsystem32
, tenta mais alguns locais e, eventualmente, seu próprio diretório", então isso me parece mais provável.Compare os diretórios que você vê
procmon
com o seu%path%
. Se eles são o mesmo, considerar a modificação ou aSYSTEM %path%
ou a%path%
do usuário que executa o serviço, de modo que o diretório que você quer que ele procure é o primeiro.Porém, acredito que Fred esteja certo - é improvável que você veja qualquer benefício significativo no desempenho fazendo isso, a menos que isso ocorra com muita frequência. Operações simples de abertura de arquivos não são particularmente caras, especialmente se for um caminho local e o arquivo não existir realmente.
fonte
%PATH%
a conta de usuário sob a qual o serviço é executado é uma idéia decente.Como o MattB, não conheço nenhuma maneira de alterar o diretório de trabalho do serviço sem acesso ao código-fonte. Para esse cenário específico, é provável que as verificações extras do diretório não imponham muita atividade desnecessária em disco em relação à quantidade de E / S necessária para a operação de indexação de texto completo. Mesmo que você possa otimizá-los, o índice de texto completo será intensivo em disco pela natureza da fera.
fonte
Adicione um valor de string "AppDirectory" à Chave de parâmetros e defina o valor para o diretório de trabalho desejado.
fonte
srvany
. Não tenho certeza sobre os serviços normais.Faça isso na função principal do serviço:
GetModuleFilename
. Ele recuperará o nome do arquivo do módulo (o exe), incluindo o caminho, no formulárioC:\path\to\exe\your_service.exe
.std::string
funçãofind_last_of()
), para encontrar a última barra invertida. Tira / apara a string a partir daí para obter o caminho para o seu módulo e, portanto, o diretório do seu exe.SetCurrentDirectory
e pronto!fonte