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

问题描述 投票:6回答:4

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

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

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

  1. 两种方案(服务与非服务流程)之间有什么区别?
  2. 有没有办法弄清楚Windows服务的参数?

我还尝试创建一个简单的服务,只记录它对事件日志的任何命令行参数。我开始使用"sc.exe start <my service> <arg1>"并验证<arg1>已写入事件日志。

但是,没有一个解决方案对我有用。我仍然只看到了可执行文件的路径。我的操作系统版本是Windows Server 2008 R2 SP1 x64 Enterprise。

c# .net windows service
4个回答
7
投票

服务有两种类型的参数:

  • 在进程启动命令行上传递的参数。您可以使用Process Explorer等轻松访问这些内容。
  • 传递给ServiceMain function的论点。这是服务应该实现的WIndows API。 .NET等价物是ServiceBase.OnStart。这是你做SC START \[arguments\]时使用的。这与“命令行进程参数”无关。

第二种类型的参数可能只有服务本身知道,如果实现使用它,而许多服务不是这种情况。当我们看到像PEB:Process and Thread Structures(MSDN)这样的低级别Windows结构时,我不认为Windows会跟踪这一点,即使是未记录的部分,Undocumented functions of NTDLL


4
投票

您可以找到服务EXE文件详细信息并进行编辑,或者只查看服务的注册表项中的命令行选项。你会发现它

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services

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


2
投票

试试Process ExplorerSysinternals应用程序

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


2
投票
  1. 服务进程不是作为通常的EXE文件启动的。更重要的是,服务进程可能只是一个.dll文件。见:Windows service(维基百科)。 许多出现在Windows任务管理器的进程列表中,通常使用SYSTEM,LOCAL SERVICE或NETWORK SERVICE的用户名,但并非所有具有SYSTEM用户名的进程都是服务。其余服务通过svchost.exe作为DLL加载到内存中运行。
  2. 只需覆盖ServiceBase.OnStart(string[] args)方法。查看更多:ServiceBase.OnStart(String[]) Method(MSDN)
© www.soinside.com 2019 - 2024. All rights reserved.