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.
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?)