Ip nasıl değiştirilir?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Tesla

Ip nasıl değiştirilir?

Mesaj gönderen Tesla »

Merhabalar,

Delphi ile resimdeki alanlara yazmak istiyorum, bunu nasıl yapabilirim?

Resim

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4731
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Mesaj gönderen mrmarman »

Her Network kartı (ethernet adapter) için farklı farklı olduğunu biliyorsun değil mi ?

- Bunu dikkate almak şartıyla Registry'den

Kod: Tümünü seç

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{819A4FF3-xxxxxxxxxx} 
şeklinde belirtilen LAN kartına ait kayıt altındaki değerlerde değişiklik yaparak denemelerini yapabilirsin.
Resim Resim

Tesla

Mesaj gönderen Tesla »

iki tane kod buldum, onları deneyeceğim, Burada da vereyim.

Kod: Tümünü seç

uses ComObj, ActiveX, UrlMon;

// ======================================================================
// SetIpConfig()
// Set IPAddress, Gateway and Subnetmask via WMI
// Arguments ...
// AIpAddress - If Null String or 'DHCP' then DHCP is ENABLED
//              else STATIC IP is set.
// AGateWay   - [Optional] If Omitted then GATEWAY is left unchanged.
// SubnetMask - [Optional] If Omited then default = '255.255.255.0'.
//
// SetDnsServers()
// Set  DNS Servers via WMI
// Arguments ...
// APrimaryDNS   - If Null String then DNS Server List is CLEARED.
// AAlternateDNS - [Optional]
//
// Return Values ...
//   0 Successful completion, no reboot required.
//   1 Successful completion, reboot required.
//  -1 Unknown OLE Error
//  64 Method not supported on this platform.
//  65 Unknown failure.
//  66 Invalid subnet mask.
//  67 An error occurred while processing an instance that was returned.
//  68 Invalid input parameter.
//  69 More than five gateways specified.
//  70 Invalid IP address.
//  71 Invalid gateway IP address.
//  72 An error occurred while accessing the registry for the info.
//  73 Invalid domain name.
//  74 Invalid host name.
//  75 No primary or secondary WINS server defined.
//  76 Invalid file.
//  77 Invalid system path.
//  78 File copy failed.
//  79 Invalid security parameter.
//  80 Unable to configure TCP/IP service.
//  81 Unable to configure DHCP service.
//  82 Unable to renew DHCP lease.
//  83 Unable to release DHCP lease.
//  84 IP not enabled on adapter.
//  85 IPX not enabled on adapter.
//  86 Frame/network number bounds error.
//  87 Invalid frame type.
//  88 Invalid network number.
//  89 Duplicate network number.
//  90 Parameter out of bounds.
//  91 Access denied.
//  92 Out of memory.
//  93 Already exists.
//  94 Path, file, or object not found.
//  95 Unable to notify service.
//  96 Unable to notify DNS service.
//  97 Interface not configurable.
//  98 Not all DHCP leases could be released or renewed.
//  100 DHCP not enabled on adapter.
// ======================================================================


// ==================================================================
// IP Address,Gateway and Subnet Mask
// EnableStatic takes array of string as a parameter
// for the Addresses. You may wish to rewrite this using
// array of string as parameter for multiple IP Addresses.
// I only have use for 1 IP address and Gateway in our application
// but it's nice to be able to expand it for other users.
// ==================================================================

function SetIpConfig(const AIpAddress : string;
                     const AGateWay : string = '';
                     const ASubnetMask : string = '') : integer;
var Retvar : integer;
    oBindObj : IDispatch;
    oNetAdapters,oNetAdapter,
    oIpAddress,oGateWay,
    oWMIService,oSubnetMask : OleVariant;
    i,iValue : longword;
    oEnum : IEnumvariant;
    oCtx : IBindCtx;
    oMk : IMoniker;
    sFileObj : widestring;
begin
  Retvar := 0;
  sFileObj := 'winmgmts:\\.\root\cimv2';

  // Create OLE [IN} Parameters
  oIpAddress := VarArrayCreate([1,1],varOleStr);
  oIpAddress[1] := AIpAddress;
  oGateWay := VarArrayCreate([1,1],varOleStr);
  oGateWay[1] := AGateWay;
  oSubnetMask := VarArrayCreate([1,1],varOleStr);
  if ASubnetMask = '' then
    oSubnetMask[1] := '255.255.255.0'
  else
    oSubnetMask[1] := ASubnetMask;

  // Connect to WMI - Emulate API GetObject()
  OleCheck(CreateBindCtx(0,oCtx));
  OleCheck(MkParseDisplayNameEx(oCtx,PWideChar(sFileObj),i,oMk));
  OleCheck(oMk.BindToObject(oCtx,nil,IUnknown,oBindObj));
  oWMIService := oBindObj;

  oNetAdapters := oWMIService.ExecQuery('Select * from ' +
                                        'Win32_NetworkAdapterConfiguration ' +
                                        'where IPEnabled=TRUE');
  oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant;

  while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin
    try
      // Set by DHCP ? (Gateway and Subnet ignored)
      if (AIpAddress = '') or SameText(AIpAddress,'DHCP') then
        Retvar := oNetAdapter.EnableDHCP
      // Set via STATIC ?
      else begin
        Retvar := oNetAdapter.EnableStatic(oIpAddress,oSubnetMask);
        // Change Gateway ?
        if (Retvar = 0) and (AGateWay <> '') then
          Retvar := oNetAdapter.SetGateways(oGateway);

        // *** This is where we need some sort of ***
        // *** Network Mapped Resource Refresh    ***
      end;
    except
      Retvar := -1;
    end;

    oNetAdapter := Unassigned;
  end;

  oGateWay := Unassigned;
  oSubnetMask := Unassigned;
  oIpAddress := Unassigned;
  oNetAdapters := Unassigned;
  oWMIService := Unassigned;
  Result := Retvar;
end;


// ====================================================
// Set DNS Servers
// Instead of Primary and Alternate you may wish
// to rewrite this using array of string as the
// parameters as SetDNSServerSearchOrder will take
// a list of many DNS addresses. I only have use for
// Primary and Alternate.
// ====================================================

function SetDnsServers(const APrimaryDNS : string;
                       const AAlternateDNS : string = '') : integer;
var Retvar : integer;
    oBindObj : IDispatch;
    oNetAdapters,oNetAdapter,
    oDnsAddr,oWMIService : OleVariant;
    i,iValue,iSize : longword;
    oEnum : IEnumvariant;
    oCtx : IBindCtx;
    oMk : IMoniker;
    sFileObj : widestring;
begin
  Retvar := 0;
  sFileObj := 'winmgmts:\\.\root\cimv2';
  iSize := 0;
  if APrimaryDNS <> '' then inc(iSize);
  if AAlternateDNS <> '' then inc(iSize);

  // Create OLE [IN} Parameters
  if iSize > 0 then begin
   oDnsAddr := VarArrayCreate([1,iSize],varOleStr);
   oDnsAddr[1] := APrimaryDNS;
   if iSize > 1 then oDnsAddr[2] := AAlternateDNS;
  end;

  // Connect to WMI - Emulate API GetObject()
  OleCheck(CreateBindCtx(0,oCtx));
  OleCheck(MkParseDisplayNameEx(oCtx,PWideChar(sFileObj),i,oMk));
  OleCheck(oMk.BindToObject(oCtx,nil,IUnknown,oBindObj));
  oWMIService := oBindObj;

  oNetAdapters := oWMIService.ExecQuery('Select * from ' +
                                        'Win32_NetworkAdapterConfiguration ' +
                                        'where IPEnabled=TRUE');
  oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant;

  while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin
    try
      if iSize > 0 then
        Retvar := oNetAdapter.SetDNSServerSearchOrder(oDnsAddr)
      else
        Retvar := oNetAdapter.SetDNSServerSearchOrder();
    except
      Retvar := -1;
    end;

    oNetAdapter := Unassigned;
  end;

  oDnsAddr := Unassigned;
  oNetAdapters := Unassigned;
  oWMIService := Unassigned;
  Result := Retvar;
end;



(* ----------------------------------------------------
See the Miscrosoft MSDN Documentation for the
Win32_NetworkAdapterConfiguration Class
(implemented as oNetAdatper in my examples),
There are many more calls besides EnableStatic,
EnableDHCP and SetDNBSServerSearchOrder.

Some of them are ...

DisableIPSec
EnableDHCP
EnableDNS
EnableIPFilterSec
EnableIPSec
EnableStatic
EnableWINS
ReleaseDHCPLease
ReleaseDHCPLeaseAll
RenewDHCPLease
RenewDHCPLeaseAll
SetArpAlwaysSourceRoute
SetArpUseEtherSNAP
SetDatabasePath
SetDeadGWDetect
SetDefaultTTL
SetDNSDomain
SetDNSServerSearchOrder
SetDNSSuffixSearchOrder
SetDynamicDNSRegistration
SetForwardBufferMemory Specifies
SetGateways
SetIGMPLevel
SetIPConnectionMetric
SetIPUseZeroBroadcast
SetIPXFrameTypeNetworkPairs
SetIPXVirtualNetworkNumber
SetKeepAliveInterval
SetKeepAliveTime
SetNumForwardPackets
SetPMTUBHDetect
SetPMTUDiscovery
SetTcpipNetbios
SetTcpMaxConnectRetransmissions
SetTcpMaxDataRetransmissions
SetTcpNumConnections
SetTcpUseRFC1122UrgentPointer
SetTcpWindowSize
SetWINSServer
------------------------------------------------ *) 

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);

  function ChangeIp(ConnectionName,Ip,Netmask,Gateway:string):boolean;

    function ExecAndWait(FileName:String; Visibility:integer):integer;
    var
      zAppName:array[0..512] of char;
      zCurDir:array[0..255] of char;
      WorkDir:String;
      StartupInfo:TStartupInfo;
      ProcessInfo:TProcessInformation;
      Resultado: DWord;
    begin
      StrPCopy(zAppName,FileName);
      GetDir(0,WorkDir);
      StrPCopy(zCurDir,WorkDir);
      FillChar(StartupInfo,Sizeof(StartupInfo),#0);
      StartupInfo.cb := Sizeof(StartupInfo);

      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := Visibility;
      if not CreateProcess(nil,
        zAppName,                      { pointer to command line string }
        nil,                           { pointer to process security attributes}
        nil,                           { pointer to thread security attributes}
        false,                         { handle inheritance flag }
        CREATE_NEW_CONSOLE or          { creation flags }
        NORMAL_PRIORITY_CLASS,
        nil,                           { pointer to new environment block }
        nil,                           { pointer to current directory name }
        StartupInfo,                   { pointer to STARTUPINFO }
        ProcessInfo) then Result := -1 { pointer to PROCESS_INF }

      else begin
        WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
        GetExitCodeProcess(ProcessInfo.hProcess,Resultado);
        Result := Resultado;
      end;
    end;

  begin
    Result:=( ExecAndWait( 'netsh interface ip set address "'+
                           ConnectionName+'" '+
                          ' static '+Ip+ ' '+NetMask +' '+GateWay+' 1',sw_hide)=0 );
  end;

begin
  if NOT ChangeIp( 'Local Area Connection',
                   '192.168.10.22',
                   '255.255.255.0',
                   '192.168.10.90') then showmessage('Error changing IP')
                                    else showmessage('Ip Changed without errors');
end;
2.si daha anlaşılır duruyor.

"Local Area Connection" gibi benim bağlantı adlarımıda buldurabilsem çok hoş olacak aslında..

Tesla

Mesaj gönderen Tesla »

2.kodu denedim, ip yi bir defalığına değiştirdi, 2.sefer değiştiremedim ve nasıl değiştirdiyse, ip ayarlarıma girdiğimde değiştirmek için olan formda (resimdeki) eskiden yazdığım sayılar yazıyordu ama ip adresi olarak kendi değiştirdiği ip var. pc yi yeniden başlattıktan sonra ip tekrar eski haline geldi..

yani bu benim istediğim şey değil.

Edit:
ilk verdiğim kod sorunsuz çalışıyor ama bende 2 ethernet kartı var ve ikisininde ip sini 192.168.0.2 yaptı... yani tüm bağlantıların ip lerini değiştiriyor bu kod. Onu geliştiremez miyiz?

Olay

Kod: Tümünü seç

  oNetAdapters := oWMIService.ExecQuery('Select * from ' +
                                        'Win32_NetworkAdapterConfiguration ' +
                                        'where IPEnabled=TRUE');
  oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant;

  while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin 
satırında kopuyor

Tesla

Mesaj gönderen Tesla »

Kimsenin bir fikri yok mu?

Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Mesaj gönderen Battosai »

İp adresi otomatik al seçili ise değiştirsende kapanıp açılınca eski haline döner. İlk önce bu ayarı değiştirmelisin sonra IP e istediğini yaz...

Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

geçen gün ben de merak ettim reg monitör ile izledim olayı reg de 2-3 yerde iplerin değiştiğini görmüştüm. bundan olabilir.
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim

Tesla

Mesaj gönderen Tesla »

Battosai yazdı:İp adresi otomatik al seçili ise değiştirsende kapanıp açılınca eski haline döner. İlk önce bu ayarı değiştirmelisin sonra IP e istediğini yaz...
ipye istediğimi yazıyorum zaten, otomatik seçeneğide kapalı.
Benim sorunum: bende birkaç tane ethernet kartı var, biriyle internet alıyorum, diğeriyle paylaşıyorum... ben bunlardan 1 tanesinin ip sini değiştirmek istiyorum. Verdiğim kod hepsinin iplerini değiştiriyor.

Kullanıcı avatarı
proteknikblg
Üye
Mesajlar: 35
Kayıt: 27 Nis 2006 08:39
Konum: Sivas
İletişim:

Mesaj gönderen proteknikblg »

Slm bu konuyu daha önce bende araştırmıştım. Forumda sonuca ulaştım :)
viewtopic.php?t=13203&highlight=

Tesla

Mesaj gönderen Tesla »

proteknikblg yazdı:Slm bu konuyu daha önce bende araştırmıştım. Forumda sonuca ulaştım :)
viewtopic.php?t=13203&highlight=
Teşekkürler ama aynı kodları içeriyor, yani benim verdiğim kodlar o konudada var ve örnek program yine tüm bağlantıların ip lerini değiştiriyor.

Normalde tek bir ethernet kartı varken çalışıyor zaten ona sözümüz yok.

fatihbarut

indy

Mesaj gönderen fatihbarut »

ben IP öğrenmek için indy bileşeni kullandım. Muhtemelen bu indynin IP'yi okuduğu registry'yi değiştirme mahareti de vardır.

Cevapla