2009-05-06 11 views
9

Was die am wenigsten beschwerlich (Modul-Integration, Codelänge, etc.) ist Möglichkeit, die Maschine IP-Adresse abgerufen wird (von der ersten Schnittstelle offen)? Ich kenne einige Lösungen mit MSINET, aber ich glaube, wir können es besser machen. Sie antwortenWie kann ich die IP-Adresse meines Computers abrufen?

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

nicht, weil es nicht so lustig ... oder zu korrigieren. Das Szenario ist eine Frage mit einem document ID feature Ich versuche, eine Antwort für zu erstellen.

+0

Ich dachte, dass die IP-Adresse Teil der Umgebungsvariablen sein kann und Environ ([Index oder Name]) unter Verwendung erhalten werden, aber leider ist es nicht –

+0

Siehe auch: [IP-Lookups durchführen und Adressen auflösen] (http : //www.mvps.org/access/api/api0067.htm) –

Antwort

18

Hier ist ein adaptiertes Beispiel aus 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 

Es erfordert, dass Microsoft WMI Scripting Library in den Referenzen des Projekts enthalten ist.

+0

Gut gemacht! Sehr kompakt, obwohl ein wirklich "schreibgeschütztes" Code-Snippet ... Ich werde die WMI-Lib für die nächsten 2 Monate studieren, nur um eine Vorstellung davon zu bekommen, was hier gemacht wird. BTW, willkommen in SO. – jpinto3912

+0

Keine tiefe Magie hier eigentlich. :) Ich habe Kommentare hinzugefügt, um zu erklären, was getan wird. – Helen

+0

FYI, WMI steht für Windows Management Intstumentation; Es ist eine Windows-Komponente, die eine Möglichkeit bietet, viele Hardware-, Software- und Netzwerkverwaltungsaufgaben durchzuführen. Here're einige nützliche Links: Sesame Script: WMI Query Language (dieses ist Spaß :) http://www.microsoft.com/technet/scriptcenter/resources/begin/ss1206.mspx WMI Scripting Primer: http://www.microsoft.com/technet/scriptcenter/guide/sas_wmi_overview.mspx WMI Referenz @ MSDN: http://msdn.microsoft.com/en-us/library/aa394582.aspx – Helen

1

Sie könnten den Shell-Befehl ipconfig und analysieren die zurückgegebenen Ergebnisse ausführen?

+0

Wir könnten die cmd Ausgabe in eine txt umleiten ... aber ipconfig auf win2000, xP und vista versuchen, und Sie werden sehen, warum das eine große chaotisch Nein, nein. – jpinto3912

+0

Ich bin mir nicht sicher, warum ist das chaotisch? Könnten Sie das näher ausführen? – sybreon

+0

Der erforderliche Token erscheint nicht immer an der gleichen Stelle, nicht von denselben Wörtern umgeben.Ein letzter Mörder ist, dass das Gebietsschema den Wortlaut des IP-Feld-Tokens ändert. Es wäre alles andere als trivial, dies selbst mit Regex zu bewältigen. – jpinto3912

2

Ein paar Beispiele, die ich gefunden: -

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

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

EDIT

Hier ist der Code von der ersten Verbindung mit einer leichten Modifikation

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 .. Ich werde versuchen, skrink es, bis ich den Code nicht mehr verstehen, und wenn es immer noch funktioniert, hast du es . – jpinto3912

+0

Der erste Link-Code ist gut (der zweite kann nicht sein, brauchen eigenen PC-Namen). Es ist kompakt, nicht von außen abhängig, und ich denke, die API wird sich nicht ändern. Ich bitte, dass Sie diesen Code hier kopieren und einfügen, behalten Sie den Copyright-Hinweis, aber lassen Sie uns den Sub als eine Funktion ohne Args (dh, lasst immer 127.0.0.1 filtern) modulieren, um die Zeichenkette zurückzugeben. Ich werde es richtig markieren. Danke und gut gemacht! – jpinto3912

+0

vielen Dank - Ich habe die Bearbeitung vorgenommen, die Sie angefordert haben. traurig über die Formatierung - Stackoverflow scheint nicht sehr VBA, freundlich zu sein ;-) –

0

nbtstat -n könnte den Job auf XP sowieso tun. Nicht sicher über andere Windows-Versionen oder über die Lokalisierung in anderen Sprachen. Teilprobe Ausgabe:

C: \ Dokumente und Einstellungen \ colin> nbtstat -n

LAN-Verbindung: Knoten IpAddress: [192.168.1.100] Scope Id: []

  NetBIOS Local Name Table 

usw.

+0

während es möglich wäre, das Ergebnis an die Lokalisierung anzupassen, funktioniert es nur, wenn netbios api vorhanden ist ... heutzutage wird es immer seltener (aufgrund von Sicherheitslöchern in der Größe von 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 
Verwandte Themen