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

时间:2011-05-31 03:44:00

标签: c# .net windows service

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

对于非服务进程,可以在Windows任务管理器中找到命令行参数,也可以使用WMI以编程方式查找this post

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

  1. 有什么区别 两种情况之间(服务与 非服务流程)?
  2. 有没有 找出论点的方法 Windows服务?
  3. 我还尝试创建一个简单的服务,只记录它对事件日志的任何命令行参数。我使用"sc.exe start <my service> <arg1>"启动了它,并验证了<arg1>已写入事件日志。

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

4 个答案:

答案 0 :(得分:7)

服务有两种类型的参数:

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

第二种类型的参数可能只有服务本身知道,如果实现使用它,而许多服务则不然。当我们查看PEB: Process and Thread Structures (MSDN)等低级Windows结构时,我不认为Windows会跟踪这一点,即使是未记录的部分, {{ 3}}

答案 1 :(得分:4)

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

下找到
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services

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

答案 2 :(得分:2)

尝试Process Explorer

中的Sysinternals申请

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

答案 3 :(得分: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)