Jak uzyskać listę wszystkich otwartych nazwanych potoków w systemie Windows?

86

Czy istnieje łatwy sposób sprawdzenia, czy nazwany potok działa poprawnie? Chcę się upewnić, że dane, które wysyłam z mojej aplikacji, są rzeczywiście wysyłane. Czy istnieje szybki i łatwy sposób uzyskania listy wszystkich nazwanych potoków?

Doug T.
źródło

Odpowiedzi:

95

Możesz je wyświetlić za pomocą Process Explorer z sysinternals. Użyj opcji „Znajdź -> Znajdź uchwyt lub bibliotekę DLL ...” i wprowadź wzorzec „\ Urządzenie \ NamedPipe \”. Pokaże ci, które procesy mają otwarte rury.

Rob Walker
źródło
Sprawdź, którą wersję Process Explorer masz, zanim spróbujesz. Nie działa w wersji 15.23, ale działa w wersji 16.02. (nie próbowałem innych wersji)
Carl
2
Aby uniknąć możliwych wyjątków - jak jest wspomniane w innych odpowiedziach - możesz użyć mojego rozwiązania, które jest niższego poziomu, ale działa jak urok, nawet jeśli nazwa potoku nazwanego zawiera nieprawidłowe znaki w nazwie pliku. Zobacz stackoverflow.com/questions/25109491/ ...
user2126375
2
Korzystanie pipelist.exez SysInternals jest jeszcze prostsze, ale jest to tylko wiersz poleceń.
Chris Charabaruk
79

W konsoli programu Windows Powershell wpisz

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

Jeśli Twoja wersja systemu operacyjnego jest nowsza niż Windows 7, możesz również wpisać
get-childitem \\.\pipe\

Zwraca listę obiektów. Jeśli chcesz tylko nazwę:

(get-childitem \\.\pipe\).FullName
Andrew Shepherd
źródło
3
Możesz rozważyć otwarcie Powershell jako administrator
dotNetE
2
Możesz również użyć get-childitem \\. \ Pipe \
Chris Gillum
@ChrisGillum Próbowałem tego i otrzymałem błąd „Nie można znaleźć ścieżki '\\. \ Pipe \', ponieważ nie istnieje”
Andrew Shepherd
1
@AndrewShepherd ciekawe. Na jakim systemie operacyjnym używasz? U mnie działa na Windows Server 2012 i Windows 10 (odpowiednio PowerShell v3 i v5).
Chris Gillum,
1
@ChrisGillum Ale właśnie wypróbowałem to na moim urządzeniu z systemem Windows Surface RT. Tam działa. (Powershell v4). Uwzględnię Twój komentarz w odpowiedzi.
Andrew Shepherd
57

Zamiast tego spróbuj wykonać następujące czynności:

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
Vincent Lidou
źródło
6
brakuje ci ukośnika. string [] listOfPipes = System.IO.Directory.GetFiles (@ "\\. \ pipe \");
dmex
Spędziłem całą noc na poszukiwaniu funkcji do wyszukiwania lub wyświetlania listy rur. Właśnie tego potrzebowałem. Dzięki!!
wosk
Jaka jest ta specjalna ścieżka? \\. \ wydaje się być używany do surowego dostępu do dysku, ale skąd pipepochodzi?
Kevin Doyon
2
@Kevin „\\. \” Oznacza „ten komputer”, zgodnie z msdn.microsoft.com/en-US/en-en/library/windows/desktop/…
Eugene Ryabtsev
5
Mieliśmy problemy z tą metodą działającą w systemie Windows 10 - otrzymujemy błąd „Drugi fragment ścieżki nie może być nazwą dysku ani UNC. Nazwa parametru: ścieżka2”
Dai Bok
44

Użyj pipelist.exe z Sysinternals.

Sójka
źródło
1
Zobacz także handle.exe z sysinternals, który pokaże prawie wszystkie rzeczy z otwartym dojściem.
JimR,
19

W Chrome natknąłem się na funkcję, która wyświetla listę wszystkich otwartych nazwanych potoków, przechodząc do „file: //.//pipe//”

Ponieważ nie mogę znaleźć żadnego odniesienia do tego i było to dla mnie bardzo pomocne, pomyślałem, że mogę się podzielić.

Daynew
źródło
Czy możesz wyjaśnić trochę więcej?
Dieter Meemken
To zawiera listę moich rur. Niesamowity! (uwaga, to zadziała, ponieważ działa jak katalog, jak pokazuje odpowiedź Andrew Shepherda)
Martín Coll,
Wydaje mi się, że to jest do debugowania / diagnostyki, ponieważ zauważyłem, że Chrome używa wielu nazwanych potoków - znalazłem 125 "chromowanych" potoków, nawet gdy Chrome nie działa!
Cocowalla
16

DO#:

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
Omar Elsherif
źródło
8

Po CMDmonicie:

>ver

Microsoft Windows [Version 10.0.18362.476]

>dir \\.\pipe\\
Constantin Konstantinidis
źródło
Działa na W10, ale nie na W7
puchar
7

Drugi potok został zinterpretowany przez tę witrynę internetową po przesłaniu ... Na początku potrzebne są dwa ukośniki odwrotne. Dlatego upewnij się, że używasz System.IO.Directory.GetFiles (@ "\\. \ Pipe \").

Zauważ, że widziałem, jak to wywołanie funkcji rzucało „niedozwolone znaki w ścieżce”. wyjątek, gdy jeden z potoków na moim komputerze zawierał nieprawidłowe znaki. PipleList.exe działał jednak dobrze, więc wygląda na to, że jest to błąd w kodzie .net MS.

Vincent Lidou
źródło
1
Uwaga dotycząca „niedozwolonych znaków w ścieżce” jest ważnym punktem, ponieważ programy często otwierają nazwy potoków, które to powodują. Każdy program, który otwiera potok o nazwie jakC:\myLocation\someFile.x , spowoduje ten błąd.
dss539