Wie kann ich den Pfad zu einem ausführbaren Windows-Dienst OHNE sc qc abrufen?

15

Ich muss einen Windows-Dienst über die Eingabeaufforderung nach dem Pfad zur ausführbaren Datei abfragen. Ich denke, wie ich das machen würde , ist:, sc qc myServiceNameaber wenn ich das mache, bekomme ich den folgenden Fehler:

[SC] QueryServiceConfig FEHLGESCHLAGEN 122:

Der an einen Systemaufruf übergebene Datenbereich ist zu klein.

[SC] GetServiceConfig benötigt 1094 Bytes

Ich denke, dies bedeutet, dass der Befehl sc eine Datenstruktur an eine andere Bibliothek sendet, die zu klein für die Daten ist, die zurückgegeben werden müssen. Anstatt SC mit einer größeren Datenstruktur (1094 Bytes) erneut zu versuchen, bombardiert es und gibt mir diese hässliche Fehlermeldung. Vielen Dank 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 analysieren.

Jared
quelle

Antworten:

20

Ich bin auch auf dieses Problem gestoßen, als ich versucht habe, die Details eines Dienstes abzurufen, bei dem der Pfad zur ausführbaren Datei sehr lang war. Diese Diskussion enthält eine Problemumgehung. Sie können eine Puffergröße als Argument an übergeben sc qc. Das heißt, wenn Sie tun:

sc qc <service name> 5000

Der Fehler "Datenbereich, der an einen Systemaufruf übergeben wird, ist zu klein" wird behoben.


Siehe auch SC QC MSDN Seite:

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

wo:

<BufferSize> Gibt die Größe (in Byte) des Puffers an. Die Standardpuffergröße beträgt 1.024 Byte.

Ken Keenan
quelle
2
FYI 2^13 = 8192ist der Maximalwert für die Puffergröße.
Nebffa
sc queryex type= service state= all | find /i "myServiceNamelistet alle dienste aber leider keinen pfad auf.
Shayan
13

Ich habe eine praktikable Lösung gefunden:

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

Natürlich muss dies analysiert werden, aber es gibt mir den vollständigen Pfad, den das Dialogfeld services.msc bereitstellt.

Jared
quelle
10

Sie können dies in PowerShell mit einer WMI-Abfrage wie der folgenden 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, die in services.msc angezeigt werden. Ersetzen Sie winrmin meinem Beispiel einfach den gewünschten Dienst.

Die obige Abfrage für winrmsollte ausgegeben werdenC:\Windows\System32\svchost.exe -k NetworkService

MDMarra
quelle
Leider kann ich mich nicht auf Powershell verlassen, da XP es nicht standardmäßig hat. Ich benötige Unterstützung für XP, Server 2008 und 7, ohne zusätzliche Software zu installieren.
Jared
@Jared das ist schade. Sie sind nicht in der Lage, dies von einem einzelnen Computer aus auf einer Reihe von Remotecomputern auszuführen?
MDMarra
Nein, das ist eigentlich ein bisschen Skript, das im Deinstallationsprogramm für eine Anwendung benötigt wird. Ich fand eine Lösung, die funktioniert, und fügte eine Antwort hinzu.
Jared
4

Versuchen Sie es mit dem wmicBefehlszeilenprogramm. Hier ist ein Beispiel für einen Dienst, der auf meinem Computer aufgerufen wird CrashPlanService.

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

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

Grundsätzlich wmic service <<YourService>> get PathName.

Ben Pilbrow
quelle
1
Funktioniert nicht ganz. Aber auf der anderen Seite, dies funktioniert: „wmic Service | finden‚<Service>‘
djangofan
@djangofan welche ausgabe bekommst du und mit welchem ​​service? Vielleicht haben Sie eine andere Version von wmic(ich bin auf Windows 7 SP1)?
Ben Pilbrow
@ Ben Pilbrow Das hat auch bei mir nicht funktioniert. wmic erhält den Pfadnamen nicht (gibt nur "PathName" mit nichts in der folgenden Zeile zurück). Ich bin mir nicht sicher, ob dies daran liegt, dass viele Parameter in den Pfad eingebettet sind, was ihn sehr lang macht.
Jared
hat bei mir geklappt aber ich musste das ergebnis ein wenig verarbeiten: ((wmic service SQLBrowser get PathName) -match "")[0].replace(""", "")
katbyte 23.11.12
wmic servicefunktioniert super. Listet alle Services mit ihren Pfaden auf.
Shayan