如何获取Windows服务的命令行参数

本文关键字:服务 命令行 参数 Windows 何获取 获取 | 更新日期: 2023-09-27 17:57:56

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

对于非服务进程,命令行参数可以在Windows任务管理器中找到,也可以通过使用WMI以编程方式找到,如本文所示。

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

  1. 有什么不同在两种场景之间(服务与。非服务流程)
  2. 有没有找出论点的方法Windows服务

我还尝试创建一个简单的服务,只将它所拥有的任何命令行参数记录到事件日志中。我使用"sc.exe start <my service> <arg1>"启动它,并验证<arg1>是否已写入事件日志。

然而,所有的解决方案都对我无效。我仍然只看到了可执行文件的路径。我的操作系统版本是Windows Server 2008 R2 SP1 x64 Enterprise。

如何获取Windows服务的命令行参数

服务有两种类型的参数:

  • 在进程启动命令行上传递的参数。您可以使用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应用程序

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

  1. 服务进程不是作为通常的EXE文件启动的。更重要的是,服务进程可能只是一个.dll文件。请参阅:Windows服务(维基百科)。

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

  2. 只需覆盖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"