【问题标题】:How to determine the port on which a Windows service is listening?如何确定 Windows 服务正在侦听的端口?
【发布时间】:2021-12-16 23:34:37
【问题描述】:

我正在运行一个名为 my-service 的 Windows 服务。我知道的唯一输入是服务名称

我可以通过服务名称获取进程标识符

$id = Get-WmiObject -Class Win32_Service -Filter "name='my-service'" | Select-Object -ExpandProperty ProcessId

要获取监听端口列表,我可以使用netstat,但我所有的自定义服务都有PID4,它不等于服务进程标识符 Get-WmiObject cmdlet。

目标是使用 PowerShell 或 CMD 根据 服务名称进程标识符 获取服务正在侦听的端口,而不是通过 图像名称

【问题讨论】:

    标签: windows powershell cmd windows-services


    【解决方案1】:

    使用Get-NetTCPConnection 识别给定进程当前正在侦听的套接字:

    Get-NetTCPConnection -OwningProcess $id -State Listen
    

    【讨论】:

    • OwningProcess ID 与服务的Process ID 不同。
    • @OrestGulman 恐怕我不明白你的评论。
    • OwningProcess ID 在我的例子中是 4 ProcessName = System 同时ProcessId1272
    • @OrestGulman 这意味着该服务没有直接使用该端口,而是已向操作系统组件注册以代表它进行侦听 - 例如,当您在 Windows 中使用 HTTP 驱动程序注册路径前缀时会发生这种情况 -您的程序告诉 Windows“我想响应 /some/path 的请求”,然后内核将流量转发给程序。您可以使用netsh http show urlaclinterfacing with Httpapi.dll 找到已注册的前缀,但它们将绑定到一个帐户,而不是一个 PID
    【解决方案2】:
    【解决方案3】:

    由于您已包含 标记,因此您可以在 cmd.exe 中尝试以下想法,即 Windows 命令提示符:

    For /F "Tokens=2 Delims=," %G In ('%SystemRoot%\System32\tasklist.exe /SVC /Fi "Services Eq my-service" /Fo CSV /NH 2^>NUL') Do @For /F "Tokens=3 Delims=: " %H In ('%SystemRoot%\System32\netstat.exe -ano ^| %SystemRoot%\System32\findstr.exe "[^0123456789]%~G$" ^| %SystemRoot%\System32\find.exe /V "["') Do @Echo %H
    

    只需将 my-service 更改为您的“真实”服务名称即可。

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2011-02-19
      • 2011-04-03
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2014-04-02
      相关资源
      最近更新 更多