我正在寻找一种方法来找出任何 Windows服务的命令行参数。
对于非服务进程,可以在Windows任务pipe理器中find命令行参数,也可以通过使用WMI以编程方式find这个post 。
不幸的是,这两个解决scheme不适用于由ServiceController.Start(String [] args)方法启动的Windows服务。 即使传入了一些参数,它们也只能显示命令行中的可执行文件path。
更新:
我也尝试创build一个简单的服务,只logging任何命令行参数到事件日志。 我用"sc.exe start <my service> <arg1>"
启动它,并确认<arg1>
已写入事件日志。 但是,没有任何解决scheme为我工作。 我所看到的仍然只是可执行文件的path。 我的操作系统版本是Windows Server 2008 R2 SP1 x64企业版。
有两种类型的服务参数
第二种类型的参数只能由服务本身知道,如果实现使用它,而不是许多服务的情况。 我不认为当我们看像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)应用程序
它就像任务管理器一样。 它列出了所有正在运行的进程,选择你的服务并查看它的属性。
服务进程不像往常一样启动。 更重要的是,服务过程可能只是.dll文件。 请参阅: http : //en.wikipedia.org/wiki/Windows_service 。
许多出现在Windows任务管理器的进程列表中,通常使用用户名SYSTEM,LOCAL SERVICE或NETWORK SERVICE,尽管不是所有具有SYSTEM用户名的进程都是服务。 其余的服务通过svchost.exe作为加载到内存中的DLL运行。
只需重写ServiceBase.OnStart(string [] args)方法即可。 查看更多: http : //msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.onstart.aspx