Comment puis-je obtenir une liste de tous les canaux nommés ouverts dans Windows?

86

Existe-t-il un moyen simple de tester si votre tube nommé fonctionne correctement? Je veux m'assurer que les données que j'envoie depuis mon application sont effectivement envoyées. Existe-t-il un moyen rapide et facile d'obtenir une liste de tous les tubes nommés?

Doug T.
la source

Réponses:

95

Vous pouvez les afficher avec Process Explorer à partir de sysinternals. Utilisez l'option "Rechercher -> Rechercher un descripteur ou une DLL ..." et entrez le modèle "\ Device \ NamedPipe \". Il vous montrera quels processus ont quels tuyaux ouverts.

Rob Walker
la source
Vérifiez la version de Process Explorer dont vous disposez avant d'essayer cela. Cela ne fonctionne pas sur la v15.23, mais sur la v16.02. (Je n'ai pas essayé d'autres versions)
Carl
2
Pour éviter d'éventuelles exceptions - comme cela est mentionné dans d'autres réponses - vous pouvez utiliser ma solution qui est plus bas niveau mais fonctionne comme un charme même si le nom du tube nommé contient des caractères invalides en guise de nom de fichier. Veuillez consulter stackoverflow.com/questions/25109491/…
user2126375
2
L'utilisation pipelist.exede SysInternals est encore plus simple, mais c'est uniquement en ligne de commande.
Chris Charabaruk
79

Dans la console Windows Powershell, saisissez

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

Si la version de votre système d'exploitation est supérieure à Windows 7, vous pouvez également taper
get-childitem \\.\pipe\

Cela renvoie une liste d'objets. Si vous voulez uniquement le nom:

(get-childitem \\.\pipe\).FullName
Andrew Shepherd
la source
3
Vous voudrez peut-être envisager d'ouvrir Powershell en tant qu'administrateur
dotNetE
2
Vous pouvez également utiliser get-childitem \\. \ Pipe \
Chris Gillum
@ChrisGillum J'ai essayé cela, et j'ai obtenu une erreur "Impossible de trouver le chemin '\\. \ Pipe \' car il n'existe pas"
Andrew Shepherd
1
@AndrewShepherd Intéressant. Sur quel OS utilisez-vous? Cela fonctionne pour moi sur Windows Server 2012 et Windows 10 (PowerShell v3 et v5 respectivement).
Chris Gillum
1
@ChrisGillum Mais je viens de l'essayer sur mon appareil Windows Surface RT. Cela fonctionne là-bas. (Powershell v4). Je vais intégrer votre commentaire dans la réponse.
Andrew Shepherd
57

Essayez plutôt ce qui suit:

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
Vincent Lidou
la source
6
votre manque une barre oblique. string [] listOfPipes = System.IO.Directory.GetFiles (@ "\\. \ pipe \");
dmex
J'ai passé toute la nuit à chercher une fonction pour rechercher ou lister les tubes. C'est exactement ce dont j'avais besoin. Merci!!
swax
Quel est ce chemin spécial? \\. \ semble être utilisé pour l'accès brut à un lecteur, mais d'où pipevient-il?
Kevin Doyon
2
@Kevin "\\. \" Signifie "cette machine" selon msdn.microsoft.com/en-US/en-en/library/windows/desktop/…
Eugene Ryabtsev
5
Nous avons eu des problèmes avec cette méthode fonctionnant sous Windows 10 - obtenant l'erreur "Le deuxième fragment de chemin ne doit pas être un lecteur ou un nom UNC. Nom du paramètre: chemin2"
Dai Bok
44

Utilisez pipelist.exe de Sysinternals.

Geai
la source
1
Voir aussi handle.exe de sysinternals qui affichera presque toutes les choses qui ont un handle ouvert.
JimR
19

Je suis tombé sur une fonctionnalité de Chrome qui répertorie tous les tubes nommés ouverts en accédant à "file: //.//pipe//"

Comme je n'arrive pas à trouver de référence à cela et que cela m'a été très utile, j'ai pensé que je pourrais partager.

Daynew
la source
Pouvez-vous expliquer un peu plus?
Dieter Meemken
Cela répertorie mes tuyaux. Incroyable! (notez que cela fonctionnera car il fonctionne comme un répertoire, comme le montre la réponse d'Andrew Shepherd)
Martín Coll
Je suppose que c'est pour le débogage / diagnostic, car j'ai remarqué que Chrome utilise beaucoup de tuyaux nommés - j'ai trouvé 125 tuyaux "chrome" même lorsque Chrome ne fonctionne pas!
Cocowalla le
16

C #:

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
Omar Elsherif
la source
8

À l' CMDinvite:

>ver

Microsoft Windows [Version 10.0.18362.476]

>dir \\.\pipe\\
Constantin Konstantinidis
la source
Fonctionne sur W10 mais pas sur W7
coupe
7

Le deuxième tube a été interprété par ce site Web lors de sa soumission ... Vous avez besoin de deux barres obliques inverses au début. Assurez-vous donc d'utiliser System.IO.Directory.GetFiles (@ "\\. \ Pipe \").

Notez que j'ai vu cet appel de fonction lancer un «caractères illégaux dans le chemin». exception lorsque l'un des tuyaux de ma machine avait des caractères non valides. PipleList.exe fonctionnait bien, donc cela semble être un bogue dans le code .net de MS.

Vincent Lidou
la source
1
La note sur les «caractères illégaux dans le chemin» est un point important, car il est très courant que les programmes ouvrent des noms de canaux qui déclenchent cela. Tout programme qui ouvre un tube nommé comme C:\myLocation\someFile.xprovoquera cette erreur.
dss539