Как получить список системных IP-адресов в Windows 2008 и .NET, который ВКЛЮЧАЕТ адреса skipassource?

У меня есть код, который отлично работал под Windows 2003 для получения списка IP-адресов, привязанных к серверу:

foreach (IPAddress addr in (Dns.GetHostEntry(Dns.GetHostName())).AddressList)
{
    // Code here to act on each address
}

Когда я запускаю этот код на нашем сервере Windows 2008, он возвращает только один IP-адрес. При дальнейшем расследовании оказалось, что все остальные IP-адреса, которые прослушивает машина, были добавлены с помощью команды netsh int ipv4 add address и с указанием флага skipassource=true.

Есть ли способ включить эти адреса в мой запрос, т.е. вернуть ВСЕ адреса на сервере?

(Если вам интересно, флаг skipassource=true был установлен, потому что Windows 2008 ввела новое поведение в сети, которое позволяет ей решать, какой из ваших IP-адресов она считает «первичным», а остальные наши приложения полагаются на то, что мы можем выбирать Единственный способ сделать это в Windows 2008 — пометить все остальные адреса как skipassource=true.)

Изменить Этот вопрос теперь просто для удовлетворения моего любопытства, так как я работал над решением этой проблемы. Мой исходный код, приведенный выше, использовался для просмотра всех IP-адресов на сервере и проверки того, нашел ли он совпадение с конкретным IP-адресом, который я искал. Теперь я проверяю, работает ли на сервере, на котором я нахожусь, служба, которая прослушивает этот конкретный IP-адрес/порт, поэтому мне больше не нужно перебирать ВСЕ IP-адреса. Тем не менее, мне было бы интересно услышать, есть ли ответ на исходный вопрос.

Изменить Спасибо @aKzenT за решение этой проблемы. Теперь я использую NetworkInteface.GetAllNetworkInterfaces() для доступа ко всем IP-адресам, а не Dns.GetHostEntry(). Мой окончательный код выглядит так:

foreach (NetworkInterface netface in NetworkInterface.GetAllNetworkInterfaces())
{
    foreach (UnicastIPAddressInformation uni in netface.GetIPProperties().UnicastAddresses)
    {
        IPAddress addr = uni.Address;
        // Code here to act on each address
    }
}

person Mason G. Zhwiti    schedule 29.03.2012    source источник
comment
знаете ли вы, как добавить skipassource=true при добавлении адреса с помощью .NET? В настоящее время используется ManagementObject для добавления нового адреса   -  person user815809    schedule 22.10.2012
comment
Извините, я не знаком с тем, как это сделать. Хотя, вероятно, это был бы хороший вопрос о SO.   -  person Mason G. Zhwiti    schedule 22.10.2012
comment
спросил здесь stackoverflow.com/questions/12973074/   -  person user815809    schedule 23.10.2012


Ответы (1)


skipassource предназначен для того, чтобы не включать IP-адрес в систему имен DNS, поэтому я думаю, вам нужно найти другой способ, чем Dns.GetHostEntry

Вы пытались посмотреть пространство имен System.Net.NetworkInformation?

Я думаю, что если вы перебираете адаптеры через GetAllNetworkInterfaces, затем вызываете GetIPProperties, чтобы получить IP-свойства адаптера, а затем проверяете UnicastAddresses, вы можете создать список IP-адресов. Хотя не проверял.

См. также: http://msdn.microsoft.com/de-de/library/system.net.networkinformation.networkinterface.getallnetworkinterfaces.aspx

person aKzenT    schedule 30.03.2012
comment
Спасибо, это работает! Я обновляю свой вопрос своим окончательным кодом. - person Mason G. Zhwiti; 03.04.2012
comment
@aKzenT, ​​знаете ли вы, как добавить skipassource=true при добавлении адреса с помощью .NET? В настоящее время используется ManagementObject для добавления нового адреса. - person user815809; 22.10.2012
comment
@user815809 user815809 Извините, я понятия не имею, как это сделать. Я предлагаю открыть для этого отдельный вопрос, если google не дает вам никакого результата... - person aKzenT; 22.10.2012