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 winrm
no meu exemplo por qualquer serviço que você deseja procurar.
A consulta acima winrm
deve gerarC:\Windows\System32\svchost.exe -k NetworkService
Responder4
A partir do PowerShell 7:
(Get-Service theServiceName).BinaryPathName