Como posso obter o caminho para um executável de serviço do Windows SEM usar sc qc?

14

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.

    
por Jared 23.11.2011 / 00:03

4 respostas

10

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.

    
por 23.11.2011 / 16:06
18

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.

    
por 21.08.2014 / 15:44
10

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

    
por 23.11.2011 / 16:32
3

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 .

    
por 23.11.2011 / 00:12