Moi Kaikille.
Täällä taas lähes kolmen vuoden jälkeen....
Eli kuten otsikkokin kertoo, pitäs saada listattua lähiverkon koneiden nimet ja ipv4 osoitteet.
Yritin lähestyä hommaa näin...
Imports System.Net Imports System.Net.NetworkInformation Public Class Form1 Public Sub getinterfaces() Dim nics As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces() If nics.Length < 0 Or nics Is Nothing Then MsgBox("no network interfaces found") Exit Sub End If ListView1.Items.Clear() For Each netadapter As NetworkInterface In nics Dim intproperties As IPInterfaceProperties = netadapter.GetIPProperties() ListView1.Items.Add(netadapter.Name) Dim paddress As PhysicalAddress = netadapter.GetPhysicalAddress() Dim addbyte As Byte() = paddress.GetAddressBytes() Dim macaddress As String = "" For i = 0 To addbyte.Length - 1 macaddress &= addbyte(i).ToString("X2") If i <> addbyte.Length - 1 Then macaddress &= "-" End If Next Dim icount As Integer = ListView1.Items.Count Try With ListView1.Items(icount - 1).SubItems .Add(macaddress) .Add(intproperties.UnicastAddresses(2).Address.ToString) .Add(intproperties.UnicastAddresses(2).IPv4Mask.ToString) .Add(intproperties.UnicastAddresses(0).Address.ToString) .Add(intproperties.UnicastAddresses(1).Address.ToString) End With Catch ex As Exception End Try ListView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent) Next End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click getinterfaces() End Sub End Class
Mutta tuo ei anna koneen nimiä vaan - LOCAL AREA CONNECTIONS * 9
Ja IP osoitteet on jotain hex numeroita - 00-00-00-00-00-00-00-E0
Voisko joku kokeilla tuota koodia ja kertoa toimiiko se vai onko ongelma mun LAN-päätteessä.
Tai jos jollakulla on parempi ratkaisu tän toteutukseen niin sekin käy.
Happy.
Villi veikkaus, että gePhysicalAddress on MAC-osoite.
Verkoin koneiden nimien tietäminen on hieman hankalaa. Jotain voisit pyytää järjestelmästä ARP taulusta, mutta se ei ole ehkä näppärää.
Helpointa lienee katsoa IP-osoitetta esimerkiksi 192.168.1.124/24 Eli netmaski olisi 255.255.255.0 sitten vain kysellä koneiden nimet. Esimerkissä kaikki 254 osoitetta ja vaikka yrittää ottaa yhteyttä niihin. Tai jotain. socket ja siihen liittyvät rajapinnat voivat olla sinua kiinnostavia gethostbyaddress vai mikäs se nyt olikaan.
Pahoittelen. En tiedä VB:stä tuon taivaallista.
Tälläinen pätkä tuli vastaan:
Imports System.Net.NetworkInformation Imports System.Threading Module Module1 Private pingers As New List(Of Ping) Private instances As Integer = 0 Private lock As New Object Private result As Integer = 0 Private timeOut As Integer = 250 Private ttl As Integer = 5 Sub Main() Dim baseIP As String = "192.168.1." Dim classD As Integer = 1 Console.WriteLine("Pinging 255 destinations of D-class in {0}*", baseIP) CreatePingers(255) Dim po As New PingOptions(ttl, True) Dim enc As New System.Text.ASCIIEncoding Dim data As Byte() = enc.GetBytes("abababababababababababababababab") Dim wait As New SpinWait Dim cnt As Integer = 1 Dim watch As Stopwatch = Stopwatch.StartNew For Each p As Ping In pingers SyncLock lock instances += 1 End SyncLock p.SendAsync(String.Concat(baseIP, cnt.ToString()), timeOut, data, po) cnt += 1 Next Do While instances > 0 wait.SpinOnce() Loop watch.Stop() DestroyPingers() Console.WriteLine("Finished in {0}. Found {1} active IP-addresses.", watch.Elapsed.ToString(), result) Console.ReadKey() End Sub Sub Ping_completed(s As Object, e As PingCompletedEventArgs) SyncLock lock instances -= 1 End SyncLock If e.Reply.Status = IPStatus.Success Then Console.WriteLine(String.Concat("Active IP: ", e.Reply.Address.ToString())) result += 1 Else 'Console.WriteLine(String.Concat("Non-active IP: ", e.Reply.Address.ToString())) End If End Sub Private Sub CreatePingers(cnt As Integer) For i As Integer = 1 To cnt Dim p As New Ping AddHandler p.PingCompleted, AddressOf Ping_completed pingers.Add(p) Next End Sub Private Sub DestroyPingers() For Each p As Ping In pingers RemoveHandler p.PingCompleted, AddressOf Ping_completed p.Dispose() Next pingers.Clear() End Sub End Module
Kiitoksia groovyb!!!!
Toimii.... Ainakin noitten ip-osoitteiden hakemiseen, mutta kun vielä saisi sen koneen nimen niin sitten se olisi täydellinen....
Luin kyllä jostain että .NET:llä ei ole mahdollista hakea verkon koneiden nimiä jonkun "vakoilu" mahdollisuuden takia.... Tiedäppä nyt siitä sitten???
Happy.
”Koneen nimi” ei ole mikään yksiselitteinen asia. Jos kone ei itse kerro nimeään, et voi mitenkään hakea sitä. Riippuu verkostasi, millaisia vaihtoehtoja nimen hakemiseen on. Jos verkossasi on sopiva DNS-palvelin, saat jonkinlaisen nimen funktiolla System.Net.Dns.GetHostEntry. Netissä vihjattiin, että funktio saattaa onnistua hakemaan myös NetBIOS-nimen, jos DNS-haku ei tärppää.
nimi = System.Net.Dns.GetHostEntry("192.168.0.1").HostName
Metabolix kirjoitti:
”Koneen nimi” ei ole mikään yksiselitteinen asia.... Riippuu verkostasi, millaisia vaihtoehtoja nimen hakemiseen on.
nimi = System.Net.Dns.GetHostEntry("192.168.0.1").HostName
Kyllähän se näin menee... Onnistuin saamaan tuolla...
nimi = System.Net.Dns.GetHostEntry("XXX.XXX.XXX.XXX").HostName
lähiverkon "koneiden nimet". Toki se antaa myös reitittemen nimen siihen lisäksi...
Eli, jos mun koneen nimi on "Happy-PC", niin mulla tuo antaa koneen nimeksi "FritZ!BoxHappy-PC".
Mutta kyllähän se noinki toimii... :D
Kiitoksia Metabolix!
Ja sitten leuka rinnassa kohti uusia haasteita.... :(
Happy.
Aihe on jo aika vanha, joten et voi enää vastata siihen.