Mahyar.FF Ответов: 2

Как очистить шлюз TCP/IP с помощью WMI в Vista / Server 2008?


Привет,

Сейчас я пишу это, я прочитал около 30 страниц в интернете и не нашел ничего приемлемого.

Я написал код с помощью WMI(Win32_NetworkAdapterConfigurationonfiguration) в VB.Net, который устанавливает и очищает шлюз / DNS для конкретного сетевого адаптера IPEnabled.
Этот код отлично работает на сервере Windows XP/2003, но в Vista / Server 2008 он все равно не может очистить шлюз.
Я попытался передать нулевой массив методу SetGatways, но ничего не получилось
пытался передать нулевой массив для GatewayCostMetrics, безуспешно.
Я тоже пытался wbemtest.exe чтобы выполнить метод непосредственно, но это тоже не помогает.

Я не знаю, Ошибка это или нет, но каждая статья, которую я читал в Службе поддержки microsoft, заканчивалась безрезультатно.

Здесь я напишу 2 блока кода VBScript,
первый запишет шлюз / DNS на предпочтительный сетевой адаптер IPEnabled, а второй попытается очистить их.

Я ценю любую помощь в этом вопросе.

Шлюз/ДНС установить код:
strComputer = "."
arrDefaultGateways = Array("192.168.0.1")
arrGatewayCostMetrics = Array(1) ' uint16
arrDNSServers = Array("192.168.0.1")
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
    ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
For Each objNicConfig In colNicConfigs
    If objNicConfig.IPEnabled Then
        strText = objNicConfig.Description & vbNewLine _
            & objNicConfig.MACAddress & vbNewLine & vbNewLine _
            & "Do you want to change Gateway/DNS of this NIC?"
        strTitle = "Question..."
        intMsg = MsgBox(strText,vbYesNo,strTitle)
        Select Case intMsg
            Case 6 'yes
                intGWReturn = objNicConfig.SetGateways(arrDefaultGateways, _
                    arrGatewayCostMetrics)
                intDNSReturn = objNicConfig.SetDNSServerSearchOrder(arrDNSServers)
                If (intGWReturn + intDNSReturn = 0) Then
                    WScript.Echo "Successful"
                Else
                    WScript.Echo "Gateway Return code= "  & intGWReturn _
                        & vbNewLine & "DNS Return code= " & intDNSReturn
                End If
                Exit For
            Case 7 'no
        End Select
    End If
Next


Шлюз / DNS Clear code:
strComputer = "."
arrDefaultGateways = Array() 	' < Empty Array
arrGatewayCostMetrics = Array() ' < Empty Array
arrDNSServers = Array() 		' < Empty Array
Set objWMIService = GetObject("winmgmts:" _
	& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
	("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
For Each objNicConfig In colNicConfigs
	If objNicConfig.IPEnabled Then
		strText = objNicConfig.Description & vbNewLine _
			& objNicConfig.MACAddress & vbNewLine & vbNewLine _
			& "Do you want to change Gateway/DNS of this NIC?"
		strTitle = "Question..."
		intMsg = MsgBox(strText,vbYesNo,strTitle)
		Select Case intMsg
			Case 6 'yes
				intGWReturn = objNicConfig.SetGateways(arrDefaultGateways, _
					arrGatewayCostMetrics)
				intDNSReturn = objNicConfig.SetDNSServerSearchOrder(arrDNSServers)
				If (intGWReturn + intDNSReturn = 0) Then
					WScript.Echo "Successful"
				Else
					WScript.Echo "Gateway Return code= "  & intGWReturn _
						& vbNewLine & "DNS Return code= " & intDNSReturn
				End If
				Exit For
			Case 7 'no
		End Select
	End If
Next

2 Ответов

Рейтинг:
2

sclementi

Привет,
У меня была та же проблема в C#. Я сделал следующее:
Сначала я включил DHCP.Затем я копирую список Geatways в массив.
После этого я сбросил Geatway вручную до последнего значения массива (которое всегда является шлюзом, полученным от DHCP-сервера).
В качестве последнего шага я снова включаю DHCP.

Вот мой код на языке Си#:

ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
			ManagementObjectCollection moc = mc.GetInstances();
			foreach(ManagementObject mo in moc)
			{
				// Make sure this is a IP enabled device. Not something like memory card or VM Ware
				if( (bool)mo["IPEnabled"] )
				{
					if( mo["Caption"].Equals( nicName ) )
					{
                        //Enable DHCP         
                        ManagementBaseObject newDNS = mo.GetMethodParameters( "SetDNSServerSearchOrder" );
						newDNS[ "DNSServerSearchOrder" ] = null;
						ManagementBaseObject enableDHCP = mo.InvokeMethod( "EnableDHCP", null, null);
						ManagementBaseObject setDNS = mo.InvokeMethod( "SetDNSServerSearchOrder", newDNS, null);
                        //Save all Gateways into an array
                        string[] gateways = (string[])mo["DefaultIPGateway"];
                       
                        ManagementBaseObject newIP = mo.GetMethodParameters("EnableStatic");                 
                        ManagementBaseObject newGate = mo.GetMethodParameters("SetGateways");
                                               
                        //Set last value of the array(always the Gateway recived by DHCP) as the default Gateway
                        newGate["DefaultIPGateway"] = new string[] {gateways[gateways.Length-1]};                   
                        newGate["GatewayCostMetric"] = new int[] { 1 };
                        //Set IP settings back to static
                        ManagementBaseObject setIP = mo.InvokeMethod("EnableStatic", newIP, null);
                        ManagementBaseObject setGateways = mo.InvokeMethod("SetGateways", newGate, null);
                        //Enable DHCP  again
                        newDNS["DNSServerSearchOrder"] = null;
                        ManagementBaseObject enableDHCP2 = mo.InvokeMethod("EnableDHCP", null, null);
                        ManagementBaseObject setDNS2 = mo.InvokeMethod("SetDNSServerSearchOrder", newDNS, null);
					}
				}
			}


Может быть, это не самый элегантный способ, но он работает


Рейтинг:
1

BornToBeRoot

На основе другого решения, но это будет игнорировать IPv6 и без DNS...

1) включить DHCP
2) RenewDHCPLease
3) FixGateway()

public static void FixGateway(string networkInterfaceId)
        {
            foreach (ManagementObject adapter in new ManagementClass("Win32_NetworkAdapterConfiguration").GetInstances())
            {
                if (adapter["SettingID"] as string == networkInterfaceId)
                {
                    string[] gateways = (string[])adapter["DefaultIPGateway"];

                    string gateway = string.Empty;

                    foreach (string gw in gateways)
                    {
                        if (IPAddress.Parse(gw).AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                            gateway = gw;
                    }

                    ManagementBaseObject newIP = adapter.GetMethodParameters("EnableStatic");

                    adapter.InvokeMethod("EnableStatic", newIP, null);

                    ManagementBaseObject newGateway = adapter.GetMethodParameters("SetGateways");

                    newGateway["DefaultIPGateway"] = new string[] { gateway };
                    newGateway["GatewayCostMetric"] = new int[] { 1 };
                    
                    adapter.InvokeMethod("SetGateways", newGateway, null);

                    adapter.InvokeMethod("EnableDHCP", null, null);
                }
            }
        }