如何获取Windows服务的命令行参数
本文关键字:服务 命令行 参数 Windows 何获取 获取 | 更新日期: 2023-09-27 17:57:56
我正在寻找一种方法来计算任何Windows服务的命令行参数。
对于非服务进程,命令行参数可以在Windows任务管理器中找到,也可以通过使用WMI以编程方式找到,如本文所示。
不幸的是,这两种解决方案不适用于由ServiceController.Start(String[]args)方法启动的Windows服务。它们都只显示命令行上的可执行文件路径,即使传入了一些参数
- 有什么不同在两种场景之间(服务与。非服务流程)
- 有没有找出论点的方法Windows服务
我还尝试创建一个简单的服务,只将它所拥有的任何命令行参数记录到事件日志中。我使用"sc.exe start <my service> <arg1>"
启动它,并验证<arg1>
是否已写入事件日志。
然而,所有的解决方案都对我无效。我仍然只看到了可执行文件的路径。我的操作系统版本是Windows Server 2008 R2 SP1 x64 Enterprise。
服务有两种类型的参数:
- 在进程启动命令行上传递的参数。您可以使用Process Explorer等轻松获取这些信息
- 传递给ServiceMain函数的参数。这是服务应该实现的WIndows API。等效于.NET的是ServiceBase.OnStart。这是在执行
SC START '[arguments']
时使用的。这与"命令行过程参数"无关
第二种类型的参数可能只有服务本身知道,如果实现使用了它,而许多服务都不是这样。当我们查看像PEB:进程和线程结构(MSDN)这样的低级别Windows结构时,我认为Windows不会跟踪这一点,甚至是它的未文档部分,NTDL的未文档函数。
您可以找到服务EXE文件的详细信息并编辑,或者只查看服务注册表项中的命令行选项。你会发现
HKEY_LOCAL_MACHINE'SYSTEM'ControlSet001'services
如果您决定更改,请确保重新启动服务窗口,因为它不会实时重读。
尝试流程;Sysinternals 的Explorer应用程序
它就像任务管理器,只是它列出了所有正在运行的进程。选择您的服务并查看其属性。
-
服务进程不是作为通常的EXE文件启动的。更重要的是,服务进程可能只是一个.dll文件。请参阅:Windows服务(维基百科)。
许多进程出现在Windows任务管理器的进程列表中,通常用户名为SYSTEM、LOCAL SERVICE或NETWORK SERVICE,但并非所有用户名为SYSTEM的进程都是服务。其余服务作为加载到内存中的DLL通过svchost.exe运行。
-
只需覆盖
ServiceBase.OnStart(string[] args)
方法。查看更多信息:ServiceBase.OnStart(String[])方法(MSDN)
使用Powershell可以调用
(Get-CimInstance Win32_Service -Filter 'Name = "<my service>"').PathName
获取服务的完整命令行(返回文件和参数)
只需替换<我的服务>带有所需服务的名称。
例如:
(Get-CimInstance Win32_Service -Filter 'Name = "Dnscache"').PathName
返回"C:''WINDOWS''system32''svchost.exe-k NetworkService-p"