Windows Service: Posso configurar o diretório de trabalho atual?

9

Por padrão, os serviços do Windows são iniciados 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 de registro abaixo de HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService .

Então - isso pode ser feito?

    
por Tomalak 18.02.2010 / 14:43

4 respostas

5

Você pode usar a injeção de DLL para chamar SetCurrentDirectory após o processo já ter sido iniciado. Isso exigiria que você criasse um aplicativo injetor, além da DLL para injetar. Alguns tutoriais existem; provavelmente os dois melhores que encontrei são:

Você precisará de uma quantidade decente de experiência em programação C ++ (e um ambiente de criação de trabalho) para passar por isso.

No entanto, isso pressupõe que o serviço esteja olhando para o diretório atual. Outra possibilidade é que ele esteja usando %path% . Você diz que "começa em system32 , tenta mais alguns locais e, eventualmente, seu próprio diretório", então isso parece mais provável para mim.

Compare os diretórios que você vê em procmon com seu %path% . Se forem iguais, considere modificar o SYSTEM %path% ou o %path% do usuário que está executando o serviço, para que o diretório que você deseja pesquisar seja o primeiro.

Acredito que Fred esteja certo, no entanto - é improvável que você veja qualquer benefício significativo no desempenho fazendo isso, a menos que esteja acontecendo muito com frequência. As operações de abertura de arquivos simples não são particularmente caras, especialmente se for um caminho local e o arquivo não existir realmente.

    
por 24.02.2010 / 10:25
1

Como MattB, não sei de nenhuma maneira de alterar o diretório de trabalho do serviço sem o acesso ao código-fonte. Para esse cenário específico, é provável que as verificações de diretório extras não imponham muita atividade de disco desnecessária em relação à quantidade de i / o 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 besta.

    
por 22.02.2010 / 15:13
1

Adicione um valor de seqüência de caracteres "AppDirectory" à chave de parâmetros e defina o valor para o diretório de trabalho desejado.

    
por 22.11.2010 / 16:53
0

Faça isso na função principal do Serviço:

  • Faça uma chamada para GetModuleFilename . Ele irá recuperar o nome do arquivo do módulo (exe), incluindo o caminho, no formato C:\path\to\exe\your_service.exe .
  • Use manipulações de string (talvez usando std::string function find_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.
  • Faça uma chamada para a função SetCurrentDirectory e voila!
por 08.02.2011 / 09:53