none
Pegar todos os ips de uma rede c# RRS feed

  • Pergunta

  • Estou fazendo uma aplicação que pega todos os ip`s das maquinas do laboratório da faculdade que trabalho.

    Estou usando a biblioteca System.Net, porém a aplicação só esta trazendo o ip que esta rodando a aplicação.

    Gostaria de saber como poderia pegar todos os ip`s dos computadores do laboratório que esta em rede.

    Código:

     string nomeComputadorDestino = Dns.GetHostName();
    IPAddress[] ip = Dns.GetHostAddresses(nomeComputadorDestino);
    
    ip[].ToString();



    Programdor .Net iniciante.

    domingo, 20 de novembro de 2016 22:49

Respostas

  • Ola, consegui pegar os ip´s das maquinas como eu queria.

    Usei o comando ARP -a e fiz o que esta no link que o J. Maurício passou e usei expressões regulares para extrair somente os ip´s do retorno do comando ARP -r.

    Obrigado pela ajuda J. Maurício.

    quinta-feira, 24 de novembro de 2016 17:37

Todas as Respostas

  • O método Dns.GetHostName() só pega o nome de host do computador local e não de todos da sua rede. 

    Você terá que ter o nome de todos os host da rede para conseguir os IPs dessa forma.

    • Editado J. Maurício domingo, 20 de novembro de 2016 23:59
    domingo, 20 de novembro de 2016 23:36
  • Sim isso eu já entendi. Mas como eu poderia pegar todos os ip´s da rede.

    Programdor .Net iniciante.

    segunda-feira, 21 de novembro de 2016 10:08
  • Sem ter acesso ao servidor DHCP ou roteador / switch, fica difícil você conseguir essa informação. Você não conseguirá isso através de apenas um comando. Por exemplo o comando "arp -a" lista todos os IPs e MACs que seu computador teve "contato" dentro de domínio de broadcast. Mesmo assim, não é garantido que todos aparecerão na lista, apenas aqueles com o qual seu próprio computador já se comunicou previamente.

    Resumindo..

    - você precisa de todos os Hostnames para usar algum serviço para resolver os nomes em IPs.

    - ou, você conhece o bloco de IPs válidos da sua rede e tenta na força bruta, testando PING para cada IP possível, encontrar os host ativos na sua rede.


    segunda-feira, 21 de novembro de 2016 10:35
  • Pois é me disseram pra mim usar esse comando arp -a e fazer um loop com o retorno dele. No meu caso a maquina já tiveram "contato" com todos os outros computadores pois é um lab de informatica da facul trabalho.

    Voce poderia me dizer como eu poderia  fazer atraves do loop pegar todos os ip´s listados?


    Programdor .Net iniciante.

    segunda-feira, 21 de novembro de 2016 16:06
  • Não tenho como programar em C# no momento. Você pode usar este link para se basear na lógica.

    http://pt.stackoverflow.com/questions/67992/executar-comandos-do-prompt-do-windows-e-guardar-a-sa%C3%ADda-num-arquivo-de-texto

    • Sugerido como Resposta J. Maurício quinta-feira, 24 de novembro de 2016 17:53
    segunda-feira, 21 de novembro de 2016 17:42
  • Fiz um exemplo em VBScript. Vai gravar os IPs que estão na tabela arp de sua estação.

    Eu presumo a gravação no txt que será criado em C:\Teste\

    Na linha:

    posiCFound = Instr(strText, "192.168")   

    Você deve colocar o ID da sua rede, mo meu caso é o 192.168

    On Error Resume Next
    
    strInputFile = "C:\teste\IPs.txt"
    
    Set objShell = WScript.CreateObject("WScript.Shell")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    Set objInputFile = objFSO.CreateTextFile(strInputFile, True)
    
    
    Set objExecObject = objShell.Exec("cmd /c arp -a")
    
    Do While Not objExecObject.StdOut.AtEndOfStream
        strText = objExecObject.StdOut.ReadLine()
        posiCFound = Instr(strText, "192.168")   
    
        If  posiCFound > 0 Then
            strText = Trim(Mid(strText,posiCFound,13))
    	objInputFile.WriteLine strText
        End If
    Loop
    
    objInputFile.Close
    Set objInputFile = Nothing

    O primeiro IP que será gravado é o de sua própria estacão, o último é o de broadcast.

    • Editado J. Maurício segunda-feira, 21 de novembro de 2016 19:15
    segunda-feira, 21 de novembro de 2016 19:11
  • Ola, consegui pegar os ip´s das maquinas como eu queria.

    Usei o comando ARP -a e fiz o que esta no link que o J. Maurício passou e usei expressões regulares para extrair somente os ip´s do retorno do comando ARP -r.

    Obrigado pela ajuda J. Maurício.

    quinta-feira, 24 de novembro de 2016 17:37
  • Foi um prazer ajudar. Se possível, poste o código para agregar conhecimento.
    • Editado J. Maurício quinta-feira, 24 de novembro de 2016 17:41
    quinta-feira, 24 de novembro de 2016 17:40
  • Fico meio envergonhado de postar meu códigos... hehehe... Mas aí esta

    public class ObterIp
        { 
            private static List<string> listaIps = new List<string>();
    
            public static List<string> ListaIps ()
            {
                Process processo = new Process();
    
                processo.StartInfo.FileName = Environment.GetEnvironmentVariable("comspec");
    
                // Formata a string para passar como argumento para o cmd.exe
                processo.StartInfo.Arguments = string.Format("/c arp -a");
    
                processo.StartInfo.RedirectStandardOutput = true;
                processo.StartInfo.UseShellExecute = false;
                processo.StartInfo.CreateNoWindow = true;
    
                processo.Start();
                processo.WaitForExit();
                
    
                string saida = processo.StandardOutput.ReadToEnd();            
                string pattern = @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}";
    
                MatchCollection matches;
                Regex r = new Regex(pattern);
                matches = r.Matches(saida);           
    
                foreach (Match match in matches)
                {
                    listaIps.Add(match.ToString());                
                }
                return listaIps;
            }
        }   
    Depois que terminar a aplicação e estiver funcionando posto o link do repositório do código.


    Programdor .Net iniciante.

    sexta-feira, 25 de novembro de 2016 19:38