如何在不使用 sc qc 的情況下取得 Windows 服務執行檔的路徑?

如何在不使用 sc qc 的情況下取得 Windows 服務執行檔的路徑?

我需要透過命令提示字元查詢 Windows 服務以取得其可執行檔的路徑。我認為我的方式這樣做是:sc qc myServiceName,但是當我這樣做時,出現以下錯誤:

[SC] QueryServiceConfig 失敗 122:

傳遞給系統呼叫的資料區域太小。

[SC] GetServiceConfig 需要 1094 位元組

我認為這意味著 sc 命令正在將資料結構發送到其他某個庫,該資料結構對於需要返回的資料來說太小了。 SC 沒有很好地重試更大的資料結構(1094 位元組),而是崩潰了並給了我這個醜陋的錯誤訊息。謝謝微$oft。

那麼有沒有辦法解決這個錯誤呢?我只需要可執行檔的路徑,但如果需要,我會從其他文字中解析它。

答案1

當我嘗試獲取可執行檔案路徑很長的服務的詳細資訊時,我也遇到了這個問題。這次討論包含解決方法;您可以將緩衝區大小作為參數傳遞給sc qc.也就是說,如果你這樣做:

sc qc <service name> 5000

“傳遞給系統呼叫的資料區域太小”錯誤消失。


另請參閱品管中心MSDN 頁面:

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

在哪裡:

<BufferSize> 指定緩衝區的大小(以位元組為單位)。預設緩衝區大小為 1,024 位元組。

答案2

我找到了一個可行的解決方案:

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

當然,這需要一些解析,但它為我提供了 services.msc 對話框提供的完整路徑。

答案3

您可以在 PowerShell 中使用 WMI 查詢執行此操作,如下所示:

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

這將為您提供完整路徑,包括 services.msc 中顯示的選項。只需將winrm我的範例替換為您想要搜尋的任何服務。

上面的查詢winrm應該會輸出C:\Windows\System32\svchost.exe -k NetworkService

答案4

從 PowerShell 7 開始:

(Get-Service theServiceName).BinaryPathName

相關內容