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.

Jared
fonte

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.

Ken Keenan
fonte
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.

Jared
fonte
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

MDMarra
fonte
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.

Ben Pilbrow
fonte
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