如何获得一个Windows服务的命令行参数?

我正在寻找一种方法来找出任何 Windows服务的命令行参数。

对于非服务进程,可以在Windows任务pipe理器中find命令行参数,也可以通过使用WMI以编程方式find这个post 。

不幸的是,这两个解决scheme不适用于由ServiceController.Start(String [] args)方法启动的Windows服务。 即使传入了一些参数,它们也只能显示命令行中的可执行文件path。

  1. 有人可以解释两种情况(服务与非服务stream程)之间的区别吗?
  2. 有没有办法找出Windows服务的参数?

更新:

我也尝试创build一个简单的服务,只logging任何命令行参数到事件日志。 我用"sc.exe start <my service> <arg1>"启动它,并确认<arg1>已写入事件日志。 但是,没有任何解决scheme为我工作。 我所看到的仍然只是可执行文件的path。 我的操作系统版本是Windows Server 2008 R2 SP1 x64企业版。

有两种类型的服务参数

  • 在进程启动命令行上传递的参数。 你可以很容易地使用Process Explorer等等。
  • 传递给ServiceMain函数的参数 。 这是服务应该实现的WIndows API。 .NET等价物是ServiceBase.OnStart 。 这是当你做SC START [参数]时使用的。 这与“命令行进程参数”无关。

第二种类型的参数只能由服务本身知道,如果实现使用它,而不是许多服务的情况。 我不认为当我们看像PEB这样的低级窗口结构时,Windows会跟踪这个: http : //msdn.microsoft.com/en-us/library/ms684855 (v=VS.85) .aspx ,甚至它的无证部分http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PEB.html

你可以找到服务的EXE细节和编辑,或只是看到该服务的注册表项中的命令行选项。 你会发现下

 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services 

如果您决定更改此选项,请务必重新启动“服务”窗口,因为它不会实时重新读取。

从sysInternals尝试Procexp(ProcessExplorer)应用程序

它就像任务管理器一样。 它列出了所有正在运行的进程,选择你的服务并查看它的属性。

  1. 服务进程不像往常一样启动。 更重要的是,服务过程可能只是.dll文件。 请参阅: http : //en.wikipedia.org/wiki/Windows_service 。

    许多出现在Windows任务管理器的进程列表中,通常使用用户名SYSTEM,LOCAL SERVICE或NETWORK SERVICE,尽管不是所有具有SYSTEM用户名的进程都是服务。 其余的服务通过svchost.exe作为加载到内存中的DLL运行。

  2. 只需重写ServiceBase.OnStart(string [] args)方法即可。 查看更多: http : //msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.onstart.aspx