C++ WMI 修改PC ip地址,子網掩碼,網關
網上介紹此中操作方式,也有不少,不過相對VB.net和C#就比較少,說的也不到位;
(爲什麼採用這種方式,因爲採用修改註冊表,通知網絡適配器(DhcpNotifyConfigChange)的方式,不支持Vista,和Windows7操作系統,爲此才採用這種方式);
講解一下基本流程:
CoInitializeEx
CoInitializeSecurity
CoCreateInstance
ConnectServer
GetMethod
SpawnInstance
SafeArrayCreate
SafeArrayPutElement
pInParams->Put
ExecMethod
以上是基本流程;
對於本地PC有多個網卡的,如何解決啊;
解決方式:
1.通過GetAdaptersInfo獲取,IP_ADAPTER_INFO結構體中AdaterName;(參考:不重起Windows直接更改IP地址
http://www.vckbase.com/document/viewdoc/?id=851)
2.在通過Win32_NetworkAdapterConfiguration 中的SettingID等於 AdaterName查詢出index;
3.通過index,保存(Put)到相應的值;
注意的問題:
class Win32_NetworkAdapterConfiguration : CIM_Setting { boolean ArpAlwaysSourceRoute ; boolean ArpUseEtherSNAP ; string Caption ; string DatabasePath ; boolean DeadGWDetectEnabled ; string DefaultIPGateway[] ; uint8 DefaultTOS ; uint8 DefaultTTL ; string Description ; boolean DHCPEnabled ; datetime DHCPLeaseExpires ; datetime DHCPLeaseObtained ; string DHCPServer ; string DNSDomain ; string DNSDomainSuffixSearchOrder[] ; boolean DNSEnabledForWINSResolution ; string DNSHostName ; string DNSServerSearchOrder[] ; boolean DomainDNSRegistrationEnabled ; uint32 ForwardBufferMemory ; boolean FullDNSRegistrationEnabled ; uint16 GatewayCostMetric[] ; uint8 IGMPLevel ; uint32 Index ; string IPAddress[] ; uint32 IPConnectionMetric ; boolean IPEnabled ; boolean IPFilterSecurityEnabled ; boolean IPPortSecurityEnabled ; string IPSecPermitIPProtocols[] ; string IPSecPermitTCPPorts[] ; string IPSecPermitUDPPorts[] ; string IPSubnet[] ; boolean IPUseZeroBroadcast ; string IPXAddress ; boolean IPXEnabled ; uint32 IPXFrameType[] ; uint32 IPXMediaType ; string IPXNetworkNumber[] ; string IPXVirtualNetNumber ; uint32 KeepAliveInterval ; uint32 KeepAliveTime ; string MACAddress ; uint32 MTU ; uint32 NumForwardPackets ; boolean PMTUBHDetectEnabled ; boolean PMTUDiscoveryEnabled ; string ServiceName ; string SettingID ; uint32 TcpipNetbiosOptions ; uint32 TcpMaxConnectRetransmissions ; uint32 TcpMaxDataRetransmissions ; uint32 TcpNumConnections ; boolean TcpUseRFC1122UrgentPointer ; uint16 TcpWindowSize ; boolean WINSEnableLMHostsLookup ; string WINSHostLookupFile ; string WINSPrimaryServer ; string WINSScopeID ; string WINSSecondaryServer ; };
說明:
Methods:
EnableStatic(修改IP地址和子網掩碼)對應Win32_NetworkAdapterConfiguration 中的IPAddress和SubnetMask;
上面兩個要單獨使用,用ExecMethod調用了EnableDHCP就不要調用EnableStatic,在執行過程中容易使PC產生兩個IP地址(Windows7);
SetGateways 設置網關的方法:對應Win32_NetworkAdapterConfiguration 中的DefaultIPGateway;
用此種方法(WMI)就不要用,修改註冊表的方式來修改IP地址其它參數了。