Como posso obter uma lista de todos os canais nomeados abertos no Windows?

86

Existe uma maneira fácil de testar se o pipe nomeado está funcionando corretamente? Quero ter certeza de que os dados que estou enviando do meu aplicativo estão realmente sendo enviados. Existe uma maneira rápida e fácil de obter uma lista de todos os tubos nomeados?

Doug T.
fonte

Respostas:

95

Você pode visualizá-los com o Process Explorer em sysinternals. Use a opção "Find -> Find Handle ou DLL ..." e insira o padrão "\ Device \ NamedPipe \". Ele mostrará quais processos têm quais canais abertos.

Rob Walker
fonte
Verifique qual versão do Process Explorer você possui antes de tentar isso. Não funciona na v15.23, mas funciona na v16.02. (não tentei outras versões)
Carl
2
Para evitar possíveis exceções - como é mencionado em outras respostas - você pode usar minha solução, que é de nível mais baixo, mas funciona perfeitamente mesmo se o nome do pipe nomeado contiver caracteres inválidos no nome do arquivo. Consulte stackoverflow.com/questions/25109491/…
user2126375
2
Usar pipelist.exedo SysInternals é ainda mais simples, mas é apenas linha de comando.
Chris Charabaruk
79

No console do Windows Powershell, digite

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

Se a versão do seu sistema operacional for superior ao Windows 7, você também pode digitar
get-childitem \\.\pipe\

Isso retorna uma lista de objetos. Se você quiser apenas o nome:

(get-childitem \\.\pipe\).FullName
Andrew Shepherd
fonte
3
Você pode querer considerar a abertura do Powershell como um administrador
dotNetE
2
Você também pode usar get-childitem \\. \ Pipe \
Chris Gillum
@ChrisGillum Tentei isso e recebi um erro "Não é possível encontrar o caminho '\\. \ Pipe \' porque ele não existe"
Andrew Shepherd
1
@AndrewShepherd Interessante. Qual sistema operacional você está usando? Ele funciona para mim no Windows Server 2012 e no Windows 10 (PowerShell v3 e v5 respectivamente).
Chris Gillum
1
@ChrisGillum Mas acabei de experimentar no meu dispositivo Windows Surface RT. Funciona lá. (PowerShell v4). Vou incorporar seu comentário na resposta.
Andrew Shepherd
57

Tente o seguinte:

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
Vincent Lidou
fonte
6
está faltando uma barra. string [] listOfPipes = System.IO.Directory.GetFiles (@ "\\. \ pipe \");
dmex
Passei a noite toda procurando uma função para pesquisar ou listar tubos. Isso é exatamente o que eu precisava. Obrigado!!
swax
Qual é esse caminho especial? \\. \ parece ser usado para acesso bruto a uma unidade, mas de onde pipevem?
Kevin Doyon
2
@Kevin "\\. \" Significa "esta máquina" conforme msdn.microsoft.com/en-US/en-en/library/windows/desktop/…
Eugene Ryabtsev
5
Tivemos problemas com esse método no Windows 10 - obtendo o erro "O segundo fragmento de caminho não deve ser uma unidade ou nome UNC. Nome do parâmetro: caminho2"
Dai Bok
44

Use pipelist.exe da Sysinternals.

Jay
fonte
1
Consulte também handle.exe de sysinternals, que mostra quase todas as coisas que têm um identificador aberto.
JimR
19

Eu me deparei com um recurso no Chrome que lista todos os canais nomeados abertos navegando até "file: //.//pipe//"

Como não consigo encontrar nenhuma referência a isso e isso tem sido muito útil para mim, pensei em compartilhar.

Daynew
fonte
Você pode explicar um pouco mais?
Dieter Meemken
Isso lista meus cachimbos. Surpreendente! (note que isso funcionará porque funciona como um diretório, como mostra a resposta de Andrew Shepherd)
Martín Coll
Eu acho que isso é para depuração / diagnóstico, já que percebi que o Chrome usa muitos pipes nomeados - encontrei 125 pipes "cromados" mesmo quando o Chrome não estava funcionando!
Cocowalla
16

C #:

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

No CMDprompt:

>ver

Microsoft Windows [Version 10.0.18362.476]

>dir \\.\pipe\\
Constantin Konstantinidis
fonte
Funciona em S10, mas não em S7
copa de
7

O segundo tubo foi interpretado por este site quando enviado ... Você precisa de duas barras invertidas no início. Portanto, certifique-se de usar System.IO.Directory.GetFiles (@ "\\. \ Pipe \").

Observe que eu vi essa chamada de função lançar um 'caractere ilegal no caminho'. exceção quando um dos tubos em minha máquina tinha caracteres inválidos. PipleList.exe funcionou bem, então parece um bug no código .net da MS.

Vincent Lidou
fonte
1
A observação sobre 'caracteres ilegais no caminho' é um ponto importante, porque é muito comum que os programas abram nomes de pipe que acionam isso. Qualquer programa que abra um pipe nomeado como C:\myLocation\someFile.xcausará esse erro.
DS539