IP Adresse aus Computername ermitteln



  • Hallo, habe Google und Suche ohne Erfolg durchforstet...

    Wie kann ich aus einem Computernamen die IP Adresse ermitteln (ggfs. auch weitere Netzwerkadressdaten wie MAC, DNS usw.)?

    Hiermit ermittel ich im Netzwerk alle verfügbaren Rechner:

    void __fastcall TForm18::frm18_btnAktuellClick(TObject *Sender)
    {Integer i2; AnsiString z1,z2,zTCP,zName; Boolean o1;                           // Vars definieren
     TListItem  *ListItem;                                                          // Vars definieren
    
     zName=Clienten(0,0,"",frm18_lvTabelle);                                        // eigener Computername?
    
     Filter=Trim(frm18_edFilter->Text);                                             // akt. Filtertext
     o1=Filter.Length()>0;                                                          // Angabe gemacht?
     z2=Filter.LowerCase();                                                         // alles in Kleinbuchstaben
    
     LPSERVER_INFO_101 pBuf = NULL;                                                 //
     LPSERVER_INFO_101 pTmpBuf;                                                     //
     DWORD dwLevel        = 101;                                                    // Infos auf Level 101 anfordern
     DWORD dwPrefMaxLen   = -1;                                                     //
     DWORD dwEntriesRead  = 0;                                                      //
     DWORD dwTotalEntries = 0;                                                      //
     DWORD dwServerType   = SV_TYPE_SERVER;                                         // Alle Services anfordern
     DWORD dwResumeHandle = 0;                                                      //
     NET_API_STATUS nStatus;                                                        //
     LPTSTR pszServerName = NULL;                                                   //
    
     Screen->Cursor=crHourGlass;                                                    // Sanduhr
     frm18_lvTabelle->Clear();                                                      // Tabelle löschen
    
     nStatus = NetServerEnum(pszServerName,                                         // Auf Level 101 Infos anfordern
                             dwLevel,                                               //
                             (LPBYTE *) &pBuf,                                      //
                             dwPrefMaxLen,                                          //
                             &dwEntriesRead,                                        //
                             &dwTotalEntries,                                       //
                             dwServerType,                                          //
                             NULL,                                                  //
                             &dwResumeHandle);                                      //
    
     if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA)) {               // Aufruf war erfolgreich...
      if ((pTmpBuf = pBuf) != NULL) {
       frm18_proBalken->Max=dwEntriesRead;                                          // Balken einstellen
    
       for (int i1 = 0; i1 < dwEntriesRead; i1++) {                                 //
        Application->ProcessMessages();                                             // events abarbeiten
        frm18_proBalken->Position=i1;                                               // Balken einstellen
    
        if(o1==true) {                                                              // Filterangabe ist gemacht
         z1=pTmpBuf->sv101_name;                                                    // String übergeben
         z1=z1.LowerCase();                                                         // Name zurück
         if(z1.AnsiPos(z2)==0) { goto Abbruch; }                                    // Filtertext ist nicht enthalten, raus
        }                                                                           // ende if(o1
    
        z1="PC";                                                                    // Voreinstellung
        if (pTmpBuf->sv101_type & SV_TYPE_DOMAIN_CTRL)    { z1="PDC"; }             // Domain
        if (pTmpBuf->sv101_type & SV_TYPE_DOMAIN_BAKCTRL) { z1="BDC"; }             // Backupdomain
    
        zTCP="0.0.0.0";                                                             //  HIER DIE IP ADRESSE ERMITTELN...???
    
        ListItem = frm18_lvTabelle->Items->Add();                                   // neue Zeile anlegen
        z2=pTmpBuf->sv101_name;                                                     // Computername
        i2=-1; if(zName==z2.LowerCase()) { i2=51; }                                 // eigenen PC kennzeichnen
    
        ListItem->ImageIndex=i2;                                                    // und Symbol zuordnen
        ListItem->Caption = IntToStr(i1);                                           // 01 Nummer
        ListItem->SubItems->Add(z2);                                                // 02 Computername
        ListItem->SubItems->Add(zTCP);                                              // 03 TCP/IP
        ListItem->SubItems->Add(z1);                                                // 04 Gerät
        ListItem->SubItems->Add(pTmpBuf->sv101_platform_id);                        // 05 PLattform ID
        ListItem->SubItems->Add(String(pTmpBuf->sv101_version_major)+"."+String(pTmpBuf->sv101_version_minor)); // 06 Version
        ListItem->SubItems->Add(pTmpBuf->sv101_type);                               // 07 Typ
        ListItem->SubItems->Add(pTmpBuf->sv101_comment);                            // 08 Kommentar/Bemerkung
    
        Abbruch:                                                                    // Sprungmarke
        pTmpBuf++;                                                                  // Zähler +1
       }                                                                            // ende for i1
    
       if (nStatus == ERROR_MORE_DATA) { Application->MessageBox(("Alle Einträge: "+String(dwTotalEntries)).c_str(),"Mehr Einträge verfügbar!", MB_OK | MB_ICONSTOP); }
    
      }                                                                             // ende if(pTmp
     }                                                                              // ende (nStatus
    
     if (pBuf) { NetApiBufferFree(pBuf); }                                          // Puffer freigeben
    
     TDateTime DateTime=Now();                                                      // Datum und Uhrzeit speichern
     frm18_StatusBar->SimpleText="Letzte Aktualisierung = "+FormatDateTime("dd.mm.yyyy, hh:nn:ss",DateTime)+"    Filter: "+Filter;
    
     i2=frm18_lvTabelle->Items->Count;                                              // Anzahl Einträge
     frm18_lbl1->Caption="Rechner ("+IntToStr(i2)+")";                              // Anzahl schreiben
     frm18_btnPing->Enabled=oTCP && i2>0;                                           // Button sperren/freigeben
    
     frm18_proBalken->Position=0;                                                   // Balken einstellen
     Screen->Cursor=crDefault;                                                      // Pfeil
    }
    

    Hier würde ich eben noch gerne die IP Adresse mit ausgeben (für PING usw.)

    Grüsse, Stefan



  • [code]
    PHOSTENT hostinfo;
    
    if((hostinfo = gethostbyname(hostname)) == NULL)
    {
    	printf("Error: Failed to get the local host!");
    	return false;
    }[/code]
    

    weiß nur nicht, ob das im Netzwerk funzt....



  • ...aber da meckert er immer wegen PHOSTENT

    Habe es aber so gelöst:

    //----------------------------------------------------------------------------
    //----- IP ADRESSE ERMITTELN -----
    //----------------------------------------------------------------------------
    AnsiString IpAdresse(int p1,AnsiString pt1)
    {AnsiString z1;                                                                 // Vars definieren
    
     if(Form1->PrgComp) { ShowMessage("Computername: "+pt1); }                      // nur im IDE
    
     char *Ip;                                                                      // neues Char
     WSADATA wsaData;                                                               // WSA Strukt zuordnen
     struct hostent *pHostEnt;                                                      // und anlegen
     struct sockaddr_in tmpSockAddr;                                                // PLatzhalter für IP Adresse
    
     WSAStartup(MAKEWORD(2,0),&wsaData);                                            // WSA starten
    
     char hostname[25];                                                             // neues Char
     strcpy(hostname,pt1.c_str());                                                  // Computername in Char kopieren
     pHostEnt=gethostbyname(hostname);                                              // Name auflösen in IP
     if(pHostEnt==NULL) { ShowMessage("IP_Adresse kann nicht ermittelt werden!?\r\rComputer: "+pt1); return ""; } // Fehler, Abbruch
    
     memcpy(&tmpSockAddr.sin_addr,pHostEnt->h_addr,pHostEnt->h_length);             // Kopiert Speicherbereich in die Struktur
    
     Ip = NULL;                                                                     // Char leeren
     Ip = new char[17];                                                             // 17 Zeichen neu
     strcpy(Ip,inet_ntoa(tmpSockAddr.sin_addr));                                    // aus Struktur in Char kopieren
    
     z1=StrLower(Ip);                                                               // Char in String kopieren
    
     WSACleanup();                                                                  // WSA beenen
     delete [] Ip;                                                                  // Char löschen
    
     return z1;                                                                     // IP Rückgabe
    }
    

    Gruss, Stefan


Anmelden zum Antworten