Eu encontrei uma solução viável:
reg query "HKLM\System\CurrentControlSet\Services\<serviceName>" /v "ImagePath"
É claro que isso precisa de alguma análise, mas me fornece o caminho completo que a caixa de diálogo services.msc fornece.
Eu preciso consultar um serviço do windows para o caminho para ele ser executável através do prompt de comando. Acho que a maneira que eu faria é: sc qc myServiceName
, mas quando faço isso, recebo o seguinte erro:
[SC] QueryServiceConfig FAILED 122:
The data area passed to a system call is too small.
[SC] GetServiceConfig needs 1094 bytes
Acho que isso significa que o comando sc está enviando uma estrutura de dados para alguma outra biblioteca que é muito pequena para os dados que precisam ser retornados. Em vez de o SC tentar novamente com uma estrutura de dados maior (1094 bytes), ele é bombardeado e me fornece essa mensagem de erro desagradável. Obrigado Micro $ oft.
Existe uma maneira de contornar esse erro? Eu só preciso do caminho para o executável, mas vou analisá-lo de algum outro texto, se necessário.
Também encontrei esse problema ao tentar obter os detalhes de um serviço em que o caminho para o executável era muito longo. Esta discussão contém uma solução alternativa; você pode passar um tamanho de buffer como um argumento para sc qc
. Isto é, se você fizer:
sc qc <service name> 5000
a "área de dados passada para uma chamada do sistema é muito pequena", o erro desaparece.
Veja também a página da MSDN SC QC :
sc [<ServerName>] qc [<ServiceName>] [<BufferSize>]
onde:
<BufferSize> Specifies the size (in bytes) of the buffer. The default buffer size is 1,024 bytes.
Você pode fazer isso no PowerShell com uma consulta WMI como esta:
$service = get-wmiobject -query 'select * from win32_service where name="winrm"'; echo $service.pathname
Isso lhe dará o caminho completo, incluindo as opções mostradas em services.msc. Apenas substitua winrm
no meu exemplo pelo serviço que você deseja procurar.
A consulta acima para winrm
deve produzir C:\Windows\System32\svchost.exe -k NetworkService
Experimente usando o utilitário de linha de comando wmic
. Aqui está um exemplo de um serviço na minha máquina chamado CrashPlanService
.
C:\Users\Ben>wmic service CrashPlanService get PathName
PathName
"C:\Program Files\CrashPlan\CrashPlanService.exe"
Basicamente, wmic service <<YourService>> get PathName
.