|
|
Работа с DNS в .NET. Часть 2 - получение адреса ло
Работа с DNS в .NET. Часть 2 - получение адреса локального DNS сервера
В предыдущей своей статье я рассказал вам как написать объект, выполяющий любые запросы к DNS серверу из ващего .NET приложения. С тех пор прошло уже немало веремени, да и выход .NET Framework Beta 2 заставляет всех разработчиков переписывать свои приложения. Пришла и мне пора поработать с классом DNSQuery. А заодно и добавить к нему некоторую функциональность - при создании экземпляра класса сразу же устанавливать его свойство DNSServer.
Изменения, сделанные мной для приведения класса DNSQuery к удобоваримому виду, пригодному для использования в .NET Framework Beta 2 были незначительными и косметическими (напимер, изменение кода, связанного с конвертацией одного типа перемененых в другой - теперь эти действия производятся с помощью соответствующих методов класса Convert
Более сложной задачей оказалась задача нахождения адреса DNS сервера для локальной машины. При первом рассмотрении этой проблемы я нашел только один способ сделать это. В библиотеке iphlpapi, входящей в состав операционных систем Windows 98 и выше и Windows 2000, есть функция GetNetworkParams, возвращающая в числе прочих параметров и адреса DNS серверов для локальной машины. Но мои попытки выполнить вызов этой функции из .NET ни к чему не привели (кстати, буду очень благодарен если кто-то сможет помочь мне в написании кода, вызывающего именно эту функцию). Пришлось продолжать поиски.
В результате проведенных поисков и благодаря помощи Rich Dominguez выяснилось следующее:
- Имена DNS серверов для локальной машины можно найти в глубинах реестра (ну это и естесственно - куда Windows от реестра убежать :))
- Конкретно имена DNS серверов можно найти в ветви HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
- Имена DNS серверов могут быть значениями переменных DhcpNameServer и NameServer вышеуказанной ветви, а также значениями NameServer в ветвях подветви Interfaces вышеуказанной ветви
Исходя из того, что нам нужно получить адрес любого DNS сервера для локальной машины будем считать наш поиск завершенным при нахождении первого непустого значения из вышеуказанных. При этом сначала проверяются значения DhcpNameServer и NameServer для ветви HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\Interfaces и если имени DNS сервера не найдено - происходит поиск значений в подветвях ветви Interfaces. Код, выплняющий это действие, приведен ниже:
private string getDNSServer()
{
//Открываем необходимую нам ветвь регистра
RegistryKey DNSServerKey = Registry.LocalMachine.OpenSubKey(
"System\\CurrentControlSet\\Services\\Tcpip\\Parameters");
string sDNSServer = "";
string[] arDNSServers;
string tempStr;
//Пробуем получить значение DhcpNameServer
try
{
tempStr = DNSServerKey.GetValue("DhcpNameServer").ToString();
}
catch
{
tempStr = "";
}
//Если все нормально - получаем адрес DNS сервера и возвращаем значение
if (tempStr != null && tempStr != "")
{
arDNSServers = tempStr.Split(" ".ToCharArray());
sDNSServer = arDNSServers[0];
DNSServerKey.Close();
return sDNSServer;
}
//Те же самые операции проделываем для значения NameServer
try
{
tempStr = DNSServerKey.GetValue("NameServer").ToString();
}
catch
{
tempStr = "";
}
if (tempStr != null && tempStr != "")
{
arDNSServers = tempStr.Split(" ".ToCharArray());
sDNSServer = arDNSServers[0];
DNSServerKey.Close();
return sDNSServer;
}
//Не нашли ни одного DNS сервера - ищем в подветвях Interfaces
DNSServerKey.Close();
DNSServerKey = Registry.LocalMachine.OpenSubKey(
"System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces");
//Получаем массив имен подветвей Interfaces Для последующей обработе в цикле
string[] iface = DNSServerKey.GetSubKeyNames();
for (int i = 0; i < iface.Length; i++)
{
//Открываем подветвь
RegistryKey ifaceKey = DNSServerKey.OpenSubKey(iface[i]);
string servers;
//Пытаемся найти имя DNS сервера в значении NameServer.
try
{
servers = ifaceKey.GetValue("NameServer").ToString();
}
catch
{
servers = "";
}
if(servers != "")
{
arDNSServers = servers.ToString().Split(",".ToCharArray());
sDNSServer = arDNSServers[0];
if (sDNSServer != "")
{
ifaceKey.Close();
break;
}
}
ifaceKey.Close();
}
DNSServerKey.Close();
if (sDNSServer != "")
return sDNSServer;
else
//Если так и не нашли имени DNS сервера - генерим исключение.
throw new Exception("This computer has no configured DNS Server!");
}
} |
Код класса DNSQuery и утилиты для проверки его работоспособности можете скачать здесь
Далі буде...
Dimon aka Manowar (dotSITE Team)
|