Wie kann ich den Pfad zu einer ausführbaren Windows-Dienstdatei abrufen, OHNE sc qc zu verwenden?

Wie kann ich den Pfad zu einer ausführbaren Windows-Dienstdatei abrufen, OHNE sc qc zu verwenden?

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 myServiceNameaber 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 winrmin meinem Beispiel einfach durch den Dienst, nach dem Sie suchen möchten.

Die obige Abfrage winrmsollte Folgendes ausgeben:C:\Windows\System32\svchost.exe -k NetworkService

Antwort4

Ab PowerShell 7:

(Get-Service theServiceName).BinaryPathName

verwandte Informationen