2009-05-06 8 views
9

Quelle est la méthode la moins encombrante (module-inclusion, longueur de code, etc.) pour récupérer l'adresse IP de la machine (de la première interface ouverte)? Je connais certaines solutions utilisant MSINET, mais je crois que nous pouvons faire mieux. Ne répondez pasComment récupérer l'adresse IP de cet ordinateur?

Function HomeIP() as Atring 
HomeIP= "127.0.0.1" 
End Function 

parce que c'est pas drôle ... ou corriger. Le scénario est une question avec un document ID feature J'essaye de créer une réponse pour.

+0

Je pensais que l'adresse IP peut faire partie des variables d'environnement et être obtenues à l'aide Environ ([index ou nom]), mais malheureusement ce n'est pas –

+0

Voir: [Recherche les correspondances IP et résoudre les adresses] (http : //www.mvps.org/access/api/api0067.htm) –

Répondre

18

Voici un exemple adapté de Technet:

Function GetIPAddress() 
    Const strComputer As String = "." ' Computer name. Dot means local computer 
    Dim objWMIService, IPConfigSet, IPConfig, IPAddress, i 
    Dim strIPAddress As String 

    ' Connect to the WMI service 
    Set objWMIService = GetObject("winmgmts:" _ 
     & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 

    ' Get all TCP/IP-enabled network adapters 
    Set IPConfigSet = objWMIService.ExecQuery _ 
     ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE") 

    ' Get all IP addresses associated with these adapters 
    For Each IPConfig In IPConfigSet 
     IPAddress = IPConfig.IPAddress 
     If Not IsNull(IPAddress) Then 
      strIPAddress = strIPAddress & Join(IPAddress, ", ") 
     End If 
    Next 

    GetIPAddress = strIPAddress 
End Function 

Vous devez disposer de Microsoft WMI Scripting Library dans les références du projet.

+0

Bien fait! Très compact, bien qu'un extrait de code vraiment "en écriture seule" ... J'étudierai la librairie WMI pour les 2 prochains mois, juste pour avoir une idée de ce qui se fait ici. BTW, bienvenue à SO. – jpinto3912

+0

Pas de magie profonde ici en fait. :) J'ai ajouté des commentaires pour expliquer ce qui se passe. – Helen

+0

FYI, WMI signifie Windows Management Intstumentation; C'est un composant Windows qui permet d'effectuer de nombreuses tâches de gestion matérielle, logicielle et réseau. Liens utiles dont voici quelques: Script Sesame: WMI Query Language (celui-ci est amusant :) http://www.microsoft.com/technet/scriptcenter/resources/begin/ss1206.mspx script WMI Primaire: http://www.microsoft.com/technet/scriptcenter/guide/sas_wmi_overview.mspx Référence WMI @ MSDN: http://msdn.microsoft.com/fr-fr/library/aa394582.aspx – Helen

1

Vous pouvez exécuter la commande shell ipconfig et analyser les résultats renvoyés?

+0

Nous pourrions rediriger la sortie cmd vers un txt ... mais essayez ipconfig sur win2000, xp et vista et vous verrez pourquoi c'est un gros désordre non non. – jpinto3912

+0

Je ne sais pas pourquoi c'est si compliqué? Pourriez-vous élaborer? – sybreon

+0

Le jeton requis n'apparaît pas toujours au même endroit et n'est pas entouré des mêmes mots.Un dernier tueur est que les paramètres régionaux modifient le libellé entourant le jeton de champ IP. Pour gérer cela, même à travers regex, serait loin d'être trivial. – jpinto3912

2

Quelques exemples que je trouve: -

http://www.everythingaccess.com/tutorials.asp?ID=Get-all-IP-Addresses-of-your-machine

http://puremis.net/excel/code/079.shtml

EDIT

Voici le code de la première liaison avec une légère modification

Option Explicit 

' VBA MODULE: Get all IP Addresses of your machine 
' (c) 2005 Wayne Phillips (http://www.everythingaccess.com) 
' Written 18/05/2005 
' 
' REQUIREMENTS: Windows 98 or above, Access 97 and above 
' 
' Please read the full tutorial here: 
' http://www.everythingaccess.com/tutorials.asp?ID=Get-all-IP-Addresses-of-your-machine 
' 
' Please leave the copyright notices in place. 
' Thank you. 
' 
'Option Compare Database 

'A couple of API functions we need in order to query the IP addresses in this machine 
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 
Public Declare Function GetIpAddrTable Lib "Iphlpapi" (pIPAdrTable As Byte, pdwSize As Long, ByVal Sort As Long) As Long 

'The structures returned by the API call GetIpAddrTable... 
Type IPINFO 
    dwAddr As Long   ' IP address 
    dwIndex As Long   ' interface index 
    dwMask As Long   ' subnet mask 
    dwBCastAddr As Long  ' broadcast address 
    dwReasmSize As Long ' assembly size 
    Reserved1 As Integer 
    Reserved2 As Integer 
End Type 

Public Function ConvertIPAddressToString(longAddr As Long) As String 

    Dim IPBytes(3) As Byte 
    Dim lngCount As Long 

    'Converts a long IP Address to a string formatted 255.255.255.255 
    'Note: Could use inet_ntoa instead 

    CopyMemory IPBytes(0), longAddr, 4 ' IP Address is stored in four bytes (255.255.255.255) 

    'Convert the 4 byte values to a formatted string 
    While lngCount < 4 

     ConvertIPAddressToString = ConvertIPAddressToString + _ 
            CStr(IPBytes(lngCount)) + _ 
            IIf(lngCount < 3, ".", "") 

     lngCount = lngCount + 1 

    Wend 

End Function 

Public Function GetFirstNonLocalIPAddress() 

    Dim Ret As Long, Tel As Long 
    Dim bytBuffer() As Byte 
    Dim IPTableRow As IPINFO 
    Dim lngCount As Long 
    Dim lngBufferRequired As Long 
    Dim lngStructSize As Long 
    Dim lngNumIPAddresses As Long 
    Dim strIPAddress As String 

On Error GoTo ErrorHandler: 

    Call GetIpAddrTable(ByVal 0&, lngBufferRequired, 1) 

    If lngBufferRequired > 0 Then 

     ReDim bytBuffer(0 To lngBufferRequired - 1) As Byte 

     If GetIpAddrTable(bytBuffer(0), lngBufferRequired, 1) = 0 Then 

      'We've successfully obtained the IP Address details... 

      'How big is each structure row?... 
      lngStructSize = LenB(IPTableRow) 

      'First 4 bytes is a long indicating the number of entries in the table 
      CopyMemory lngNumIPAddresses, bytBuffer(0), 4 

      While lngCount < lngNumIPAddresses 

       'bytBuffer contains the IPINFO structures (after initial 4 byte long) 
       CopyMemory IPTableRow, _ 
          bytBuffer(4 + (lngCount * lngStructSize)), _ 
          lngStructSize 

       strIPAddress = ConvertIPAddressToString(IPTableRow.dwAddr) 

       If Not ((strIPAddress = "127.0.0.1")) Then 

        GetFirstNonLocalIPAddress = strIPAddress 
        Exit Function 

       End If 

       lngCount = lngCount + 1 

      Wend 

     End If 

    End If 

Exit Function 

ErrorHandler: 
    MsgBox "An error has occured in GetIPAddresses():" & vbCrLf & vbCrLf & _ 
      Err.Description & " (" & CStr(Err.Number) & ")" 

End Function 
+0

hmmm .. Je vais essayer, skrink jusqu'à ce que je ne puisse plus comprendre le code, et si cela fonctionne encore, vous l'avez . – jpinto3912

+0

Le premier code de lien est bon (le second ne peut pas être, a besoin de son propre nom de PC). C'est compact, non dépendant de l'extérieur, et je pense que l'API ne changera pas. Je demande que vous copiez-collez ce code ici, gardez l'avis de copyright, mais modifions le Sub pour qu'il soit une Fonction w/no args (signifiant toujours le filtre 127.0.0.1) retournant la chaîne. Je vais le corriger. Merci, et bien fait! – jpinto3912

+0

merci beaucoup - J'ai fait le montage que vous avez demandé. désolé pour le formatage - stackoverflow ne semble pas être très sympathique VBA ;-) –

0

nbtstat -n peut faire le travail sur XP de toute façon. Vous n'êtes pas sûr des autres versions de Windows ou de la localisation dans d'autres langues. sortie partielle de l'échantillon:

C: \ Documents and Settings \ colin> nbtstat -n

Local Area Connection: Adresse IP du noeud: [192.168.1.100] Champ d'application Id: []

  NetBIOS Local Name Table 

etc.

+0

alors qu'il serait faisable de regex le résultat pour s'attaquer à la localisation, ça ne marche que si netbios api est présent ... de nos jours ça devient de plus en plus rare (à cause des trous de sécurité de la taille de jupiter) – jpinto3912

0
Option Explicit 
Sub Main() 

Dim wsh As Object 
Dim strIPOutputFile As String, strSingleLine As String, strIP As String, strToFind As String 
Dim intSourceFile As Integer, intLocation As Integer 

    Set wsh = CreateObject("WScript.Shell") 

    strIPOutputFile = "C:\Users\MeMeMeMe\Desktop\txtfile.txt" 

'Save ipconfig info to file 
    wsh.Run "%comspec% /c ipconfig/all> """ & strIPOutputFile & """ 

'Close any open text files 
    Close 

'Get the number of the next free text file 
    intSourceFile = FreeFile 

    Open strIPOutputFile For Input As intSourceFile 

    strToFind = "IPv4 Address. . . . . . . . . . . :" 'This will probably depend on your file 
    Do Until EOF(intSourceFile) 
     Input #intSourceFile, strSingleLine 
     If InStr(1, strSingleLine, strToFind) > 0 Then 
     Exit Do 
     End If 
    Loop 

    intLocation = Len(strToFind) 
    strIP = Trim(Mid(strSingleLine,1 + intLocation,Len(strSingleLine) - intLocation)) 

    intLocation = Len(strIP) 
    While Not IsNumeric(Mid(strIP,intLocation,1)) 
     strIP = Left(strIP, Len(strIP) - 1) 
     intLocation = Len(strIP) 
    Wend 

    Close 

    MsgBox strIP 

End Sub 
Questions connexes