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


15

Eu preciso consultar um serviço do Windows para o caminho para ele é executável através do prompt de comando. Eu acho que a maneira como faria isso é:, sc qc myServiceNamemas quando faço isso, recebo o seguinte erro:

[SC] QueryServiceConfig FAILED 122:

A área de dados passada para uma chamada do sistema é muito pequena.

[SC] GetServiceConfig precisa de 1094 bytes

Eu 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 dispara e me dá essa mensagem de erro feia. Obrigado Micro $ oft.

Portanto, existe uma maneira de contornar esse erro? Eu só preciso do caminho para o executável, mas o analisarei de outro texto, se necessário.

Respostas:


20

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 argumento para sc qc. Ou seja, se você fizer:

sc qc <service name> 5000

o erro "a área de dados passada para uma chamada do sistema é muito pequena" desaparece.


Consulte também a página SC QC MSDN:

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

Onde:

<BufferSize> Especifica o tamanho (em bytes) do buffer. O tamanho padrão do buffer é 1.024 bytes.


2
FYI, 2^13 = 8192é o valor máximo para o tamanho do buffer.
nebffa

sc queryex type= service state= all | find /i "myServiceNamelista todos os serviços, mas infelizmente nenhum caminho.
Shayan

13

Encontrei uma solução viável:

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

É claro que isso precisa de uma análise, mas fornece o caminho completo fornecido pela caixa de diálogo services.msc.


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 fornecerá o caminho completo, incluindo as opções mostradas em services.msc. Basta substituir winrmno meu exemplo por qualquer serviço que você deseja procurar.

A consulta acima para winrmdeve produzirC:\Windows\System32\svchost.exe -k NetworkService


Infelizmente, não posso depender do PowerShell, pois o XP não o possui por padrão. Preciso de suporte para XP, servidor 2008 e 7, tudo sem instalar nenhum software adicional.
Jared

@ Jared isso é muito ruim. Você não consegue executar isso de uma única máquina contra várias máquinas remotas?
MDMarra

Não, isso é realmente um pouco de script para desinstalar um aplicativo. Eu descobri uma solução que funciona e acrescentou uma resposta para ela embora.
Jared

4

Experimente usando o wmicutilitário de linha de comando. 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.


1
Não funciona bem. Mas, por outro lado, isso funciona: "wmic service | find" <servicename> "
djangofan 22/11/11

@djangofan que saída você obtém e com qual serviço? Talvez você tenha uma versão diferente do wmic(eu estou no Windows 7 SP1)?
Ben Pilbrow

Ben Pilbrow Isso também não funcionou para mim. O wmic não está recebendo o nome do caminho (apenas retorna "PathName" sem nada na linha a seguir). Não tenho certeza se isso ocorre porque há muitos parâmetros incorporados no caminho, tornando-o muito longo.
Jared

trabalhou para mim, mas eu tinha que processar o resultado um pouco: ((serviço wmic SQLBrowser get PathName) -match " "")[0].replace("'', '')
katbyte

wmic servicefunciona bem. Lista todos os serviços com seus caminhos.
Shayan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.