Mega Code Archive

 
Categories / Delphi / LAN Web TCP
 

Change IP Address,DNS etc. via WMI API Class

Title: Change IP Address,DNS etc. via WMI API Class Question: In article #4388 Radikal Q3 demonstrates how to set the IP Address,Subnet and Gateway of a network card by EXECUTING NETSH.EXE with parameters. This example shows how to do it via the WMI API OLE Classes. If IP ADDRESS is NULLSTR or 'DHCP' then the IP Address is set by DHCP else a STATIC IP Address is set. Parameters are .. 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'. Examples if SetIpConfig('196.11.175.221') = 0 then ... // Set STATIC IP if SetIpConfig('') = 0 then .. // Set to DHCP if SetupConfig('dhcp') = 0 then ... // Same as above if SetIpConfig('196.11.175.221','196.11.175.1') = 0 then .. // STATIC + GATEWAY **** THERE IS HOWEVER ONE PROBLEM I HAVE ****** **** AND HOPE SOMEONE OUT THERE CAN HELP ****** When setting the adapter to DHCP ALL Mapped drives and printers work correctly as expected. When setting the adapter to STATIC IP, the IP changes successfully but any mapped devices (drives,printers etc.) won't work. Trying to access a mapped drives gives error saying the "local device is already in use'. I don't know if you have to call some sort of network mapping refresh call or something to notify that a static IP address has changed ? Anyone out there have any ideas ? Also shown is SetDnsServers() whereby the DNS Primary and Alternate Servsers may be specified. If the function is called with Null String for APrimaryDNS then the DNS list is cleared. There are many things you can do once you get the oNetAdapter Object. See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_tasks__networking.asp for the help on the SDK. Answer: 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 ------------------------------------------------ *)