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 ClassMutta 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 ModuleKiitoksia 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").HostNameMetabolix 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").HostNamelä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.