Announcement

Collapse
No announcement yet.

Ermitteln der Netzwerkadresse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ermitteln der Netzwerkadresse

    Hallo zusammen<br>
    Kann mir jemand sagen, wie ich die Netzwerkadresse (nicht den Computernamen) eines Rechners im Netzwerk herausfinde?<br>
    Danke<br>
    Patrick

  • #2
    Hallo,

    folgendes sollte erfolgreich sein:
    <pre>
    uses ComObj, ActiveX;

    function GetMAC: String;
    var
    sTmp : String;
    i : Integer;
    aGUID : TGUID;
    begin
    OleCheck(CoCreateGUID(aGUID));
    sTmp := '';
    for i:= 2 to 7 do
    sTmp := sTmp + IntToHex(aGUID.D4[i],2);
    Result := sTmp;
    end;
    </pre&gt

    Comment


    • #3
      Das ist bestimmt in die falsche Sparte gerutscht, Andreas?!<br>
      Ich hätte nämlich "GetHostByName" (WinSock) vorgeschlagen.<br><br>
      Gruß,<br>
      Mathias

      Comment


      • #4
        GetHostByName klingt schon recht vielversprechend, lieftert mir aber immer einen Nullzeiger zurück.<br>
        Grob gesagt sieht mein Code so aus:<br><br>

        <pre>
        function getNetAdress(s:PChar):string;
        var hostInfo:PHostent;
        begin
        hostInfo:=GetHostByName(s);
        result:=StrPas(hostInfo.h_Addr^);
        end;

        procedure TMyForm.Create(Sender:TObject);
        var pCompName:PChar; nSizeWord; addr:string;
        begin
        nSize:=MAX_COMPUTERNAME_LENGTH+1;
        pCompName:=StrAlloc(nSize);
        try
        if GetComputerName(pCompName,nSize) then addr:=getNetAdress(pCompName);
        except
        end;
        end;
        </pre>
        <br><br>
        So hatte ich das eigentlich verstanden, aber wie gesagt - GetHostByName liefert mir einen Nullzeiger...
        <br>
        Was mache ich da falsch?<br>
        Danke<br>
        Patric

        Comment


        • #5
          Hm, ob´s dir weiterhilft weiß ich nicht, aber das kurze Stück stammt aus einem "hosts"-Editor (VCL-Version):

          <pre><b>procedure</b> THEDInputForm.pingBtnClick(Sender: TObject);
          <b>var</b>
          hostent : pHostent;
          fIP : tInAddr;
          <b>begin</b>
          hostent := GetHostByName(pchar(url.Text));
          <b>if</b>(assigned(hostent)) <b>then</b>
          <b>begin</b>
          fIP.S_addr := integer(pointer(hostent^.h_addr_list^)^);
          SendMessage(hIpAddr,IPM_SETADDRESS,0,fIP.S_addr);
          <b>end</b>
          <b>else</b>
          SendMessage(hIpAddr,IPM_CLEARADDRESS,0,0);
          <b>end</b>;</pre>

          Du müsstest die Adresse allerdings anders konvertieren, weil ich in dem Fall das IP-Control des Systems benutzt habe um sie anzuzeigen. Wenn du ein Edit-Feld oder einen String benutzen willst, wäre das hier:

          <pre><b>string</b>(inet_ntoa(fIP));</pre>

          wohl besser.<br><br>
          Gruß,<br>
          Mathias

          Comment


          • #6
            Was ich eigentlich möchte, ist folgendes:<br>
            Wir haben eine Applikation entwickelt, die auf einem Client/Server-System laufen soll, und diese Anwendung läßt a) benutzerspezifische Einstellungen zu und b) arbeitsplatzspezifische Einstellungen. Ich möchte in einer zentralen Datenbank die Rechner abspeichern, die Benutzer sowie diverse Einstellungen. Will sagen, ich muß jeden Rechner des Netzwerks eindeutig identifizieren können - da z. B. in unserem Firmennetz mehrere Rechner den gleichen Namen haben, funktioniert das nicht über den Rechnernamen, sondern meines Wissens nach nur über die physikalische Netzwerkadresse. So wie ich das verstehe, liefert das Beispiel oben eher die IP-Adresse und nicht die Adresse der Netzwerkkarte (die brauche ich).<br>
            Aber trotzdem danke!
            <br&gt

            Comment


            • #7
              So, jetzt bin ich verwirrt.<br><br>
              1. Mehrere Rechner im gleichen Netzwerk (Arbeitsgruppe und/oder Domäne) benutzen den selben Namen? Ich erinnere mich an unsere früheren Versuche, bei denen immer der Pech hatte, der sich an zweiter Stelle anzumelden versuchte. Dem hagelten die Fehlermeldungen "dieser Name wird bereits benutzt" usw. um die Ohren.<br>
              Ist das wirklich möglich? Oder verwechselst du das mit dem Benutzernamen, mit dem sich die Leute anmelden?<br><br>
              2. Wenn du <b>Netzwerk</b>adresse schreibst (s. dein erstes Posting), dann gehe ich davon aus, dass du die IP brauchst, die der Rechner im LAN benutzt. Anhand dieser IP ist er doch eindeutig zu identifizieren, da IMHO die selbe Adresse nicht mehrfach benutzt werden kann. Anders sieht die Sache bei der dynamischen Zuordnung aus. Da ändert sich die IP bei jedem Anmelden im LAN.<br><br>
              3. Wenn du wirklich die eindeutige MAC der Netzwerkkarte suchst, muss ich dich erst mal enttäuschen. Eine Funktion zum Auslesen kenne ich im Augenblick nicht. Was aber, wenn die Karte mal kaputt geht und eine neue eingebaut werden muss? Dann stehst du wohl wieder vor dem Problem, dein Programm updaten zu müssen, weil die neue Karte ja logischerweise eine neue einzigartige MAC mitbringt.<br><br>
              Wie gesagt: ich bin jetzt verwirrt.<br><br>
              Gruß,<br>Mathias

              Comment


              • #8
                1. Nein, ich verwechsle den Benutzernamen und den Rechnernamen nicht. Die Windowsfunktion GetComputerName liefert den Namen des Computers, dann frage ich in meiner eigenen Datenbank ab, ob dieser Rechner schon eingetragen ist. Wenn ja, gucke ich in meiner Datenbank, wer der letzte Benutzer unserer Anwendung war und starte die Anwendung mit den ebenfalls aus der Datenbank ausgelesenen Einstellungen für den Computer und den Benutzer. Ist der Rechner noch nicht eingetragen, muß der Benutzer sich einmalig anmelden, und das Programm wird mit den Standardeinstellungen gestartet. Rechner/Benutzer werden dann in die Datenbank eingetragen. Und der Bneutzer kann über Optionen bestimmte Einstellungen individualiesieren.

                2. Leider kann ich die IP-Adresse nicht verwenden, weil sie eben nicht statisch ist...

                3. Wenn die Netzwerkkarte mal kaputt geht und eine neue eingebaut wird, muß der Anwender sich nur einmal neu anmelden, mehr nicht

                Comment


                • #9
                  hallo patrick,

                  ...und dann sind wir wieder beim kosch'schen beispiel, das liefert nämlich die mac-adresse und die ist garantiert eindeutig...

                  mfg
                  ak

                  Comment


                  • #10
                    Bist du sicher? Ich habe im Moment z.B. keine Netzwerkkarte drin, bekomme aber dennoch ein Ergebnis. Wenn ich im PSDK zu "CoCreateGUID" nachschlage, finde ich zwar eine ausführliche Beschreibung und diverse Links, aber der Zusammenhang zwischen dieser Funktion und der MAC-Adresse der Netzwerkkarte will sich dennoch nicht einstellen.<br><br>
                    Vielleicht könnte ja Andreas diese Frage beantworten?<br><br>
                    Mathias

                    Comment


                    • #11
                      Hallo,

                      &gt;keine Netzwerkkarte drin, bekomme aber dennoch ein Ergebnis...

                      die Win32-API-Funktion liefert nur dann die exakte MAC-Adresse zurück, wenn mindestens eine Netzwerkkarte im Rechner steckt. Ist das nicht der Fall, wird simuliert. Eine GUID erreicht ihre weltweite Eindeutigkeit allein schon aufgrund der Einmaligkeit der MAC-Adresse - wenn aber der Rechner keine Netzwerkkarte mit einer in der Hardware abgelegten MAC-Adresse hat, läuft eine Simulation, die mit sehr hoher Wahrscheinlichkeit ebenfalls eindeutige GUIDs generieren kann

                      Comment


                      • #12
                        Hallo.<br><br>
                        Ja, ich hab´s gemerkt. ) Ich habe ja glücklicherweise noch ein paar alte MSI-Dateien rumliegen, die noch "mit eingebauter Netzwerkkarte entstanden" ... ;o) ... und bei denen war die letzte Stelle der "ComponentId" immer identisch, weil ich dafür ja auch GUIDs benutzt habe.<br><br>
                        Danke für die Antwort.<br><br>
                        Gruß,<br>
                        Mathias

                        Comment


                        • #13
                          Ja, daß der Code von Andreas Kosch genau das war, was ich brauchte, ist mir inzwischen auch klar geworden. Danke nochmal!<br>
                          Jetzt habe ich noch ein anderes Problem...<br>
                          Ich möchte diesen Code in eine DLL packen, und aus bestimmten Gründen muß ich diese DLL in C++ programmieren. Der C++-Builder kann doch DelphiCode kompilieren, oder irre ich mich da? Ich bekomme es jedenfalls nicht hin, eine Delphi-Unit so einzubinden, daß sie korrelt compiliert wird. Ich habe in meiner cpp-Datei für die DLL meine Delphidatei (in der nur diese eine Funktion deklariert ist) eingebunden mit <br>
                          #include "Netadress.pas"<br>
                          Beim Versuch, die Datei zu compilieren, meldet der Compiler einen Fehler in der "symac.H"; weiß jemand, wie ich Delphi-Dateien in den C++-Builder einbinden kann?<br>
                          Ich habe auch schon versucht, die Funktion in C++ nachzubauen - ist ja nicht allzu schwierig, allerdings liefert mir OleCheck unter C++ eine Exception, während es bei Delphi keine Exception gibt.
                          <br>
                          Kann mir da nochmal jemand helfen?<br>
                          Danke<br>
                          Patric

                          Comment


                          • #14
                            Also, die Sache mit der Exception bei C++ habe ich inzwischen hinbekommen (ich vergesse immer wieder, daß man unter C/C++ ständig explizit Speicher reservieren muß...)<br>
                            Ich habe allerdings festgestellt, daß der Code von Andreas Kosch sowohl unter Delphi als auch unter C++ (da halt von mir syntaxtechnisch abgewandelt) bei jedem Aufruf ein anderes Resultat zurückliefert.<br>
                            Das kann aber doch irgendwie nicht sein - die physikalische Adresse der Netzwerkadresse ist doch konstant...<br>
                            Irgendwie ist es jetzt an mir, verwirrt zu sein

                            Comment

                            Working...
                            X