How do I disable a network connection using WMI?
If you are using DHCP, use the Win32_NetworkAdapterConfiguration and the ReleaseDHCPLease method to release the IP address. If you are not using DHCP, you cannot use WMI to disable a network connection. To re-enable the network connection, use objNetCard.RenewDHCPLease. You can also release or renew all of the DHCP leases using the ReleaseDHCPLeaseAll and RenewDHCPLeaseAll methods.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = True','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin FWbemObject.ReleaseDHCPLease(); FWbemObject:=Unassigned; end; end;
How do I disable or enable a NIC?
Use the Win32_NetworkAdapter class and the Disable or Enable methods.
//Disable a NIC const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapter Where NetEnabled=True','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin FWbemObject.Disable(); FWbemObject:=Unassigned; end; end;
//Enable a NIC const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapter Where NetEnabled=False','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin FWbemObject.Enable(); FWbemObject:=Unassigned; end; end;
How do I determine which IP address has been assigned to a given network connection?
Use the Win32_NetworkAdapter class and the NetConnectionID property to determine the MAC address of the network connection. Then, use the Win32_NetworkAdapterConfiguration class to find the IP address associated with the MAC address.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; strMACAddress : string; i : Integer; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery(Format('SELECT MACAddress FROM Win32_NetworkAdapter Where NetConnectionID="%s"',['Local Area Connection 2']),'WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; if oEnum.Next(1, FWbemObject, iValue) = 0 then begin strMACAddress:=String(FWbemObject.MACAddress); FWbemObject:=Unassigned; end; FWbemObjectSet:= FWMIService.ExecQuery(Format('SELECT IPAddress FROM Win32_NetworkAdapterConfiguration Where MACAddress="%s"',[strMACAddress]),'WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; if oEnum.Next(1, FWbemObject, iValue) = 0 then begin if not VarIsClear(FWbemObject.IPAddress) then for i := VarArrayLowBound(FWbemObject.IPAddress, 1) to VarArrayHighBound(FWbemObject.IPAddress, 1) do Writeln(Format('IP Address %s',[String(FWbemObject.IPAddress[i])])); FWbemObject:=Unassigned; end; end;
How do I determine the MAC address of a network adapter?
Use the Win32_NetworkAdapterConfiguration class and check the value of the MACAddress property.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT Description,MACAddress FROM Win32_NetworkAdapterConfiguration','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('Description %s',[String(FWbemObject.Description)])); if not VarIsNull(FWbemObject.MACAddress) then Writeln(Format(' MAC Address %s',[String(FWbemObject.MACAddress)])) else Writeln(Format(' MAC Address %s',['Empty'])); FWbemObject:=Unassigned; end; end;
How do I determine the IP address(es) of a computer?
Use the Win32_NetworkAdapterConfiguration class and check the value of the IPAddress property.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; i : Integer; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT IPAddress FROM Win32_NetworkAdapterConfiguration','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin if not VarIsClear(FWbemObject.IPAddress) and not VarIsNull(FWbemObject.IPAddress) then for i := VarArrayLowBound(FWbemObject.IPAddress, 1) to VarArrayHighBound(FWbemObject.IPAddress, 1) do Writeln(Format('IP Address %s',[String(FWbemObject.IPAddress[i])])); FWbemObject:=Unassigned; end; end;
How do I configure a computer to start getting its IP address through DHCP?
Use the Win32_NetworkAdapterConfiguration class and the EnableDHCP method.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=True','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin FWbemObject.EnableDHCP(); FWbemObject:=Unassigned; end; end;
How do I assign a computer a static IP address?
Use the Win32_NetworkAdapterConfiguration class and the EnableStatic method.
function ArrayToVarArray(Arr : Array Of string):OleVariant; overload; var i : integer; begin Result :=VarArrayCreate([0, High(Arr)], varVariant); for i:=Low(Arr) to High(Arr) do Result[i]:=Arr[i]; end; function ArrayToVarArray(Arr : Array Of Word):OleVariant;overload; var i : integer; begin Result :=VarArrayCreate([0, High(Arr)], varVariant); for i:=Low(Arr) to High(Arr) do Result[i]:=Arr[i]; end; procedure SetStaticIP; const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; vIPAddress : OleVariant; vSubnetMask : OleVariant; vDefaultIPGateway : OleVariant; vGatewayCostMetric : OleVariant; begin FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=True','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin vIPAddress := ArrayToVarArray(['192.168.1.141']); vSubnetMask := ArrayToVarArray(['255.255.255.0']); if FWbemObject.EnableStatic(vIPAddress, vSubnetMask) = 0 then begin vDefaultIPGateway := ArrayToVarArray(['192.168.1.100']); vGatewayCostMetric := ArrayToVarArray([1]); FWbemObject.SetGateways(vDefaultIPGateway,vGatewayCostMetric); end; VarClear(vIPAddress); VarClear(vSubnetMask); VarClear(vDefaultIPGateway); VarClear(vGatewayCostMetric); FWbemObject:=Unassigned; end; end;
How do I ping a computer without using Ping.exe?
Use the Win32_PingStatus class. Starting with Windows Vista, Win32_PingStatus can return data for computers that have both IPv4 addresses and IPv6 addresses.
For a delphi sample code check this article Making a PING with Delphi and the WMI.
This post is based in the MSDN entry WMI Tasks: Networking
October 30, 2011 at 8:32 pm
Hi There,
will the “How do I disable a network connection using WMI?” work under Lazarus?
Greets
Leonid
October 30, 2011 at 8:41 pm
Yes wiil work, but the code need some minor changes, try using the WMI Delphi Code Creator tool to create a snippet compatible with Free Pascal.
Pingback: /*Prog*/ Delphi-Neftalí /*finProg*/ » Comienza un nuevo año… (10/01/2012)
April 22, 2014 at 10:48 pm
I need to set a DNS into Nic by delphi its possible?
You can help-me?
April 22, 2014 at 11:05 pm
Just use the code of the How do I assign a computer a static IP address? sample and replace the method WMI EnableStatic by EnableDNS passing the proper parameters.
April 23, 2014 at 12:45 pm
I receive a error message, “Type Mismatch”;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
vIPAddress := ArrayToVarArray([‘8.8.8.8’]);
vSubnetMask := ArrayToVarArray([‘8.8.4.4’]);
if FWbemObject.EnableDNS(vIPAddress, vSubnetMask) = 0 then
begin
ShowMessage(‘Work’);
end;
April 23, 2014 at 12:50 pm
You are not passing the proper parameters , please read the documentation of the WMI method http://msdn.microsoft.com/en-us/library/windows/desktop/aa390380%28v=vs.85%29.aspx
April 23, 2014 at 12:52 pm
Can showme a example how to pass the corrects parameters?
thank you very much my friend, your blog is very good!
Congratulations.
April 23, 2014 at 12:58 pm
Lorenzo, I’m glad which you like my blog, but please you must put some effort on this. Please read the MSDN documentation. You are passing the same parameters of the EnableStatic method. but you must pass these DNSHostName (string), DNSDomain (string), DNSServerSearchOrder (array of string), DNSDomainSuffixSearchOrder (array of string).
Rodrigo.
April 23, 2014 at 1:26 pm
Thanks for help but now i receive a error “Invalid Method”.
But i continue trying.
Thank You.
April 23, 2014 at 1:33 pm
Now work,
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
vIPAddress := ArrayToVarArray([‘8.8.8.8′,’8.4.4.4’]);
if FWbemObject.SetDNSServerSearchOrder(vIPAddress) = 0 then
begin
ShowMessage(‘Work’);
end;
Thank you very much my friend, u have a new fãn hahaha
Congratulations.
March 1, 2018 at 9:48 am
Hi Rodrigo, GREAT site! I’ve successfuly implemented most of this procs in lazarus (with the help of WMI Delphi Code Creator sometimes) Now I´m trying to implement the hability to sense changes in an adapter (enable/disable, ip changed, etc.) I supose this must be achieved through events (WMI Delphi Code Creator gave me some clue) but I’m afraid I’ll need some help with that, any suggestion? Tnx in advance! (btw, do you speak spanish?)
March 1, 2018 at 12:09 pm
Hola, revisa esta entrada que habla exclusivamente de como usar los eventos WMI.
https://theroadtodelphi.com/2011/04/18/delphi-and-wmi-events/
March 2, 2018 at 8:11 am
increible! se me había pasado ese post. Un millón de gracias Rodrigo!
March 1, 2018 at 9:52 am
Hi Rodrigo, GREAT site! I’ve successfuly implemented most of this procs in lazarus (with the help of WMI Delphi Code Creator sometimes) Now I´m trying to implement the hability to sense changes in an adapter (enable/disable, ip changed, etc.) I supose this must be achieved through events (WMI Delphi Code Creator gave me some clue) but I’m afraid I’ll need some help with that, any suggestion? Tnx in advance! (btw, do you speak spanish?)