Обнаружение, если в настройках Windows выбран «Получить IP-адрес автоматически» - PullRequest
0 голосов
/ 21 мая 2018

Я создал приложение winform, которое может определять, устанавливать и переключать настройки IPv4 с помощью C #.Когда пользователь хочет получить IP автоматически от DHCP, я вызываю Automatic_IP():

Automatic_IP:

private void Automatic_IP()
{
    ManagementClass mctemp = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection moctemp = mctemp.GetInstances();

    foreach (ManagementObject motemp in moctemp)
    {
        if (motemp["Caption"].Equals(_wifi)) //_wifi is the target chipset
        {
            motemp.InvokeMethod("EnableDHCP", null);
            break;
        }
    }

    MessageBox.Show("IP successfully set automatically.","Done!",MessageBoxButtons.OK,MessageBoxIcon.Information);

    Getip(); //Gets the current IP address, subnet, DNS etc
    Update_current_data(); //Updates the current IP address, subnets etc into a labels

}

И в методе Getip я извлекаю текущийIP-адрес, подсеть, шлюз и DNS независимо от того, что все это может быть установлено вручную или автоматически назначено DHCP, и обновите эти значения в метках с помощью метода Update_current_data().

Getip:

public bool Getip()
{
    ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection moc = mc.GetInstances();

    foreach (ManagementObject mo in moc)
    {
        if(!chipset_selector.Items.Contains(mo["Caption"]))
            chipset_selector.Items.Add(mo["Caption"]);

        if (mo["Caption"].Equals(_wifi))
        {
            ipadd = ((string[])mo["IPAddress"])[0];
            subnet = ((string[])mo["IPSubnet"])[0];
            gateway = ((string[])mo["DefaultIPGateway"])[0];
            dns = ((string[])mo["DNSServerSearchOrder"])[0];
            break;
        }

    }
}

Но проблема в том, что я не могу определить, был ли текущий IP установлен вручную или назначен автоматически, хотя я могу выбрать выбрать автоматически из DHCP из метода Automatic_IP,ManagementObject.InvokeMethod("EnableDHCP", null); может легко установить его на получать IP-адрес автоматически , но у меня нет возможности проверить, установлен ли IP автоматически или вручную при первом запуске приложения.

Я немного покопался инайдено похожих сообщений, таких как this .Хотя очень похожий пост существует здесь , но это касается DNS, а не настроек IP.

В основном я хочу найти, какая опция выбрана:

Automatic

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Альтернативный метод с использованием NetworkInformation класс:

using System.Net.NetworkInformation;

NetworkInterface[] Interfaces = NetworkInterface.GetAllNetworkInterfaces();
IPInterfaceProperties IPProperties = Interfaces[0].GetIPProperties();
IPv4InterfaceProperties IpV4Properties = IPProperties.GetIPv4Properties();
bool DhcpEnabed = IpV4Properties.IsDhcpEnabled;

Все сетевые интерфейсы с включенным DHCP и их IP-адрес:

List<NetworkInterface> DhcpInterfaces = Interfaces
    .Where(IF => (IF.Supports(NetworkInterfaceComponent.IPv4)) &&
          (IF.GetIPProperties().GetIPv4Properties().IsDhcpEnabled))
    .ToList();

if (DhcpInterfaces != null)
{
    IEnumerable<UnicastIPAddressInformation> IpAddresses = 
        DhcpInterfaces.Select(IF => IF.GetIPProperties().UnicastAddresses.Last());
}

Типовой класс для сбора и проверки некоторых (ограниченное количество) информации, которую может предоставить класс NetworkInformation:

using System.Net.NetworkInformation;

public class NetWorkInterfacesInfo
{
    public string Name { get; set; }
    public string Description { get; set; }
    public PhysicalAddress MAC { get; set; }
    public List<IPAddress> IPAddresses { get; set; }
    public List<IPAddress> DnsServers { get; set; }
    public List<IPAddress> Gateways { get; set; }
    public bool DHCPEnabled { get; set; }
    public OperationalStatus Status { get; set; }
    public NetworkInterfaceType InterfaceType { get; set; }
    public Int64 Speed { get; set; }
    public Int64 BytesSent { get; set; }
    public Int64 BytesReceived { get; set; }
}

List<NetWorkInterfacesInfo> NetInterfacesInfo = new List<NetWorkInterfacesInfo>();

NetInterfacesInfo = DhcpInterfaces.Select(IF => new NetWorkInterfacesInfo()
{
    Name = IF.Name,
    Description = IF.Description,
    Status = IF.OperationalStatus,
    Speed = IF.Speed,
    InterfaceType = IF.NetworkInterfaceType,
    MAC = IF.GetPhysicalAddress(),
    DnsServers = IF.GetIPProperties().DnsAddresses.Select(ipa => ipa).ToList(),
    IPAddresses = IF.GetIPProperties().UnicastAddresses.Select(ipa => ipa.Address).ToList(),
    Gateways = IF.GetIPProperties().GatewayAddresses.Select(ipa => ipa.Address).ToList(),
    DHCPEnabled = IF.GetIPProperties().GetIPv4Properties().IsDhcpEnabled,
    BytesSent = IF.GetIPStatistics().BytesSent,
    BytesReceived = IF.GetIPStatistics().BytesReceived
}).ToList();

Статистические характеристики:

IPGlobalStatistic
TcpConnectionInformation
IPInterfaceStatistics

События:

NetworkChange
NetworkAddressChanged
NetworkAvailabilityChanged

Утилиты:
Пинг

0 голосов
/ 21 мая 2018

Класс ManagementObject имеет набор свойств , которые вы можете использовать, и для сетевых адаптеров один из них называется DHCPEnabled.Это говорит вам, если сетевой интерфейс получает IP-адрес автоматически.Например:

var isDHCPEnabled = (bool)motemp.Properties["DHCPEnabled"].Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...