Как получить список всех открытых именованных каналов в Windows?

87

Есть ли простой способ проверить, правильно ли работает ваш именованный канал? Я хочу убедиться, что данные, которые я отправляю из своего приложения, действительно отправляются. Есть ли быстрый и простой способ получить список всех именованных каналов?

Дуг Т.
источник

Ответы:

95

Вы можете просмотреть их с помощью Process Explorer из sysinternals. Используйте опцию «Найти -> Найти дескриптор или DLL ...» и введите шаблон «\ Device \ NamedPipe \». Он покажет вам, какие процессы открывают какие каналы.

Роб Уокер
источник
Перед тем, как попробовать, проверьте, какая у вас версия Process Explorer. Он не работает на v15.23, но работает на v16.02. (другие версии не пробовал)
Carl
2
Чтобы избежать возможных исключений, как упоминается в других ответах, вы можете использовать мое решение, которое является более низким уровнем, но работает как шарм, даже если имя именованного канала содержит недопустимые символы в качестве имени файла. Пожалуйста , см stackoverflow.com/questions/25109491/...
user2126375
2
Использование pipelist.exeиз SysInternals еще проще, но это только командная строка.
Крис Чарабарук
80

В консоли Windows Powershell введите

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

Если версия вашей ОС выше, чем Windows 7, вы также можете ввести
get-childitem \\.\pipe\

Это возвращает список объектов. Если вам нужно только имя:

(get-childitem \\.\pipe\).FullName
Эндрю Шеперд
источник
3
Вы можете рассмотреть возможность открытия Powershell от имени администратора
dotNetE
2
Вы также можете использовать get-childitem \\. \ Pipe \
Крис Гиллум
@ChrisGillum Я пробовал это и получил ошибку «Не могу найти путь '\\. \ Pipe \', потому что он не существует»
Эндрю Шеперд
1
@AndrewShepherd Интересно. На какой ОС вы работаете? У меня он работает на Windows Server 2012 и Windows 10 (PowerShell v3 и v5 соответственно).
Крис Гиллум
1
@ChrisGillum Но я только что попробовал это на своем устройстве Windows Surface RT. Он там работает. (Powershell v4). Я включу ваш комментарий в ответ.
Эндрю Шеперд
57

Вместо этого попробуйте следующее:

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
Винсент Лиду
источник
6
вам не хватает косой черты. строка [] listOfPipes = System.IO.Directory.GetFiles (@ "\\. \ pipe \");
dmex
Я всю ночь искал функцию для поиска или вывода списка каналов. Это именно то, что мне нужно. Благодарность!!
swax
Что это за особый путь? \\. \, похоже, используется для прямого доступа к диску, но откуда он pipe?
Кевин Дойон
2
@Kevin "\\. \" Означает "этот компьютер" согласно msdn.microsoft.com/en-US/en-en/library/windows/desktop/…
Евгений Рябцев
5
У нас были проблемы с этим методом, работающим в Windows 10 - ошибка «Второй фрагмент пути не должен быть именем диска или UNC. Имя параметра: путь2»
Дай Бок
44

Используйте pipelist.exe от Sysinternals.

Джей
источник
1
См. Также handle.exe из sysinternals, который покажет почти все вещи с открытым дескриптором.
JimR 03
19

Я наткнулся на функцию в Chrome, которая выводит список всех открытых именованных каналов, перейдя к "file: //.//pipe//"

Поскольку я не могу найти никаких ссылок на это, и это было очень полезно для меня, я подумал, что могу поделиться.

Daynew
источник
Не могли бы вы объяснить немного больше?
Дитер Мемкен
Это список моих трубок. Удивительный! (обратите внимание, что это будет работать, потому что он работает как каталог, как показывает ответ Эндрю Шеперда)
Мартин Колл,
Я предполагаю, что это для отладки / диагностики, так как я заметил, что Chrome использует много именованных каналов - я обнаружил 125 «хромированных» каналов, даже когда Chrome не запущен!
Cocowalla
16

C #:

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
Омар Эльшериф
источник
8

По CMDзапросу:

>ver

Microsoft Windows [Version 10.0.18362.476]

>dir \\.\pipe\\
Константин Константинидис
источник
Работает на W10, но не на W7
кубок
7

Второй канал был интерпретирован этим веб-сайтом при отправке ... Вам нужны две обратные косые черты в начале. Поэтому обязательно используйте System.IO.Directory.GetFiles (@ "\\. \ Pipe \").

Обратите внимание, что я видел, как этот вызов функции выдавал «недопустимые символы в пути». исключение, когда в одной из каналов на моей машине были недопустимые символы. PipleList.exe работал нормально, так что это похоже на ошибку в коде MS .net.

Винсент Лиду
источник
1
Замечание о «недопустимых символах в пути» является важным моментом, потому что очень часто программы открывают имена каналов, которые вызывают это. Любая программа, открывающая канал с именемC:\myLocation\someFile.x , вызовет эту ошибку.
dss539