Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IP mit netsh sichern/wiederherstellen (https://www.delphipraxis.net/85975-ip-mit-netsh-sichern-wiederherstellen.html)

Fusel 7. Feb 2007 11:44


IP mit netsh sichern/wiederherstellen
 
Moin.

Habe mich jetzt durch alle relevanten Foren gewühlt.

Wenn ich folgenden Befehl

Delphi-Quellcode:
ShellExecute(Application.Handle, 'open', 'netsh', 'interface dump >C:\ip_config.txt', nil, SW_SHOW);
ausführe listet er im Command-Fenster die Konfiguration auf - speichert diese aber nicht auf C:\ :(

Auch das Setzen der Konfiguration mittels

Delphi-Quellcode:
ShellExecute(Application.Handle, 'open', 'netsh', '-f C:\ip_config.txt', nil, SW_SHOW);
funktioniert nicht.

Was mache ich falsch?

Klaus01 7. Feb 2007 13:07

Re: IP mit netsh sichern/wiederherstellen
 
Versuche es mal bitte so:

Delphi-Quellcode:
ShellExecute(Application.Handle, 'open', pchar('netsh'), pchar('interface dump >C:\ip_config.txt'), nil, SW_SHOW);
Grüße
Klaus

Fusel 7. Feb 2007 13:21

Re: IP mit netsh sichern/wiederherstellen
 
Negativ - klappt nicht :(

Wenn ich den Befehl in der Cmd-Umgebung starte, listet er mir die Daten nicht auf, sondern schreibt sie in die Datei.
Durch Delphi ausgeführt, werden die Daten in der Umgebung aufgelistet.
Ist bald so, als ob er dann den dump-Parameter ignoriert.

franktron 7. Feb 2007 13:26

Re: IP mit netsh sichern/wiederherstellen
 
Das kenn ich führe einfach CMD stat netsh aus dann gehts

Phoenix 7. Feb 2007 13:29

Re: IP mit netsh sichern/wiederherstellen
 
Ash shit.....

Ich hab da mal nen Dienst geschrieben der dem Rechner beim starten ne neue / zusätzliche IP verpasst und beim beenden wieder wegnimmt. Das ging allerdings glaub ich nicht über netsh sondern via API.

Nur wo hab ich nur die Soße...?


Geb mir ein, zwei Stündchen...

Klaus01 7. Feb 2007 13:49

Re: IP mit netsh sichern/wiederherstellen
 
Wer suchet der findet:

Hiermit geht es:

Delphi-Quellcode:
Procedure ExecuteShellCommand( const cmdline: String; hidden: Boolean );
Const
  flags : Array [Boolean] of Integer = (SW_SHOWNORMAL, SW_HIDE);
Var
  cmdbuffer: Array [0..MAX_PATH] of Char;
Begin
  GetEnvironmentVariable( 'COMSPEC', cmdBUffer, Sizeof(cmdBuffer));
  StrCat( cmdbuffer, ' /C ');
  StrPCopy( StrEnd(cmdbuffer), cmdline );
  WinExec( cmdbuffer, flags[hidden] );
End;

ExecuteShellCommand('netsh.exe interface dump > C:\ip_config.txt',false);
Grüße
Klaus

Phoenix 7. Feb 2007 13:56

Re: IP mit netsh sichern/wiederherstellen
 
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.

Fusel 7. Feb 2007 14:45

Re: IP mit netsh sichern/wiederherstellen
 
Ich danke euch allen.
Jetzt funktioniert es :thumb:

Luckie 7. Feb 2007 17:46

Re: IP mit netsh sichern/wiederherstellen
 
@Klasu: MSDN-Library durchsuchenWinExec ist nur noch aus kompatibilitäts Gründen für 16-Bit Programme vorhanden und schon seit langen von Microosft als obsolte gekennzeichnte. Da Vista keine 16-Bit Programme mehr unterstützt, kann e dort schon nicht mehr vorhanden sein. Stattdessen sollte man CreateProcess oder Shellexecute nehmen.

Fusel 8. Feb 2007 02:37

Re: IP mit netsh sichern/wiederherstellen
 
Habe eine Mischung von Klaus + CreateProcess genommen.
Und die funzt sehr gut.

ICH DANKE ALLEN, DIE SICH IHREN KOPF ZERBROCHEN HABEN !!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz