【问题标题】:How can I get a list of all open named pipes in Windows?如何获取 Windows 中所有打开的命名管道的列表?
【发布时间】:2010-09-20 11:56:23
【问题描述】:

有没有一种简单的方法来测试您的命名管道是否正常工作?我想确保我从我的应用程序发送的数据实际上正在发送。有没有一种快速简便的方法来获取所有命名管道的列表?

【问题讨论】:

    标签: windows winapi pipe


    【解决方案1】:

    您可以使用来自 sysinternals 的Process Explorer 查看这些内容。使用“Find -> Find Handle or DLL...”选项并输入模式“\Device\NamedPipe\”。它将显示哪些进程打开了哪些管道。

    【讨论】:

    • 在尝试之前检查您拥有的 Process Explorer 版本。它不适用于 v15.23,但适用于 v16.02。 (其他版本没试过)
    • 为了避免可能的异常 - 正如其他答案中提到的那样 - 您可以使用我的解决方案,该解决方案级别更低,但即使命名管道的名称包含文件名称中的无效字符,也能像魅力一样工作.请看stackoverflow.com/questions/25109491/…
    • 使用来自 SysInternals 的pipelist.exe 更简单,但它只是命令行。
    【解决方案2】:

    使用来自 Sysinternals 的 pipelist.exe

    【讨论】:

    • 另见 sysinternals 中的 handle.exe,它将显示几乎所有具有打开句柄的东西。
    【解决方案3】:

    C#:

    String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
    

    【讨论】:

      【解决方案4】:

      请尝试以下方法:

      String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
      

      【讨论】:

      • 你少了一个斜线。 string[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
      • 我花了一整夜寻找一个函数来搜索或列出管道。这正是我所需要的。谢谢!!
      • 这个特殊路径是什么? \\.\ 似乎用于对驱动器的原始访问,但 pipe 来自哪里?
      • @Kevin "\\.\" 根据msdn.microsoft.com/en-US/en-en/library/windows/desktop/…表示“这台机器”
      • 我们在 Windows 10 上使用此方法时遇到问题 - 出现错误“第二个路径片段不能是驱动器或 UNC 名称。参数名称:path2”
      【解决方案5】:

      第二个管道在提交时被此网站解释...您需要在开头使用两个反斜杠。所以请务必使用System.IO.Directory.GetFiles(@"\\.\pipe\")

      请注意,我已经看到此函数调用抛出“路径中的非法字符”。当我机器上的一个管道包含无效字符时出现异常。 PipleList.exe 工作正常,所以它似乎是 MS 的 .NET 代码中的一个错误。

      【讨论】:

      • 关于“路径中的非法字符”的注释很重要,因为程序打开触发此问题的管道名称是很常见的。任何打开名为C:\myLocation\someFile.x 的管道的程序都会导致此错误。
      【解决方案6】:

      在 Windows Powershell 控制台中,键入

      [System.IO.Directory]::GetFiles("\\.\\pipe\\")
      

      如果您的操作系统版本高于 Windows 7,您还可以键入
      get-childitem \\.\pipe\
      

      这会返回一个对象列表。如果您只想要名称:

      (get-childitem \\.\pipe\).FullName
      

      (第二个示例 \\.\pipe\ 在 Powershell 7 中不起作用,但第一个示例可以)

      【讨论】:

      • 您可能需要考虑以管理员身份打开 Powershell
      • 你也可以使用get-childitem \\.\pipe\
      • @AndrewShepherd 很有趣。你在什么操作系统上运行?它适用于 Windows Server 2012 和 Windows 10(分别为 PowerShell v3 和 v5)。
      • @ChrisGillum 但我只是在我的 Windows Surface RT 设备上尝试过。它在那里工作。 (Powershell v4)。我会将您的评论纳入答案。
      • 在 Windows 10 (20H2) 上,get-childitem 变体在 Powershell 5 上工作,但在 Powershell 7 上不工作。
      【解决方案7】:

      我偶然发现了 Chrome 中的一项功能,该功能将通过导航到“file://.//pipe//”列出所有打开的命名管道

      由于我似乎找不到任何参考,而且它对我很有帮助,我想我可以分享一下。

      【讨论】:

      • 你能再解释一下吗?
      • 这确实列出了我的管道。惊人的! (注意这会起作用,因为它就像一个目录,正如 Andrew Shepherd 的回答所示)
      • 我猜这是为了调试/诊断,因为我注意到 Chrome 使用了 lot 的命名管道 - 我发现 125 "chrome" 管道当 Chrome 未运行时!
      【解决方案8】:

      CMD 提示:

      >ver
      
      Microsoft Windows [Version 10.0.18362.476]
      
      >dir \\.\pipe\\
      

      【讨论】:

      • 适用于 W10 但不适用于 W7
      猜你喜欢
      • 2014-09-26
      • 2012-07-11
      • 2020-12-26
      • 2010-10-12
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多