Newsgroup: it.comp.appl.access
Titolo: Come leggere da vba l'Ip address macchina, scheda lan che sta usando nella rete locale?

Credo sia un problema abbastanza comune recuperare via vba l'ip del pc 
ed ottenere quello di altra scheda rete installata sul pc
Attualmente uso questo codice
----------------------------
Function GetIP() As String
     Dim IP$, DNS$, host$, X As Integer
     Dim GetComputer As String
     Dim Result%
     Dim LoBy%, HiBy%
     Dim SocketData As WinSocketDataType
 
     Result = WSAStartup(&H101, SocketData)
     If Result <> 0 Then
         MsgBox "Errore in winsock.dll", , "WINSOCK ERROR"
         End If
 
     X = 2
nt:
     IP = HostByName$(GetComputer, X)
 
     If Len(IP) = 0 And X >= 0 Then
         X = X - 1
         GoTo nt
         End If
 
     GetIP = IP
     CleanSockets
     End Function
---------------------------
Function HostByName(name$, Optional X% = 0) As String
     Dim MemIp() As Byte
     Dim Y%
     Dim HostDeAddress&, HostIp&
     Dim IpAddress$
     Dim host As HostDeType
     HostDeAddress = gethostbyname(name)
     If HostDeAddress = 0 Then
     HostByName = ""
     Exit Function
     End If
     Call RtlMoveMemory(host, HostDeAddress, LenB(host))
     For Y = 0 To X
     Call RtlMoveMemory(HostIp, host.hAddrList + 4 * Y, 4)
     If HostIp = 0 Then
     HostByName = ""
     Exit Function
     End If
     Next Y
     ReDim MemIp(1 To host.hLength)
     Call RtlMoveMemory(MemIp(1), HostIp, host.hLength)
     IpAddress = ""
     For Y = 1 To host.hLength
     IpAddress = IpAddress & MemIp(Y) & "."
     Next Y
     HostByName = Left$(IpAddress, Len(IpAddress) - 1)
     End Function
---------------------------
 
e puntualmente il 50% delle volte mi restituisce un indirizzo che non e' 
quello della scheda lan usata per collegare il pc in rete
Ad esempio, il pc e' collegato in lan con la scheda rete il cui 
indirizzo e' 192.168.1.100  e la routine sopra restituisce 192.168.244.1
Quest'ultima e' effettivamente una scheda rete che esiste nel pc, ma non 
e' quella usata per connettere il pc in lan
Quindi la domanda e':  come leggere l'indirizzo ip scheda rete in uso 
attualmente  per collegare il pc in lan?
Quel "..scheda rete in uso attualmente.." come si traduce al picci?
 

 Quel "..scheda rete in uso attualmente.." come si traduce al picci?
 
Un metodo poco elegante è lanciare il comando IPCONFIG da VBA, per esempio:
 
Private Sub cmdRete_Click()
    MsgBox CreateObject("WScript.Shell").exec("cmd /c ipconfig").StdOut.readall
End Sub
 
e poi con un po' di string matching, replace, ecc. ricavarsi l'indirizzo IP.


Eh ma c'e' lo stesso problema di prima
Coll'ipconfig appaiono tutte le schede rete presenti nel picci
E qual'e' quella buona?
Dove per 'buona' si intenda quella che in questo momento collega il pc 
col resto lan
 

 col resto lan
 
Prova prima con una RELEASE:
Private Sub cmdRete_Click() 
MsgBox CreateObject("WScript.Shell").exec("cmd /c ipconfig /release").StdOut.readall 



ma fammi capire
nel pc hai due schede di rete
a)una connessa alla lan
b)una connessa a ?
 
 
stessa subnet?
della lan non sai nulla a priori?
tipo se è almeno 192.168.1.xxx
 
un ip del gateway o del sever?
 
BFS
 
 
 
 
 
 
 


b) ed una non connessa
(ma l'indirizzo scheda rete si vede comunque)
Diversa subnet
Se sapessi a priori, non bisognerebbe 'leggerlo' il valore
 
 


non mi torna
anche io ho due schede ethernet nel PC
 
le due ethernet :
una con 192.168.1.100
e una con 192.168.0.100 senza cavo collegato...quindi sconnessa
 
l'ip config per la seconda, quella senza cavo mi restituisce
 
 
 
    Stato supporto. . . . . . . . . . . . : Supporto disconnesso
 
nella lista completa del ipconfig vedo l'ip solo di quella connessa
 
 
in ogni caso, anche se tu ne vedi due nel ip config, se una è sconnessa 
non è pingabile
potresti quindi fare un ping per scartare quelle che non rispondono
 
 
BFS
 
 
 


Prova a vedere su un pc che abbia HyperV attivo o credo anche VirtualBox
Ti ritrovi la scheda rete 'virtual' che usa l'ambiente di 
virtualizzazione, e sono entrambe (la nic fisica e la nic virtuale) 
'connesse'
E con che criterio il software prende l'una o l'altra?
 
 


mio server
ho due schede di rete usate di 4
e una macchina virtuale su hyperview e ottengo:
 
 
Configurazione IP di Windows
 
 
Scheda Ethernet Embedded LOM 1 Port 4:
 
    Stato supporto. . . . . . . . . . . . : Supporto disconnesso
    Suffisso DNS specifico per connessione:
 
Scheda Ethernet Embedded LOM 1 Port 1:
 
    Suffisso DNS specifico per connessione:
    Indirizzo IPv4. . . . . . . . . . . . : 192.168.1.7
    Subnet mask . . . . . . . . . . . . . : 255.255.255.0
    Gateway predefinito . . . . . . . . . : 192.168.1.1
 
Scheda Ethernet Embedded LOM 1 Port 2:
 
    Suffisso DNS specifico per connessione:
    Indirizzo IPv6 locale rispetto al collegamento . : xxxxxxxxxxxxx
    Indirizzo IPv4. . . . . . . . . . . . : 192.168.1.113
    Subnet mask . . . . . . . . . . . . . : 255.255.255.0
    Gateway predefinito . . . . . . . . . : 192.168.1.1
 
Scheda Ethernet Embedded LOM 1 Port 3:
 
    Stato supporto. . . . . . . . . . . . : Supporto disconnesso
    Suffisso DNS specifico per connessione:
 
Scheda Ethernet vEthernet (Generic USB-EEM Network Adapter - Virtual 
Switch):
 
    Suffisso DNS specifico per connessione:
    Indirizzo IPv6 locale rispetto al collegamento . : xxxxxxxxx
    Indirizzo IPv4. . . . . . . . . . . . : 192.168.1.198
    Subnet mask . . . . . . . . . . . . . : 255.255.255.0
    Gateway predefinito . . . . . . . . . : 192.168.1.1
 
 
 
in effetti quella usata da hyperview risulta connessa ma la distinguo 
perchè è denominata in modo diverso
 
ma non so se dipenda dal server ho la denominazione diversa
 
quindi nel mio caso saprei quali sono i due ip connessi alla rete,  il 7 
finale e il 113 finale
 
 
 
 
 


E quindi, volendo fare una routine generica che risponda con la nic che 
collega il pc alla lan, che criterio indicheresti?