2011-05-31 12 views
6

Estoy buscando una manera de averiguar los argumentos de línea de comandos de cualquier servicio de Windows.¿Cómo obtener los argumentos de línea de comandos de un servicio de Windows?

Para un proceso que no sea de servicio, los argumentos de la línea de comandos se pueden encontrar en el Administrador de tareas de Windows, o mediante programación utilizando WMI como se muestra en este post.

Desafortunadamente, estas dos soluciones no funcionan para un servicio de Windows que se inicia con el método ServiceController.Start(String[] args). Ambos se muestran solamente la ruta del archivo ejecutable en la línea de comandos, a pesar de que algunos argumentos fueron aprobadas en.

  1. Podría alguien explicar la diferencia entre dos escenarios (V.S. servicio proceso no servicio)?
  2. ¿Hay una forma para descubrir los argumentos del servicio de ventanas ?

ACTUALIZACIÓN:

También probé la creación de un servicio sencillo que simplemente registra los argumentos de línea de comandos que tiene para el registro de eventos. Lo inicié usando "sc.exe start <my service> <arg1>" y verifiqué que <arg1> se escribiera en el registro de eventos. Sin embargo, ninguna de las soluciones me ha funcionado. Lo que vi todavía era solo la ruta al archivo ejecutable. Mi versión del sistema operativo es Windows Server 2008 R2 SP1 x64 Enterprise.

Respuesta

7

Hay dos tipos de argumentos en favor de los servicios

  • argumentos que se aprobaron en el proceso de puesta en línea de comandos. Puede acceder fácilmente a aquellos que usan Process Explorer, etc.
  • argumentos que se pasaron al ServiceMain function. Esta es la API de Windows que se supone que debe implementar un servicio. El equivalente de .NET es ServiceBase.OnStart. Esto es lo que se usa cuando haces un SC START [argumentos]. Esto no tiene nada que ver con "argumentos de proceso de línea de comandos".

El segundo tipo de parámetros es probablemente solo conocido por el propio servicio, si la implementación hace algún uso del mismo, que no es el caso para muchos servicios. No creo que Windows haga un seguimiento de esto cuando nos fijamos en estructuras de Windows de bajo nivel como el PEB: http://msdn.microsoft.com/en-us/library/ms684855(v=VS.85).aspx, incluso las partes no documentadas de él http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PEB.html

+0

Gracias por la respuesta, Simon. Probablemente tengas razón. No pude obtener una mejor respuesta de una lista de correo interna. Puede que exista alguna forma estrafalaria de resolver esto, pero revisé las API de SCM y no parece ser de ayuda. –

2

tratar Procexp aplicación (ProcessExplorer) de sysInternals

Es como administrador de tareas solamente. Enumera todos los procesos en ejecución, seleccione su servicio y vea sus propiedades.

+0

Enlace de descarga para Process Explorer: http://live.sysinternals.com/ procexp.exe – hackworks

+0

En realidad probé antes con exex.exe y también mostró lo mismo que mostró el Administrador de tareas. Debería haber mencionado intentarlo también. Por cierto, gracias. –

+0

He comprobado algunos servicios Explorador de procesos muestra los argumentos de la línea de comandos –

2
  1. El proceso de servicio se inicia como de costumbre exe. Aún más, el proceso de servicio podría ser solo un archivo .dll. Ver: http://en.wikipedia.org/wiki/Windows_service.

    Muchos aparecen en la lista de procesos en el Administrador de tareas de Windows, lo más a menudo con un nombre de usuario del sistema, servicio local o Servicio de red, aunque no todos los procesos con el nombre de usuario SISTEMA son servicios. Los servicios restantes se ejecutan a través de svchost.exe como archivos DLL cargados en la memoria.

  2. Simplemente anule el método ServiceBase.OnStart (string [] args). Ver más: http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.onstart.aspx

+0

Gracias, pero quise preguntar sobre calcular los complementos de línea de comandos de cualquier servicio de Windows, no el que creé, así que no puedo anular el método como dijiste en el n. ° 2. También estoy buscando la diferencia entre dos casos, por qué para un proceso interactivo puedo ver los argumentos, pero para un servicio no puedo. –

4

puede encontrar los detalles de servicio y EXE editar o simplemente ver las opciones de línea de comandos en la entrada del registro para el servicio. Usted encontrará que bajo

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services 

asegúrese de reiniciar la ventana de Servicios si decide cambiar esto, ya que no va a volver a leerlo en vivo.

+0

Gracias por la sugerencia, pero incluso este registro tampoco muestra los argumentos de línea de comandos del servicio de Windows. La clave más cercana es "ImagePath" que muestra la ruta al ejecutable del servicio, como el Administrador de tareas, Procexp.exe y el programa que escribí. –

+1

He visto al menos algunos de los servicios, al final de ImagePath existen los argumentos de línea de comandos. Por ejemplo: ImagePath = "c: \ mongo \ mongod.exe --dbperdirectory --dbpath = c: \ data \ mongo" –

+1

¡Gracias, exactamente lo que necesitaba! – timothyclifford

Cuestiones relacionadas