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.
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.
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.
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
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
.
$binpath = (Get-ItemProperty -Path HKLM:SYSTEM\CurrentControlSet\Services\<serviceName>).ImagePath
$binpath = ($binpath).Substring(1,($binpath).IndexOf("<serviceBinFileName>")-1)