利用WMI修改本机Gateway,DNS

以下的VB Script代码利用WMI修改本机的Gateway,DNS设置(将下面的代码存成 .VBS文件直接双击运行即可).

Const STR_NEWDNS1 = "192.168.0.1"
Const STR_NEWDNS2 = "192.168.0.43"
Const STR_GATEWAY = "192.168.0.1"

Set fs = CreateObject("Scripting.FileSystemObject")
Set outFile = fs.CreateTextFile("NetworkAdapterConfiguration.txt", True)

strWinMgmt = "winmgmts:{impersonationLevel=impersonate}"
Set objNICs = GetObject( strWinMgmt ).InstancesOf( "Win32_NetworkAdapterConfiguration" )

outFile.WriteLine("Begin to change DNS...")

For Each objNIC In objNICs
 If objNIC.IPEnabled Then
  objNIC.SetDNSServerSearchOrder Array(STR_NEWDNS1,STR_NEWDNS2)
  outFile.WriteLine(objNIC.Description & "  ")
  outFile.WriteLine("Change DNS ok")
  objNIC.SetGateways Array(STR_GATEWAY)
  outFile.WriteLine("Change gateway ok")
 End If
Next
outFile.WriteLine("Change over")

<think>我们之前已经获取了适配器的IP地址,现在需要进一步获取子网掩码(mask)、默认网关(gateway)和DNS服务器(dns server)信息。 在WMI中,我们可以通过适配器对象的以下属性获取: - IPSubnet: 子网掩码(可能有多个,与IP地址对应) - DefaultIPGateway: 默认网关(通常是一个字符串列表,可能有多个网关) - DNSServerSearchOrder: DNS服务器列表(按顺序排列) 注意:这些属性都是可选的,可能为空。因此,在访问时需要做空值判断。 步骤: 1. 遍历适配器列表。 2. 对于每个适配器,获取其IPSubnet、DefaultIPGatewayDNSServerSearchOrder属性。 3. 由于一个适配器可能有多个IP地址,因此子网掩码也可能有多个(与IP地址一一对应)。我们通常取第一个IPv4地址对应的子网掩码。 4. 默认网关和DNS服务器都是列表形式,我们可以取第一个非空值,或者将整个列表赋值给变量。 具体实现: 假设我们已经有了适配器对象`adapter`,我们可以这样获取: - 子网掩码(mask): ```python masks = adapter.IPSubnet mask = "N/A" if masks: # 通常,子网掩码列表与IP地址列表一一对应。我们之前取了第一个IPv4地址,所以我们也取第一个子网掩码(假设是IPv4的) # 但注意:IPSubnet可能同时包含IPv4和IPv6的子网掩码,所以我们需要过滤出与之前获取的IP地址类型对应的子网掩码? # 不过,由于我们之前已经获取了IPv4地址,我们可以假设子网掩码列表中同样位置的掩码就是对应的。 # 但是,更安全的方法是:我们同时获取IP地址和子网掩码,然后根据IP地址的版本来对应。 # 简单处理:取第一个掩码(如果我们的IPv4地址也是第一个,那么通常是对应的) mask = masks[0] ``` 但是,更精确的做法是:我们之前获取了IPv4地址,那么我们也应该从子网掩码中获取IPv4的子网掩码。我们可以通过判断子网掩码字符串中是否包含冒号(:)来区分IPv6(IPv6掩码通常用冒号分隔)。不过,我们也可以直接使用之前过滤IPv4地址的方法。 然而,由于IPSubnet列表的顺序与IPAddress列表的顺序一致,我们可以这样: ```python # 之前我们获取了第一个IPv4地址,那么我们也需要获取对应位置的子网掩码 ip_addresses = adapter.IPAddress masks = adapter.IPSubnet mask = "N/A" if ip_addresses and masks and len(ip_addresses) == len(masks): # 找到第一个IPv4地址的位置 for idx, ip in enumerate(ip_addresses): if '.' in ip: mask = masks[idx] break ``` - 默认网关(gateway): ```python gateways = adapter.DefaultIPGateway gateway = "N/A" if gateways: # 通常默认网关是IPv4地址,所以我们取第一个看起来像IPv4的地址 for gw in gateways: if '.' in gw: gateway = gw break # 或者直接取第一个(如果确定第一个就是IPv4) # gateway = gateways[0] ``` - DNS服务器(dns_servers): ```python dns_servers = adapter.DNSServerSearchOrder dns_list = [] # 或者用"N/A"表示,但这里我们用一个列表来存储 if dns_servers: # 过滤出IPv4的DNS服务器 dns_list = [dns for dns in dns_servers if '.' in dns] # 如果只需要第一个,可以取dns_list[0] ``` 完整代码示例: ```python # 初始化列表,用于存储每个适配器的信息 adapters_info = [] for i, adapter in enumerate(adapters, 1): description = adapter.Description mac_address = adapter.MACAddress if adapter.MACAddress else "N/A" # 获取IP地址和子网掩码 ip_addresses = adapter.IPAddress masks = adapter.IPSubnet if hasattr(adapter, 'IPSubnet') else [] ipv4_address = "N/A" mask = "N/A" if ip_addresses: # 找到第一个IPv4地址 for idx, ip in enumerate(ip_addresses): if '.' in ip: ipv4_address = ip # 如果子网掩码列表存在且长度足够,则获取对应位置的子网掩码 if masks and len(masks) > idx: mask = masks[idx] break # 获取默认网关 gateways = adapter.DefaultIPGateway if hasattr(adapter, 'DefaultIPGateway') else [] gateway = "N/A" if gateways: for gw in gateways: if '.' in gw: gateway = gw break # 获取DNS服务器列表 dns_servers = adapter.DNSServerSearchOrder if hasattr(adapter, 'DNSServerSearchOrder') else [] dns_list = [] if dns_servers: dns_list = [dns for dns in dns_servers if '.' in dns] # 只取IPv4的DNS # 将信息存入字典 adapter_info = { 'description': description, 'mac_address': mac_address, 'ipv4_address': ipv4_address, 'subnet_mask': mask, 'gateway': gateway, 'dns_servers': dns_list } adapters_info.append(adapter_info) # 打印信息 print(f"适配器 {i}: {description}") print(f" MAC地址: {mac_address}") print(f" IPv4地址: {ipv4_address}") print(f" 子网掩码: {mask}") print(f" 默认网关: {gateway}") print(f" DNS服务器: {', '.join(dns_list) if dns_list else 'N/A'}") # 现在,adapters_info列表包含了所有适配器的信息 # 例如,获取第一个适配器的网关:adapters_info[0]['gateway'] ``` 注意: 1. 使用`hasattr`检查属性是否存在,因为某些适配器可能没有这些属性。 2. 默认网关和DNS服务器可能有多个,这里我们只取了IPv4的第一个默认网关,而DNS服务器我们取了所有IPv4的地址。 3. 对于子网掩码,我们通过匹配IPv4地址的位置来获取对应的掩码。 如果适配器没有启用IP(比如禁用状态),那么这些属性可能为空。所以需要做空值判断。 另外,有些适配器可能有多个IPv4地址(多个IP绑定),上述代码只取了第一个IPv4地址及其掩码。如果需要所有IPv4地址,可以修改为列表存储。 最后,将获取的信息赋值给变量: - 例如,将当前适配器的子网掩码赋值给变量`current_mask`:`current_mask = mask` - 将网关赋值给`current_gateway`:`current_gateway = gateway` - 将DNS服务器列表赋值给`current_dns_servers`:`current_dns_servers = dns_list` 这样,我们就完成了从适配器中获取子网掩码、默认网关和DNS服务器信息并赋值给对应变量的过程。 引用说明:在配置网络时,服务器通常需要绑定静态IP地址,而普通PC则可以通过DHCP获取动态IP地址[^1]。</think>### 从网络适配器获取子网掩码、网关和DNS服务器信息 在Python中,通过`win32com.client`获取网络适配器的完整网络配置信息,包括子网掩码、网关和DNS服务器。以下是完整的实现方法: ```python import win32com.client def get_network_info(): # 创建WMI对象 wmi = win32com.client.GetObject("winmgmts:") # 查询网络适配器配置 adapters = wmi.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True") network_info = [] for adapter in adapters: # 获取IP地址和子网掩码 ip_address = adapter.IPAddress[0] if adapter.IPAddress else "N/A" subnet_mask = adapter.IPSubnet[0] if adapter.IPSubnet else "N/A" # 获取默认网关 gateway = adapter.DefaultIPGateway[0] if adapter.DefaultIPGateway else "N/A" # 获取DNS服务器 dns_servers = list(adapter.DNSServerSearchOrder) if adapter.DNSServerSearchOrder else ["N/A"] # 将信息存入字典 adapter_info = { 'description': adapter.Description, 'ip_address': ip_address, 'subnet_mask': subnet_mask, 'gateway': gateway, 'dns_servers': dns_servers } network_info.append(adapter_info) return network_info # 使用示例 if __name__ == "__main__": adapters_info = get_network_info() for i, adapter in enumerate(adapters_info, 1): print(f"适配器 {i}: {adapter['description']}") print(f" IP地址: {adapter['ip_address']}") print(f" 子网掩码: {adapter['subnet_mask']}") print(f" 默认网关: {adapter['gateway']}") print(f" DNS服务器: {', '.join(adapter['dns_servers'])}") print("-" * 50) ``` #### 关键变量赋值说明: 1. **子网掩码(Subnet Mask)赋值**: ```python subnet_mask = adapter.IPSubnet[0] if adapter.IPSubnet else "N/A" ``` 2. **默认网关(Default Gateway)赋值**: ```python gateway = adapter.DefaultIPGateway[0] if adapter.DefaultIPGateway else "N/A" ``` 3. **DNS服务器列表赋值**: ```python dns_servers = list(adapter.DNSServerSearchOrder) if adapter.DNSServerSearchOrder else ["N/A"] ``` #### 注意事项: 1. **多IP地址处理**: - 适配器可能有多个IP地址和对应的子网掩码 - 使用索引`[0]`获取主IP和主掩码 ```python # 获取所有IPv4地址和掩码 ipv4_addresses = [ip for ip in adapter.IPAddress if '.' in ip] ipv4_masks = [mask for mask in adapter.IPSubnet if '.' in mask] ``` 2. **网关和DNS的多值处理**: ```python # 获取所有网关 all_gateways = list(adapter.DefaultIPGateway) if adapter.DefaultIPGateway else [] # 获取所有DNS服务器 all_dns_servers = list(adapter.DNSServerSearchOrder) if adapter.DNSServerSearchOrder else [] ``` 3. **IPv6地址过滤**: ```python # 只获取IPv4配置 if '.' in adapter.IPAddress[0]: ipv4_info = { 'ip': adapter.IPAddress[0], 'mask': adapter.IPSubnet[0] } ``` #### 不同网络配置场景: 1. **DHCP自动获取**: ```python is_dhcp_enabled = adapter.DHCPEnabled dhcp_server = adapter.DHCPServer if is_dhcp_enabled else "N/A" ``` 2. **静态IP配置**: ```python if not adapter.DHCPEnabled: static_ip = adapter.IPAddress[0] static_gateway = adapter.DefaultIPGateway[0] ``` 3. **DNS配置类型**: ```python # 检查DNS是否通过DHCP获取 dns_from_dhcp = adapter.DNSHostNameFromDHCP if hasattr(adapter, 'DNSHostNameFromDHCP') else False ``` 在服务器环境中,通常需要绑定静态IP地址以确保服务的稳定性,而普通PC则可以通过DHCP获取动态IP地址[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值