3

ネットワークアダプタの静的IPを変更するために現在使用しているコードがいくつかあります。Windows XP 32ビットマシン(物理マシンとVMの両方)で実行する場合、IPアドレスを設定するときにわずかな一時停止(約1秒)がありますが、IPが変更されているように見えます。

Windows 7 64ビットマシンで実行すると、IPアドレスの変更に失敗します。変更を試みても一時停止はなく、例外はスローされません。

私はかなりの量のグーグルを実行しました、そしてほとんどのアドバイスは単に管理者として実行することであるようです。実行可能ファイルを右クリックして[管理者として実行]を選択し、ショートカットを作成して管理者として実行するように設定し、マニフェストファイルを更新しようとしました(管理者権限を要求します)起動しますが、IPアドレスは変更されません。)

誰かアドバイスはありますか?

コードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management; // You will need to add a reference for System.Management!

namespace NetAdapt
{
  class Program
  {
    static void Main(string[] args)
    {
      // First display all network adaptors 
      DisplayNetworkAdaptors(-1);

      // Now try to set static IP, subnet mask and default gateway for adaptor with
      // index of 1 (may be different for your machine!)
      SetIP(1, 
        new string[] { "10.10.1.222" }, 
        new string[] { "255.255.255.0" }, 
        new string[] { "10.10.1.10" });

      // Now display network adaptor settings for adaptor 1 (may be different for your machine!)
      DisplayNetworkAdaptors(1);

      Console.ReadLine();
    }

    private static void SetIP(int index, string[] newIPAddress, string[] newSubnetMask, string[] newGateway)
    {
      ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
      ManagementObjectCollection objMOC = objMC.GetInstances();

      foreach (ManagementObject objMO in objMOC)
      {
        if (!(bool)objMO["IPEnabled"]) continue;

        try
        {
          //Only change for device specified
          if ((uint)objMO["Index"] == index)
          {
            ManagementBaseObject objNewIP = null;
            ManagementBaseObject objSetIP = null;
            ManagementBaseObject objNewGate = null;
            objNewIP = objMO.GetMethodParameters("EnableStatic");
            objNewGate = objMO.GetMethodParameters("SetGateways");

            objNewGate["DefaultIPGateway"] = newGateway;
            objNewIP["IPAddress"] = newIPAddress;
            objNewIP["SubnetMask"] = newSubnetMask;

            objSetIP = objMO.InvokeMethod("EnableStatic", objNewIP, null);
            objSetIP = objMO.InvokeMethod("SetGateways", objNewGate, null);

            Console.WriteLine("Successfully changed IP!");
          }
        }
        catch (Exception ex)
        {
          Console.WriteLine("Exception setting IP: " + ex.Message);
        }
      }
    }

    private static void DisplayNetworkAdaptors(int index)
    {
      ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
      ManagementObjectCollection objMOC = objMC.GetInstances();

      foreach (ManagementObject objMO in objMOC)
      {
        try
        {
          // TCP enabled NICs only
          if (!(bool)objMO["IPEnabled"]) continue;

          // If index is -1 then display all network adaptors, otherwise only
          // display adaptor whose index matches parameter
          if ((index != -1) && ((uint)objMO["Index"] != index)) continue;

          Console.WriteLine("Caption           : " + (string)objMO["Caption"]);
          string[] defaultGateways=(string[])objMO["DefaultIPGateway"];
          if (defaultGateways != null)
          {
            for (int x = 0; x < defaultGateways.Count(); x++)
            {
              Console.WriteLine(string.Format("DefaultIPGateway{0} : {1}", x, defaultGateways[x]));
            }
          }
          else
          {
            Console.WriteLine("DefaultIPGateway  : NULL");
          }
          Console.WriteLine("Description       : " + (string)objMO["Description"]);
          Console.WriteLine("DHCPEnabled       : " + (bool)objMO["DHCPEnabled"]);
          Console.WriteLine("DHCPServer        : " + (string)objMO["DHCPServer"]);
          Console.WriteLine("Index             : " + (uint)objMO["Index"]);
          string[] ipAddresses = (string[])objMO["IPAddress"];
          if (ipAddresses != null)
          {
            for (int x = 0; x < ipAddresses.Count(); x++)
            {
              Console.WriteLine(string.Format("IPAddress{0}        : {1}", x, ipAddresses[x]));
            }
          }
          else
          {
            Console.WriteLine("IPAddress         : NULL");
          }
          Console.WriteLine("IPEnabled         : " + (bool)objMO["IPEnabled"]);
          string[] ipSubnets = (string[])objMO["IPSubnet"];
          if (ipSubnets != null)
          {
            for (int x = 0; x < ipSubnets.Count(); x++)
            {
              Console.WriteLine(string.Format("IPSubnet{0}         : {1}", x, ipSubnets[x]));
            }
          }
          else
          {
            Console.WriteLine("IPSubnet          : NULL");
          }
          Console.WriteLine("MACAddress        : " + (string)objMO["MACAddress"]);
          Console.WriteLine();

        }
        catch (Exception ex)
        {
          Console.WriteLine("Exception getting network adaptors: " + ex.Message);
        }
      }
    }
  }
}
4

1 に答える 1

2

さて、ついにCode Projectから次のことを調べることで、問題に対するある種の解決策を見つけることができました。

http://www.codeproject.com/Articles/19827/Chameleon-Connection-Settings-Manager

上記の作成者のコードでは、次のコードを使用して静的IPを設定します。

objMO.InvokeMethod("EnableStatic", new object[] { newIPAddress, newSubnetMask });
objMO.InvokeMethod("SetGateways", new object[] { newGateway, new string[] { "1" } });

...これはWindows7で正常に動作しますが、WindowsXPでは動作しません。私自身のコードでは、System.Environment.OSVersion.Versionに問い合わせて、XPとWindows7のどちらで実行しているかに応じてIPを設定する方法を選択しました。

于 2012-06-22T15:36:17.283 に答える