Jak mogę uzyskać ścieżkę do pliku wykonywalnego usługi Windows BEZ przy użyciu sc qc?

15

Muszę zapytać usługę systemu Windows o ścieżkę do jej pliku wykonywalnego za pomocą wiersza polecenia. Myślę, że zrobiłbym to tak: sc qc myServiceNameale kiedy to robię, pojawia się następujący błąd:

[SC] QueryServiceConfig FAILED 122:

Obszar danych przekazywany do wywołania systemowego jest zbyt mały.

[SC] GetServiceConfig potrzebuje 1094 bajtów

Myślę, że oznacza to, że polecenie sc wysyła strukturę danych do innej biblioteki, która jest zbyt mała, aby dane mogły zostać zwrócone. Zamiast SC ładnie ponawia próbę z większą strukturą danych (1094 bajtów) bombarduje i daje mi ten brzydki komunikat o błędzie. Dzięki Micro $ często.

Czy istnieje sposób obejścia tego błędu? Potrzebuję tylko ścieżki do pliku wykonywalnego, ale w razie potrzeby przeanalizuję go z innego tekstu.

Jared
źródło

Odpowiedzi:

20

Ten problem również napotkałem, gdy próbowałem uzyskać szczegóły usługi, w której ścieżka do pliku wykonywalnego była bardzo długa. Ta dyskusja zawiera obejście; możesz przekazać rozmiar bufora jako argument do sc qc. Oznacza to, że jeśli:

sc qc <service name> 5000

błąd „obszar danych przekazany do wywołania systemowego jest zbyt mały” znika.


Zobacz także stronę MS Q SC QC :

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

gdzie:

<Rozmiar bufora> Określa rozmiar bufora (w bajtach). Domyślny rozmiar bufora to 1024 bajty.

Ken Keenan
źródło
2
FYI, 2^13 = 8192to maksymalna wartość rozmiaru bufora.
nebffa
sc queryex type= service state= all | find /i "myServiceNamezawiera listę wszystkich usług, ale niestety nie ma ścieżki.
Shayan
13

Znalazłem wykonalne rozwiązanie:

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

Oczywiście wymaga to analizy, ale daje mi pełną ścieżkę, którą zapewnia okno dialogowe services.msc.

Jared
źródło
10

Możesz to zrobić w PowerShell za pomocą zapytania WMI takiego jak to:

$service = get-wmiobject -query 'select * from win32_service where name="winrm"'; echo $service.pathname

To da ci pełną ścieżkę, w tym opcje pokazane w services.msc. Po prostu zamień winrmw moim przykładzie dowolną usługę, której chcesz szukać.

Powyższe zapytanie dla winrmpowinno dać wynikC:\Windows\System32\svchost.exe -k NetworkService

MDMarra
źródło
Niestety nie mogę polegać na PowerShell, ponieważ XP nie ma go domyślnie. Potrzebuję wsparcia dla XP, serwera 2008 i 7, wszystko bez instalowania dodatkowego oprogramowania.
Jared
@Jared to źle. Nie możesz uruchomić tego z jednego komputera na kilku zdalnych komputerach?
MDMarra,
Nie, tak naprawdę jest to trochę skryptu, który można przejść do deinstalatora aplikacji. Wymyśliłem rozwiązanie, które działa i dodałem odpowiedź na to pytanie.
Jared
4

Wypróbuj za pomocą wmicnarzędzia wiersza polecenia. Oto przykład usługi na moim komputerze o nazwie CrashPlanService.

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

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

Zasadniczo wmic service <<YourService>> get PathName.

Ben Pilbrow
źródło
1
Nie do końca działa. Ale z drugiej strony działa to: „usługa wmic | znajdź” <nazwa_usługi> ”
djangofan 22.11.11
@djangofan, jaką wydajność otrzymujesz iz jaką usługą? Może masz inną wersję wmic(korzystam z Windows 7 SP1)?
Ben Pilbrow
@Ben Pilbrow To też nie działało dla mnie. wmic nie otrzymuje nazwy ścieżki (zwraca tylko „PathName” bez niczego w następnym wierszu). Nie jestem pewien, czy dzieje się tak, ponieważ w ścieżce osadzonych jest wiele parametrów, przez co jest ona bardzo długa.
Jared
pracował dla mnie, ale musiałem trochę przetworzyć wynik: ((usługa SQLBrowser usługi wmic get PathName) -match " "")[0].replace("" "," ")
katbyte
wmic servicedziała świetnie. Wyświetla listę wszystkich usług wraz z ich ścieżkami.
Shayan