如何在不使用 sc qc 的情况下获取 Windows 服务可执行文件的路径?

Jar*_*red 17 windows windows-service windows-command-prompt

我需要通过命令提示符查询 Windows 服务的可执行路径。我想我的方式做到这一点是:sc qc myServiceName,但是当我这样做,我得到以下错误:

[SC] QueryServiceConfig 失败 122:

传递给系统调用的数据区太小。

[SC] GetServiceConfig 需要 1094 字节

我认为这意味着 sc 命令正在向其他一些库发送一个数据结构,该结构对于需要返回的数据来说太小了。SC 没有用更大的数据结构(1094 字节)很好地重试,它会爆炸并给我这个丑陋的错误消息。谢谢微$oft。

那么有没有办法解决这个错误?我只需要可执行文件的路径,但如果需要,我会从其他一些文本中解析它。

Ken*_*nan 22

在尝试获取可执行文件路径很长的服务的详细信息时,我也遇到了这个问题。此讨论包含一个解决方法;您可以将缓冲区大小作为参数传递给sc qc. 也就是说,如果你这样做:

sc qc <service name> 5000
Run Code Online (Sandbox Code Playgroud)

“传递给系统调用的数据区域太小”错误消失了。


另请参阅SC QC MSDN 页面:

sc [<ServerName>] qc [<ServiceName>] [<BufferSize>]
Run Code Online (Sandbox Code Playgroud)

在哪里:

<BufferSize> 指定缓冲区的大小(以字节为单位)。默认缓冲区大小为 1,024 字节。

  • 仅供参考,`2^13 = 8192` 是缓冲区大小的最大值。 (2认同)

Jar*_*red 14

我找到了一个可行的解决方案:

reg query "HKLM\System\CurrentControlSet\Services\<serviceName>" /v "ImagePath"

当然这需要一些解析,但它为我提供了 services.msc 对话框提供的完整路径。


MDM*_*rra 10

您可以在 PowerShell 中使用 WMI 查询执行此操作,如下所示:

$service = get-wmiobject -query 'select * from win32_service where name="winrm"'; echo $service.pathname
Run Code Online (Sandbox Code Playgroud)

这将为您提供完整路径,包括 services.msc 中显示的选项。只需winrm在我的示例中替换为您要搜索的任何服务。

上面的查询winrm应该输出C:\Windows\System32\svchost.exe -k NetworkService


Ben*_*row 5

使用wmic命令行实用程序尝试一下。这是我机器上名为CrashPlanService.

C:\Users\Ben>wmic service CrashPlanService get PathName

PathName
"C:\Program Files\CrashPlan\CrashPlanService.exe"
Run Code Online (Sandbox Code Playgroud)

基本上,wmic service <<YourService>> get PathName