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

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

我需要通过命令提示符查询 Windows 服务以获取其可执行文件的路径。我认为我这样做是:sc qc myServiceName,但是当我这样做时,出现以下错误:

[SC] QueryServiceConfig 失败 122:

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

[SC] GetServiceConfig 需要 1094 个字节

我认为这意味着 sc 命令正在向其他库发送一个数据结构,而这个数据结构对于需要返回的数据来说太小了。SC 并没有使用更大的数据结构(1094 字节)进行重试,而是失败了,并向我发送了这条丑陋的错误消息。感谢 Micro$oft。

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

答案1

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

sc qc <service name> 5000

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


另请参阅质量控制MSDN 页面:

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

在哪里:

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

答案2

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

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

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

答案3

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

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

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

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

答案4

从 PowerShell 7 开始:

(Get-Service theServiceName).BinaryPathName

相关内容