{   Taypi v1.0 --> 13.01.2010
    Burhan BARAKLI 13.01.2010
    Pas Dosyasının amacı: Ip ve DS bilgilerini değiştirmek.
    Evde ve işte kullandığım ip ve dns bilgilerini değiştirmekten bıktıgım için bu kod
    dosyasını hazırladım.

    Kodun devamı olarak hazırlanacaklar için
    --> çoklu ayar dosyası --> ini dosyasında tutulacak. v1.1
    --> girilen sayıların ve stringlerin doğruluğu --> 267 girilemeyecek gibi veya başta veya sonda nokta olmayacak. v.1.2
    --> ethernet kartlarının numaraları bulunacak. wireless veya lan ethernet kartları gibi. v.1.3

    --> buradaki fonksiyonların 2 tanesi delphiturkiye.com sitesindeki forumdan
    http://www.delphiturkiye.com/forum/viewtopic.php?t=13203&highlight=[/url] ve
    fonksiyonların gerçek yazarı olan Mike Heydon dan alınmıştır. http://www.delphi3000.com/member.asp?ID=2955   <--
}

unit Aypi;

interface

uses ComObj, ActiveX, UrlMon,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type

 TAypi=class
  private
    fbip:string;
    fbGateway:string;
    fbSubnetMask:string;
    fbFirstDNS:string;
    fbSecondDNS: string;

    procedure SetbFirstDNS(const Value: string);
    procedure SetBGateway(const Value: String);
    procedure SetBip(const Value: String);
    procedure SetbSecondDNS(const Value: string);
    procedure SetBSubenetMask(const Value: String);
    function SetIpConfig(const AIpAddress : string;
                     const AGateWay : string = '';
                     const ASubnetMask : string = '') : integer;
    function SetDnsServers(const APrimaryDNS : string;
                       const AAlternateDNS : string = '') : integer;
    function TestNumbers(strNumber:string):boolean;
  public
    property bip:String read fbip write SetBip;
    property bGateway:String read fbGateway write SetBGateway;
    property bSubnetMask:String read fbSubnetMask write SetBSubenetMask;
    property bFirstDNS:string read fbFirstDNS write SetbFirstDNS;
    property bSecondDNS:string read fbSecondDNS write SetbSecondDNS;
    constructor create;overload;
    constructor create (ip,gateway,subnet,fDNS,sDNS:String);overload;
    procedure SetIp_DNS;
 end;
implementation

{ TAypi }

procedure TAypi.SetbFirstDNS(const Value: string);
begin
  fbFirstDNS := Value;
end;

procedure TAypi.SetBGateway(const Value: String);
begin
  fbGateway := Value;
end;

procedure TAypi.SetBip(const Value: String);
begin
  fbip := Value;
end;

procedure TAypi.SetbSecondDNS(const Value: string);
begin
  fbSecondDNS := Value;
end;

procedure TAypi.SetBSubenetMask(const Value: String);
begin
  fbSubnetMask := Value;
end;
// ==================================================================
// 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 TAypi.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 TAypi.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;

// bu test numaraların 0-255 arasında olup olmadığını test ediyor...
// ilk önce nokta sayısına bakacagız ve bu nokta sonda ve başta olmayacak.
function TAypi.TestNumbers(strNumber: string): boolean;
var
  countDot:integer; // adreslerdeki nokta sayısı = 3 olmak zorunda
  i:integer;
begin
  // nokta testleri baslıyor..
  if (strNumber[1]='.') or (strNumber[length(strNumber)]='.') then
  begin
    result:=False;
    ShowMessage('Girilen adreslerde başta veya sonda nokta var..');
  end else
  begin
    for i:=0 to length(strNumber) do
    begin

    end;
  end;

end;

procedure TAypi.SetIp_DNS;
begin
  SetIpConfig(fbip,fbGateway,fbSubnetMask);
  SetDnsServers(fbFirstDNS,fbSecondDNS);
end;

constructor TAypi.create;
begin
  inherited create ;
  fbip:='192.168.3.115';
  fbGateway:='192.168.3.1';
  fbSubnetMask:='255.255.255.0';
  fbFirstDNS:='4.2.2.4';
  fbSecondDNS:='';
end;

constructor TAypi.create(ip, gateway, subnet, fDNS, sDNS: String);
begin
  inherited create;
  fbip:=ip;
  fbGateway:=gateway;
  fbSubnetMask:=subnet;
  fbFirstDNS:=fDNS;
  fbSecondDNS:=sDNS;
end;

end.
 