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

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

Preciso consultar um serviço do Windows para saber o caminho para seu executável por meio do prompt de comando. Eu acho que do jeito que euseriafazer isso é: sc qc myServiceName, mas quando faço isso, recebo o seguinte erro:

[SC] QueryServiceConfig FALHA 122:

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

[SC] GetServiceConfig precisa de 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 falha e me dá uma mensagem de erro feia. Obrigado Micro$oft.

Então, existe uma maneira de contornar esse erro? Eu só preciso do caminho para o executável, mas irei analisá-lo de algum outro texto, se necessário.

Responder1

Também encontrei esse problema ao tentar obter os detalhes de um serviço onde o caminho para o executável era muito longo.Esta discussãocontém uma solução alternativa; você pode passar um tamanho de buffer como argumento para sc qc. Isto é, se você fizer:

sc qc <service name> 5000

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


Veja tambémControle de qualidade SCPágina MSDN:

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

onde:

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

Responder2

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 fornecido pela caixa de diálogo services.msc.

Responder3

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. Basta substituir winrmno meu exemplo por qualquer serviço que você deseja procurar.

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

Responder4

A partir do PowerShell 7:

(Get-Service theServiceName).BinaryPathName

informação relacionada