Par défaut, les services Windows démarrent dans le répertoire sytem32 (généralement C:\WINDOWS\system32
).
Existe-t-il un moyen de configurer un répertoire de travail différent? Je pense à un paramètre de registre ci-dessous HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
.
Alors - cela peut-il être fait?
windows
configuration
service
directory
Tomalak
la source
la source
Réponses:
Vous pouvez utiliser l'injection de DLL pour appeler une
SetCurrentDirectory
fois le processus lancé. Cela vous obligerait à créer une application injecteur, plus la DLL à injecter. Certains tutoriels existent; probablement les deux meilleurs que j'ai trouvés sont:Vous aurez besoin d'une quantité décente de fond de programmation C ++ (et d'un environnement de construction fonctionnel) pour passer à travers cela.
Cependant, cela suppose que le service consulte le répertoire en cours. Une autre possibilité est qu'il utilise
%path%
. Vous dites qu'il "commence àsystem32
, essaie quelques emplacements supplémentaires et éventuellement son propre répertoire", donc cela me semble plus probable.Comparez les répertoires que vous voyez
procmon
avec votre%path%
. S'ils sont identiques, envisagez de modifier leSYSTEM %path%
ou le%path%
de l'utilisateur exécutant le service, de sorte que le répertoire que vous souhaitez qu'il recherche soit le premier.Je crois que Fred a raison, cependant - il est peu probable que vous constatiez un avantage significatif en termes de performances en faisant tout cela, sauf si cela se produit très fréquemment. Les opérations simples d'ouverture de fichier ne sont pas particulièrement coûteuses, surtout s'il s'agit d'un chemin local et que le fichier n'existe pas réellement.
la source
%PATH%
du compte d'utilisateur sous lequel le service est exécuté est une bonne idée, cependant.Comme MattB, je ne connais aucun moyen de changer le répertoire de travail du service sans accès au code source. Pour ce scénario spécifique, il est probable que les vérifications de répertoire supplémentaires n'imposent pas autant d'activité disque inutile par rapport à la quantité d'E / S requise pour l'opération d'indexation de texte intégral. Même si vous pouvez les optimiser, l'index de texte intégral sera gourmand en disque par la nature de la bête.
la source
Ajoutez une valeur de chaîne "AppDirectory" à la clé de paramètres et définissez la valeur dans votre répertoire de travail souhaité.
la source
srvany
. Pas sûr des services normaux.Pour ce faire, dans la fonction principale du service:
GetModuleFilename
. Il récupérera le nom de fichier du module (l'exe), y compris le chemin, dans le formulaireC:\path\to\exe\your_service.exe
.std::string
fonctionfind_last_of()
), pour trouver la dernière barre oblique inverse. Déshabillez / coupez la chaîne à partir de là pour obtenir le chemin vers votre module et donc le répertoire de votre exe.SetCurrentDirectory
et le tour est joué!la source