De manera predeterminada, los servicios de Windows comienzan en el directorio sytem32 (generalmente C:\WINDOWS\system32
).
¿Hay alguna manera de configurar un directorio de trabajo diferente? Estoy pensando en algún parámetro de registro a continuación HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
.
Entonces, ¿se puede hacer esto?
windows
configuration
service
directory
Tomalak
fuente
fuente
Respuestas:
Puede usar la inyección DLL para llamar
SetCurrentDirectory
después de que el proceso ya se haya iniciado. Esto requeriría que creara una aplicación de inyector, más la DLL para inyectar. Existen algunos tutoriales; Probablemente los dos mejores que he encontrado son:Necesitará una buena cantidad de antecedentes de programación en C ++ (y un entorno de compilación de trabajo) para superar eso.
Sin embargo, esto supone que el servicio está mirando el directorio actual. Otra posibilidad es que esté usando
%path%
. Usted dice que "comienza ensystem32
, intenta algunas ubicaciones más y, finalmente, su propio directorio", por lo que me parece más probable.Compare los directorios que ve
procmon
con su%path%
. Si son iguales, considere modificar el usuarioSYSTEM %path%
o el%path%
usuario que ejecuta el servicio, de modo que el directorio que desea que busque sea el primero.Sin embargo, creo que Fred tiene razón: es poco probable que veas un beneficio de rendimiento significativo al hacer esto, a menos que ocurra con mucha frecuencia. Las operaciones simples de apertura de archivos no son particularmente costosas, especialmente si se trata de una ruta local y el archivo en realidad no existe.
fuente
%PATH%
embargo, modificar para la cuenta de usuario con la que se ejecuta el servicio es una idea decente.Al igual que MattB, no conozco ninguna forma de cambiar el directorio de trabajo del servicio sin acceso al código fuente. Para este escenario específico, es probable que las comprobaciones de directorio adicionales no impongan tanta actividad de disco innecesaria en relación con la cantidad de E / S requerida para la operación de indexación de texto completo. Incluso si pudiera optimizarlos, el índice de texto completo requerirá un disco intensivo por la naturaleza de la bestia.
fuente
Agregue un valor de cadena "AppDirectory" a la Clave de parámetros y establezca el valor en el directorio de trabajo deseado.
fuente
srvany
. No estoy seguro acerca de los servicios normales.Haga esto dentro de la función principal del Servicio:
GetModuleFilename
. Recuperará el nombre de archivo del módulo (el exe), incluida la ruta, en el formularioC:\path\to\exe\your_service.exe
.std::string
funciónfind_last_of()
), para encontrar la última barra invertida. Pele / recorte la cadena a partir de ahí para obtener la ruta a su módulo y, por lo tanto, el directorio de su exe.SetCurrentDirectory
y listo!fuente