Ich muss einen Windows-Dienst über die Eingabeaufforderung nach dem Pfad zu seiner ausführbaren Datei abfragen. Ich denke, so wie ichwürdetun Sie dies:, sc qc myServiceName
aber wenn ich das tue, erhalte ich die folgende Fehlermeldung:
[SC] QueryServiceConfig FEHLGESCHLAGEN 122:
Der bei einem Systemaufruf übergebene Datenbereich ist zu klein.
[SC] GetServiceConfig benötigt 1094 Bytes
Ich denke, das bedeutet, dass der SC-Befehl eine Datenstruktur an eine andere Bibliothek sendet, die zu klein für die Daten ist, die zurückgegeben werden müssen. Anstatt dass SC es mit einer größeren Datenstruktur (1094 Bytes) erneut versucht, stürzt es ab und gibt mir diese hässliche Fehlermeldung. Danke, Micro$oft.
Gibt es also eine Möglichkeit, diesen Fehler zu umgehen? Ich brauche nur den Pfad zur ausführbaren Datei, werde ihn aber bei Bedarf aus einem anderen Text aussortieren.
Antwort1
Dieses Problem ist mir auch begegnet, als ich versucht habe, die Details eines Dienstes abzurufen, bei dem der Pfad zur ausführbaren Datei sehr lang war.Diese Diskussionenthält einen Workaround; Sie können eine Puffergröße als Argument an übergeben sc qc
. Das heißt, wenn Sie Folgendes tun:
sc qc <service name> 5000
Der Fehler „Der an einen Systemaufruf übergebene Datenbereich ist zu klein“ verschwindet.
Siehe auchSC-QualitätskontrolleMSDN-Seite:
sc [<ServerName>] qc [<ServiceName>] [<BufferSize>]
Wo:
<Puffergröße> Gibt die Größe des Puffers (in Bytes) an. Die Standardpuffergröße beträgt 1.024 Bytes.
Antwort2
Ich habe eine praktikable Lösung gefunden:
reg query "HKLM\System\CurrentControlSet\Services\<serviceName>" /v "ImagePath"
Dies muss natürlich etwas analysiert werden, aber es gibt mir den vollständigen Pfad, der im Dialogfeld „services.msc“ angezeigt wird.
Antwort3
Sie können dies in PowerShell mit einer WMI-Abfrage wie dieser tun:
$service = get-wmiobject -query 'select * from win32_service where name="winrm"'; echo $service.pathname
Dadurch erhalten Sie den vollständigen Pfad, einschließlich der Optionen, wie sie in services.msc angezeigt werden. Ersetzen Sie winrm
in meinem Beispiel einfach durch den Dienst, nach dem Sie suchen möchten.
Die obige Abfrage winrm
sollte Folgendes ausgeben:C:\Windows\System32\svchost.exe -k NetworkService
Antwort4
Ab PowerShell 7:
(Get-Service theServiceName).BinaryPathName