2010-11-03 34 views
5

Hey les gars, J'ai cherché sur le web pour une solution, mais je n'ai rien trouvé! : (Obtenez une adresse MAC à distance via IPv6

Est-il possible d'obtenir le MAC à partir d'un autre PC dans le même réseau via IPv6 (sans WMI)? Avec IPv4 c'est facile (ARP) IPv6 utilise le "Neighbor Discovery Protocol" (NDP) obtenir l'adresse MAC. y a-t-il des méthodes .Net pour cela?

toutes les suggestions? Merci pour votre aide!

Cordialement

Fabian

+0

Quel est le point de l'étiquette OSX ici? la question et et la réponse acceptée semblent complètement hors de propos pour OSX ... – ivan

Répondre

3

Vous pouvez exécuter la commande externe « ne tsh int ipv6 show neigh ", et filtrez l'hôte qui vous intéresse. Vous devriez l'avoir contacté juste avant cela, donc vous savez que c'est dans la NC.

Si vous voulez une API pour cela, utilisez GetIpNetTable2 ou, plus directement, ResolveIpNetEntry2. Je doute qu'il existe une API .NET pour cela, donc vous devrez utiliser PInvoke.

+0

Merci. Je pense que cela devrait résoudre mon problème. Je l'ai essayé, mais ce n'est pas simple de le faire fonctionner en 5 minutes;). Si j'ai un résultat, je contacte à nouveau – Fabian

2

La réponse de Martin était pour Windows, mais c'est pour si vous êtes sur un GNU/Linux ou un autre * nix box.

Vous voulez utiliser la fonction neigh de la commande ip pour montrer voisins IPv6, comme ceci:

$ ip -6 neigh 
fe80::200:ff:fe00:0 dev eth0 lladdr 00:0e:54:24:23:21 router REACHABLE 
fe80::202:b0ff:fe01:2abe dev eth0 lladdr 00:02:b0:02:2a:be DELAY 

(astuce Pro: vous pouvez laisser le -6 off et voir ARP IPv4 ainsi que ND IPv6 la même liste.)

en outre, si vous voulez connaître les adresses MAC de tous les machines IPv6 sur le réseau local, et non seulement ceux que vous connaissez déjà, vous devez les ping, puis regarder pour ne ighbours:

$ ping6 ff02::1%eth0 
64 bytes from fe80::221:84ff:fe42:86ef: icmp_seq=1 ttl=64 time=0.053 ms # <-- you 
64 bytes from fe80::200:ff:fe00:0: icmp_seq=1 ttl=64 time=2.37 ms (DUP!) 
64 bytes from fe80::202:b0ff:fe01:2abe: icmp_seq=1 ttl=64 time=2.38 ms (DUP!) 
64 bytes from fe80::215:abff:fe63:f6fa: icmp_seq=1 ttl=64 time=2.66 ms (DUP!) 

$ ip -6 neigh 
fe80::200:ff:fe00:0 dev eth0 lladdr 00:0e:54:24:23:21 router REACHABLE 
fe80::202:b0ff:fe01:2abe dev eth0 lladdr 00:02:b0:02:2a:be DELAY 
fe80::215:abff:fe63:f6fa dev eth0 lladdr 00:02:15:ab:f6:fa DELAY # <-- a new one! 
+0

Merci beaucoup pour votre réponse. Bien qu'elle ne corresponde pas complètement, parce que je travaille en C# et .Net. Mais elle m'a aidé, néanmoins. – Fabian

-1

Voici mon code:

public static string netsh(String IPv6) 
     { 
      Process p = new Process(); 
      p.StartInfo.FileName = "netsh.exe"; 
      String command = "int ipv6 show neigh"; 
      Console.WriteLine(command); 
      p.StartInfo.Arguments = command; 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.RedirectStandardOutput = true; 
      p.Start(); 

      String output = "go"; 
      while (output!=null){ 
      try 
      { 
       output = p.StandardOutput.ReadLine(); 
      } 
      catch (Exception) 
      { 
       output = null; 
      } 
      if (output.Contains(IPv6)) 
      { 
       // Nimmt die Zeile in der sich die IPv6 Addresse und die MAC Addresse des Clients befindet 
       // Löscht den IPv6 Eintrag, entfernt alle Leerzeichen und kürzt den String auf 17 Zeichen, So erschein die MacAddresse im Format "33-33-ff-0d-57-00" 

       output = output.Replace(IPv6, "").Replace(" ", "").TrimToMaxLength(17) ; 
       return output; 
      } 
      } 
      return null; 

     } 
+0

Pourquoi la downvote? –

+0

Je soupçonne le vote négatif parce que c'est un code d'analyse très fragile. Si l'argument IPv6 est dans un cas différent de la sortie netsh, il échouera. Si l'argument IPv6 est parfaitement légal et correct, mais fait un choix différent sur les champs zéro ou réducteur zéro, alors il échouera. Si l'argument IPv6 est un sous-ensemble de ce qui arrive sur une ligne, il donnera une fausse correspondance positive. –

0

La réponse serait par @ Alex mieux si le code d'analyse syntaxique de la ligne ont été améliorés. Voici une façon:

public static string netsh(String IPv6) 
{ 
    IPAddress wanted; 
    if (!IPAddress.TryParse(IPv6, out wanted)) 
     throw new ArgumentException("Can't parse as an IPAddress", "IPv6"); 

    Regex re = new Regex("^([0-9A-F]\S+)\s+(\S+)\s+(\S+)", RegexOptions.IgnoreCase); 

    // ... the code that runs netsh and gathers the output. 

     Match m = re.Match(output); 
     if (m.Success) 
     { 
      // [0] is the entire line 
      // [1] is the IP Address string 
      // [2] is the MAC Address string 
      // [3] is the status (Permanent, Stale, ...) 
      // 
      IPAddress found; 
      if (IPAddress.TryParse(m.Groups[1].Value, out found)) 
      { 
       if(wanted.Equals(found)) 
       { 
         return m.Groups[2].Value; 
       } 
      } 
     } 

    // ... the code that finishes the loop on netsh output and returns failure 
}