web-dev-qa-db-fra.com

Comment obtenir le chemin vers un exécutable de service Windows SANS utiliser sc qc?

J'ai besoin d'interroger un service Windows pour le chemin d'accès à son exécutable via l'invite de commande. Je pense que la façon dont je le ferais est la suivante: sc qc myServiceName, mais lorsque je fais cela, j'obtiens l'erreur suivante:

[SC] Échec de QueryServiceConfig 122:

La zone de données transmise à un appel système est trop petite.

[SC] GetServiceConfig a besoin de 1094 octets

Je pense que cela signifie que la commande sc envoie une structure de données à une autre bibliothèque qui est trop petite pour les données qui doivent être retournées. Au lieu de SC réessayer gentiment avec une structure de données plus grande (1094 octets), il bombarde et me donne ce vilain message d'erreur. Merci Micro $ oft.

Existe-t-il un moyen de contourner cette erreur? J'ai juste besoin du chemin vers l'exécutable, mais je vais l'analyser à partir d'un autre texte si nécessaire.

15
Jared

J'ai trouvé une solution viable:

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

Bien sûr, cela nécessite une analyse, mais cela me donne le chemin complet fourni par la boîte de dialogue services.msc.

13
Jared

J'ai également rencontré ce problème en essayant d'obtenir les détails d'un service où le chemin vers l'exécutable était très long. Cette discussion contient une solution de contournement; vous pouvez passer une taille de tampon comme argument à sc qc. Autrement dit, si vous le faites:

sc qc <service name> 5000

l'erreur "la zone de données passée à un appel système est trop petite" disparaît.


Voir aussi SC QC page MSDN:

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

où:

<BufferSize> Spécifie la taille (en octets) du tampon. La taille de tampon par défaut est de 1 024 octets.

21
Ken Keenan

Vous pouvez le faire dans PowerShell avec une requête WMI comme celle-ci:

$service = get-wmiobject -query 'select * from win32_service where name="winrm"'; echo $service.pathname

Cela vous donnera le chemin complet, y compris les options telles qu'elles sont affichées dans services.msc. Remplacez simplement winrm dans mon exemple par le service que vous souhaitez rechercher.

La requête ci-dessus pour winrm doit générer C:\Windows\System32\svchost.exe -k NetworkService

10
MDMarra

Essayez-le à l'aide de l'utilitaire de ligne de commande wmic. Voici un exemple de service sur ma machine appelé CrashPlanService.

C:\Users\Ben>wmic service CrashPlanService get PathName

PathName
"C:\Program Files\CrashPlan\CrashPlanService.exe"

Fondamentalement, wmic service <<YourService>> get PathName.

4
Ben Pilbrow
$binpath = (Get-ItemProperty -Path HKLM:SYSTEM\CurrentControlSet\Services\<serviceName>).ImagePath
$binpath = ($binpath).Substring(1,($binpath).IndexOf("<serviceBinFileName>")-1)
0
Zosoabi