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

15

Je dois 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 ferais ceci est:, sc qc myServiceNamemais quand je le fais, 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 réessayer gentiment avec une structure de données plus grande (1094 octets), il bombarde et me donne ce message d'erreur laid. 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.

Jared
la source

Réponses:

20

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 également la page SC QC 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.

Ken Keenan
la source
2
FYI, 2^13 = 8192est la valeur maximale de la taille du tampon.
nebffa
sc queryex type= service state= all | find /i "myServiceNameliste tous les services mais malheureusement aucun chemin.
Shayan
13

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.

Jared
la source
10

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 winrmdans mon exemple le service que vous souhaitez rechercher.

La requête ci-dessus pour winrmdevrait sortirC:\Windows\System32\svchost.exe -k NetworkService

MDMarra
la source
Malheureusement, je ne peux pas dépendre de PowerShell car XP ne l'a pas par défaut. J'ai besoin de support pour XP, serveur 2008 et 7, le tout sans installer de logiciel supplémentaire.
Jared
@Jared c'est dommage. Vous ne pouvez pas exécuter cela à partir d'une seule machine sur un tas de machines distantes?
MDMarra
Non, c'est en fait un peu de script à aller dans le programme de désinstallation pour une application. J'ai trouvé une solution qui fonctionne et j'ai ajouté une réponse.
Jared
4

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

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

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

En gros, wmic service <<YourService>> get PathName.

Ben Pilbrow
la source
1
Ça ne marche pas tout à fait. Mais, d'un autre côté, cela fonctionne: "wmic service | find" <servicename> "
djangofan
@djangofan quelle sortie obtenez-vous et avec quel service? Peut-être que vous avez une version différente de wmic(je suis sur Windows 7 SP1)?
Ben Pilbrow
@Ben Pilbrow Cela n'a pas fonctionné pour moi non plus. wmic n'obtient pas le nom du chemin (renvoie simplement "PathName" sans rien sur la ligne suivante). Je ne sais pas si c'est parce qu'il y a beaucoup de paramètres intégrés dans le chemin, ce qui le rend très long.
Jared
travaillé pour moi mais j'ai dû traiter un peu le résultat: ((le service wmic SQLBrowser obtient PathName) -match " "")[0].replace("" "," ")
katbyte
wmic servicefonctionne très bien. Répertorie tous les services avec leurs chemins d'accès.
Shayan