[VB08] MAC-Adresse eines PCs im Netzwerk auslesen

DrSoong

Iss was, Doc!
Grüß euch,

der Titel sagt eigentlich schon alles. Ich hab mehrere PCs im Netzwerk und für WakeOnLAN brauch ich ja die MAC der Netzwerkkarte. Da sich die PCs ab und zu ändern (Tausch wegen Defekt) will ich keine allgemeine Liste haben sondern mir ab und zu die PCs suchen und in meine Verwaltung aufnehmen.

Der Weg über die Konsole mittels getmac ist momentan der gangbare Weg für mich, irgendwie sollte es aber doch eine .NET-Alternative dazu geben. Hab schon in Netz gegraben aber nur die Konsolengeschichten gefunden.


Der Doc!
 
Hi Doc!

Würde mit VB.net wohl auch aus auslesen der Ausgabe vom arp Befehl hinauslaufen. Aber, in dem Netzwerk hast du doch sicher einen Router, oder? Hat der in seiner Verwaltungsoberfläche eine "Device List"? Dort sollten dann auch die MAC Adressen schön gelistet sein. Da der Router auch ziemlich sicher alle Rechner kennt, wäre diese Liste auch am ehesten vollständig.

lg, Alex :)
 
Stichwort ARP — dafür gibt es doch bestimmt eine VB-Lib (vorsichtig geraten) :)
 
Das Netzwerk ist unser dienstliches Netzwerk, da ist nichts mit Routern bzw. dem Zugriff drauf. Ich hab da zwar (bedingte) Admin-Rechte, d.h. ich kann, wenn möglich, die MAC-Adresse auslesen, auf diverse Listen, die Logon-Server usw. hab ich aber keinen Zugriff.

ARP hab ich ja schon als DOS-Applikation gefunden, unter VB6 hab ich auch einen Code gefunden. Den nach .NET zu portieren ist aber eine aufwändige Arbeit, daher erst die .NET-Frage.

Ich werd aber mal schauen, ob es eine ARL-Lib gibt, danke schon mal für eure Hinweise.


Der Doc!
 
So, nach langen, mühevollem Graben im Netz (ich seh aus, wie ein Ferkel ;)) hab ich etwas gefunden, das auf WMI basiert. Hab das ganze etwas gestrafft und in ein Funktion gequetscht (die zweite wird für die erste benötigt).
Visual Basic:
Public Function funcGetMAC(ByVal sPCName As String) As String
        funcGetMAC = ""
        Try
            Dim mc As New ManagementClass("win32_networkadapter")
            Dim myScope As ManagementScope

            myScope = New ManagementScope("\\" & sPCName & "\root\cimv2")

            For Each mo As ManagementObject In mc.GetInstances()

                Try
                    If mo("adaptertype").ToString() = "Ethernet 802.3" AndAlso mo("manufacturer").ToString() <> "Microsoft" Then
                        funcGetMAC = funcGetDetails("win32_networkadapterconfiguration.Index", mo("DeviceID").ToString(), sPCName)
                    End If
                Catch
                End Try
            Next mo
        Catch exc As Exception
            MessageBox.Show(exc.Message)
        End Try
End Function

Private Function funcGetDetails(ByVal WmiClause As String, ByVal Instance As String, ByVal sPCName As String) As String
        Dim mo As New ManagementObject(WmiClause & "='" & Instance & "'")
        Dim myScope As ManagementScope
        funcGetDetails = ""

        myScope = New ManagementScope("\\" & sPCName & "\root\cimv2")

        mo.Scope = myScope
        mo.Get()

        Try
            funcGetDetails = mo("macaddress").ToString()
        Catch
        End Try

End Function

Der Aufruf erfolgt über
Visual Basic:
MAC = funcGetMAC(Computername)

Wie gesagt, ist nicht mein Code, hab ihn nur gestrafft, wenn ihn jemand braucht.


Der Doc!
 
Hallo,

ich habe da noch einen Code gefunden für C#.
Dieser findet die MAC-Adresse allerdings nicht über den Computernamen, sondern über die IP. Funktioniert auch über ARP:

C#:
[DllImport("iphlpapi.dll", ExactSpelling = true)]
        public static extern int SendARP(int DestIP, int SrcIP, [Out] byte[] pMacAddr, ref int PhyAddrLen);

        /// <summary>
        /// Ermittelt die MAC Adresse eines im Netzwerk befindlichen Computers
        /// </summary>
        /// <param name="ip">Die IP des Netzwerkcomputers</param>
        /// <returns>Die MAC Adresse im string format</returns>
        private string GetMACAdress(IPAddress ip)
        {
            try
            {
                byte[] ab = new byte[6];
                int len = ab.Length;

                int r = SendARP((int)ip.Address, 0, ab, ref len);
                string mac = BitConverter.ToString(ab, 0, 6);
                
                return mac;
            }
            catch (Exception)
            {
                return "MAC not available";
            }
        }

Quelle: http://dotnet-snippets.de/dns/c-mac...computers-mithilfe-der-ip-adresse-SID905.aspx

allerdings lässt sich wie schon vorher gegeben auch natürlich über den Computernamen die IP-Adresse herausfinden:

C#:
String DnsName;
                DnsName = ###Computername###
                System.Net.IPHostEntry IHE = System.Net.Dns.Resolve(DnsName);
                string[] IP = new string[IHE.AddressList.Length];
                for (int i = 0; i < IHE.AddressList.Length; i++)
                    IP[i] = IHE.AddressList[i].ToString();

Quelle: http://www.mycsharp.de/wbb2/thread.php?threadid=66986

auch wenn du schon eine Lösung hast wollte ich diesen nochmal mit anbieten. (der in C# statt VB ist)

Gruß

Sebastian
 
Zuletzt bearbeitet:
Zurück