Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)
Online

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#7

Re: IP mit netsh sichern/wiederherstellen

  Alt 7. Feb 2007, 13:56
Ging doch flotter

Also, ich hab die IPHelperAPI aus den Jedis benutzt.

die Lokale IP Adresse erhältst Du dort mit VVGetIpAddrTable:

Delphi-Quellcode:
//------------------------------------------------------------------------------
// Datum : 19.06.2006
// Author: Sebastian Gingter
procedure TMyService.getLocalIpAddresses(var addr: TStringList; var idx: TStringList);
var
  size: ulong;
  p: PMibIpAddrTable;
  i: integer;
begin
  VVGetIpAddrTable(p, size, true);
  if p <> nil then
  begin
    try
      with p^ do
      begin
        for i := 0 to dwNumEntries-1 do
          with table[i] do
          begin
            addr.Add(Format('%s', [IpAddressToString(dwAddr)]));
            idx.Add(Format('%d', [dwIndex]));
          end;
      end;
    finally
      freeMem(p);
    end;
  end;
end;
Das IpAddressToString ist was kurzes eigenes:

Delphi-Quellcode:
//------------------------------------------------------------------------------
// Datum : 19.06.2006
// Author: Sebastian Gingter
function TMyService.IpAddressToString(Addr: DWORD): string;
var
  InAddr: TInAddr;
begin
  InAddr.S_addr := Addr;
  Result := inet_ntoa(InAddr);
end;
Und dann das setzen:

Delphi-Quellcode:
//------------------------------------------------------------------------------
// Datum : 19.06.2006
// Author: Sebastian Gingter
function TMyService.CheckAndObtainIPAdress: boolean;
var
  l_addresses: TStringList;
  l_indices: TStringList;
  i: integer;
begin
  // Handle on new IP Address
  m_NTEContext := 0;
  m_NTEInstance := 0;

  m_IpSelfSet := false;
  l_addresses := TStringList.Create;
  l_indices := TSTringList.Create;
  try
    // First check local IP addresses for target address (store in result):
    getLocalIpAddresses(l_addresses, l_indices);
    i := l_addresses.IndexOf(IPAddress);
    result := (i <> -1);
    m_ipAlreadySet := result;

    if not m_ipAlreadySet then
    begin
      if true { isIpAvailable } then
      begin
        // Get interface to set:
        i := l_addresses.IndexOf(m_referenceIP);
        if (i <> -1) then
        begin
          result := ObtainIPAddress( StrToInt(l_indices[i]) );
        end;
      end;
    end;
  finally
    FreeAndNil(l_addresses);
    FreeAndNil(l_indices);
  end;
end;
Wichtig dabei ist, dass Du in der oben gezeigten Variante mindestens eine IP Adresse kennst, die schon auf dem Interface sitzt (in m_referenceIP). Sonst wird es Dir zwangsläufig passieren, dass Du die IP auf dem falschen Interface setzt und damit ggf. auf dem WLAN eine IP setzt die eigentlich am Kabel anliegen sollte.

Naja.. ich denke das dürfte schonmal ein Stückchen helfen.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat