Aquí dejo el código, aunque también adjunto un zip con todo el proyecto:
unit ufrmMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TfrmMain = class(TForm) cmbAdapters: TComboBox; btnCambiar: TButton; btnDHCP: TButton; txtIP: TEdit; txtMask: TEdit; txtGateway: TEdit; txtDns1: TEdit; txtDns2: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; procedure FormCreate(Sender: TObject); procedure btnCambiarClick(Sender: TObject); procedure btnDHCPClick(Sender: TObject); procedure cmbAdaptersChange(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmMain: TfrmMain; implementation {$R *.dfm} uses ComObj, ActiveX; procedure TfrmMain.btnCambiarClick(Sender: TObject); var ScriptControl: OleVariant; WmiService: OleVariant; Items: IUnknown; Enum: IEnumVariant; Fetched: Cardinal; Item: OleVariant; Str: String; IPAddress: Variant; SubnetMask: Variant; Gateway: Variant; DNSServer: Variant; begin // Cambiamos los valores if cmbAdapters.ItemIndex >= 0 then begin Str:= Trim(cmbAdapters.Items[cmbAdapters.ItemIndex]); if Str <> EmptyStr then begin ScriptControl:= CreateOleObject('ScriptControl'); ScriptControl.Language := 'VBScript'; WmiService:= ScriptControl.Eval('GetObject("winmgmts:\\.\root\cimv2")'); Items:= WMIService.ExecQuery('Select * from Win32_NetworkAdapterConfiguration where Description=' + QuotedStr(Str))._NewEnum; Enum:= Items as IEnumVariant; Enum.Reset; Enum.Next(1, Item, Fetched); while Fetched = 1 do begin if Trim(VarToStrDef(Item.Description,EmptyStr)) = Str then begin IPAddress:= VarArrayCreate([1,1],varOleStr); SubnetMask:= VarArrayCreate([1,1],varOleStr); Gateway:= VarArrayCreate([1,1],varOleStr); Gateway:= VarArrayCreate([1,1],varOleStr); DNSServer:= VarArrayCreate([1,2],varOleStr); IPAddress[1]:= txtIP.Text; SubnetMask[1]:= txtMask.Text; Gateway[1]:= txtGateway.Text; DNSServer[1]:= txtDns1.Text; DNSServer[2]:= txtDns2.Text; Item.EnableStatic(IPAddress,SubnetMask); Item.SetGateways(GateWay); Item.SetDNSServerSearchOrder(DNSServer); end; Enum.Next(1, Item, Fetched); end; end; end; end; procedure TfrmMain.btnDHCPClick(Sender: TObject); var ScriptControl: OleVariant; WmiService: OleVariant; Items: IUnknown; Enum: IEnumVariant; Fetched: Cardinal; Item: OleVariant; Str: String; begin // Indicamos que se debe usar DHCP if cmbAdapters.ItemIndex >= 0 then begin Str:= Trim(cmbAdapters.Items[cmbAdapters.ItemIndex]); if Str <> EmptyStr then begin ScriptControl:= CreateOleObject('ScriptControl'); ScriptControl.Language := 'VBScript'; WmiService:= ScriptControl.Eval('GetObject("winmgmts:\\.\root\cimv2")'); Items:= WMIService.ExecQuery('Select * from Win32_NetworkAdapterConfiguration where Description=' + QuotedStr(Str))._NewEnum; Enum:= Items as IEnumVariant; Enum.Reset; Enum.Next(1, Item, Fetched); while Fetched = 1 do begin if Trim(VarToStrDef(Item.Description,EmptyStr)) = Str then begin Item.EnableDHCP; Item.SetDNSServerSearchOrder; Item.RenewDHCPLease; end; Enum.Next(1, Item, Fetched); end; end; cmbAdaptersChange(nil); end; end; procedure TfrmMain.cmbAdaptersChange(Sender: TObject); var ScriptControl: OleVariant; WmiService: OleVariant; Items: IUnknown; Enum: IEnumVariant; Fetched: Cardinal; Item: OleVariant; Str: String; IPAddress: Variant; SubnetMask: Variant; Gateway: Variant; DNSServer: Variant; begin // Llenamos los TEdits con los valores actuales if cmbAdapters.ItemIndex >= 0 then begin Str:= Trim(cmbAdapters.Items[cmbAdapters.ItemIndex]); if Str <> EmptyStr then begin ScriptControl:= CreateOleObject('ScriptControl'); ScriptControl.Language := 'VBScript'; WmiService:= ScriptControl.Eval('GetObject("winmgmts:\\.\root\cimv2")'); Items:= WMIService.ExecQuery('Select * from Win32_NetworkAdapterConfiguration where Description=' + QuotedStr(Str))._NewEnum; Enum:= Items as IEnumVariant; Enum.Reset; Enum.Next(1, Item, Fetched); while Fetched = 1 do begin if Trim(VarToStrDef(Item.Description,EmptyStr)) = Str then begin IPAddress:= Item.IPAddress; txtIP.Text:= VarToStrDef(IPAddress[0],EmptyStr); SubnetMask:= Item.IPSubnet; txtMask.Text:= VarToStrDef(SubnetMask[0],EmptyStr); Gateway:= Item.DefaultIPGateway; txtGateway.Text:= VarToStrDef(Gateway[0],EmptyStr); DNSServer:= Item.DNSServerSearchOrder; txtDns1.Text:= VarToStrDef(DNSServer[0],EmptyStr); txtDns2.Text:= VarToStrDef(DNSServer[1],EmptyStr); end; Enum.Next(1, Item, Fetched); end; end; end; end; procedure TfrmMain.FormCreate(Sender: TObject); var ScriptControl: OleVariant; WmiService: OleVariant; Items: IUnknown; Enum: IEnumVariant; Fetched: Cardinal; Item: OleVariant; Str: String; begin // Llenamos el combo con las tarjetas de red cmbAdapters.Clear; ScriptControl:= CreateOleObject('ScriptControl'); ScriptControl.Language := 'VBScript'; WmiService:= ScriptControl.Eval('GetObject("winmgmts:\\.\root\cimv2")'); Items:= WMIService.ExecQuery('Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE')._NewEnum; Enum:= Items as IEnumVariant; Enum.Reset; Enum.Next(1, Item, Fetched); while Fetched = 1 do begin Str:= Trim(VarToStrDef(Item.MACAddress,EmptyStr)); if Str <> EmptyStr then cmbAdapters.Items.Add(Item.Description); Enum.Next(1, Item, Fetched); end; end; end.
*Hace falta ser administrador para cambiar la configuración de red, así que si usas Windows Vista acuerdate de utilizar "Run as administrator"