Windows下利用Python自動切換IP/DNS

簡介:windows下利用python腳本實現自動切換IP地址,從“自動DHCP獲取IP、自動獲取DNS“切換爲“靜態IP、靜態DNS”

原理:利用windows的WMI管理規範實現

前置條件:python需要安裝wmi,pywin32,其中wmi是依賴於pywin32的

'''
Win32_NetworkAdapterConfiguration類: https://docs.microsoft.com/zh-cn/windows/desktop/CIMWin32Prov/win32-networkadapterconfiguration#properties
'''

import wmi

objNicConfig = None
arrIPAddresses =['192.168.70.120', '192.168.1.56'] # IP地址列表
arrSubnetMasks =['255.255.255.0', '255.255.255.0'] # 子網掩碼列表
arrDefaultGateways =['192.168.70.253'] # 默認網關列表
arrGatewayCostMetrics =[1] #默認網關跳躍點
arrDNSServers =['192.168.70.15', '61.134.1.4'] #DNS服務器列表
intReboot = 0


def GetNicConfig():
    wmiService = wmi.WMI()
    colNicConfigs = wmiService.Win32_NetworkAdapterConfiguration(IPEnabled=True)
    # 根據需要過濾出指定網卡,本只有一個網卡,不做過濾直接獲取第一個
    '''
    for obj in colNicConfigs:
        print(obj.Index)
        print(obj.Description)
        print(obj.SettingID)
    '''
    if len(colNicConfigs) < 1:
        print('沒有找到可用的網絡適配器')
        return False
    else:
        global objNicConfig
        objNicConfig = colNicConfigs[0]
        return True

def SetIP():
    returnValue = objNicConfig.EnableStatic(IPAddress = arrIPAddresses, SubnetMask = arrSubnetMasks)
    if returnValue[0]==0:
        print('設置IP成功')
    elif returnValue[0]==1:
        print('設置IP成功')
        intReboot += 1
    else:
        print('ERROR: IP設置發生錯誤')
        return False
    return True

def SetGateways():
    returnValue = objNicConfig.SetGateways(DefaultIPGateway = arrDefaultGateways, GatewayCostMetric = arrGatewayCostMetrics)
    if returnValue[0]==0:
        print('設置網關成功')
    elif returnValue[0]==1:
        print('設置網關成功')
        intReboot += 1
    else:
        print('ERROR: 網關設置發生錯誤')
        return False
    return True

def SetDNS():
    returnValue = objNicConfig.SetDNSServerSearchOrder(DNSServerSearchOrder = arrDNSServers)
    if returnValue[0]==0:
        print('設置DNS成功')
    elif returnValue[0]==1:
        print('設置DNS成功')
        intReboot += 1
    else:
        print('ERROR: DNS設置發生錯誤')
        return False
    return True

def SetAutoDNS():
    returnValue = objNicConfig.SetDNSServerSearchOrder()
    if returnValue[0]==0:
        print('設置自動獲取DNS成功')
    elif returnValue[0]==1:
        print('設置自動獲取DNS成功')
        intReboot += 1
    else:
        print('ERROR: DNS設置發生錯誤')
        return False
    return True

def SetAutoIP():
    returnValue = objNicConfig.EnableDHCP()
    if returnValue[0]==0:
        print('設置自動獲取IP成功')
    elif returnValue[0]==1:
        print('設置自動獲取IP成功')
        intReboot += 1
    else:
        print('ERROR: IP設置發生錯誤')
        return False
    return True


# 切換爲靜態IP
def EnableStatic():
    return SetIP() and SetGateways() and SetDNS()

# 切換爲自動獲取IP、DNS
def EnableDHCP():
    return SetAutoDNS() and SetAutoIP()
    

def main():
    if not GetNicConfig():
        return False
    
    if objNicConfig.DHCPEnabled:
        print('正在切換爲靜態IP...')
        if EnableStatic():
            if intReboot > 0:
                print('需要重新啓動計算機')
            else:
                print('修改後的配置爲:')
                print('IP: ',', '.join(objNicConfig.IPAddress))
                print('掩碼: ',', '.join(objNicConfig.IPSubnet))
                print('網關: ',', '.join(objNicConfig.DefaultIPGateway))
                print('DNS: ',', '.join(objNicConfig.DNSServerSearchOrder))
                print('修改IP結束')
        else:
            print('請關閉控制面板、以管理員權限運行重試')
    else:
        print('正在切換爲動態IP...')
        if EnableDHCP():
            if intReboot > 0:
                print('需要重新啓動計算機')
            else:
                print('切換爲動態DHCP成功!')
        else:
            print('請關閉控制面板、以管理員權限運行重試')

if __name__ == "__main__":
    main()

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章