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

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

[SC] QueryServiceConfig失败122:

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

[SC] GetServiceConfig需要1094字节

我认为这意味着sc命令正在发送一个数据结构到其他一些对于需要返回的数据来说太小的库。 而不是SC很好地重试与一个更大的数据结构(1094字节),它炸popup来,给了我这个丑陋的错误信息。 感谢微$经典。

那么有没有办法解决这个错误? 我只需要可执行文件的path,但是如果需要的话,将会parsing出其他文本。

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

 sc qc <service name> 5000 

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


另请参阅SC QC MSDN页面:

 sc [<ServerName>] qc [<ServiceName>] [<BufferSize>] 

哪里:

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

我find了一个可行的解决scheme:

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

当然这需要一些parsing,但它给了我services.msc对话框提供的完整path。

你可以在PowerShell中用WMI查询这样做:

 $service = get-wmiobject -query 'select * from win32_service where name="winrm"'; echo $service.pathname 

这将为您提供完整的path,包括在services.msc中显示的选项。 只要把我的例子中的winrmreplace成你想要search的任何服务即可。

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

尝试使用wmic命令行实用程序。 以下是我的计算机上名为CrashPlanService的服务示例。

 C:\Users\Ben>wmic service CrashPlanService get PathName PathName "C:\Program Files\CrashPlan\CrashPlanService.exe" 

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