Как получить полное доменное имя локальной машины на C #?
Ответы:
ПРИМЕЧАНИЕ. Это решение работает только при нацеливании на платформы .NET 2.0 (и новее).
using System;
using System.Net;
using System.Net.NetworkInformation;
//...
public static string GetFQDN()
{
string domainName = IPGlobalProperties.GetIPGlobalProperties().DomainName;
string hostName = Dns.GetHostName();
domainName = "." + domainName;
if(!hostName.EndsWith(domainName)) // if hostname does not already include domain name
{
hostName += domainName; // add the domain name part
}
return hostName; // return the fully qualified name
}
ОБНОВИТЬ
Поскольку многие люди отметили, что ответ Сэма более лаконичен, я решил добавить несколько комментариев к ответу.
Самое важное, что нужно отметить, это то, что приведенный мной код не эквивалентен следующему коду:
Dns.GetHostEntry("LocalHost").HostName
Хотя в общем случае, когда компьютер подключен к сети и является частью домена, оба метода обычно дают одинаковый результат, в других сценариях результаты будут отличаться.
Сценарий, при котором вывод будет другим, - это когда машина не является частью домена. В этом случае Dns.GetHostEntry("LocalHost").HostName
будет возвращаться в localhost
то время как GetFQDN()
метод выше возвращает имя NETBIOS хоста.
Это различие важно, когда целью поиска FQDN машины является регистрация информации или создание отчета. Большую часть времени я использовал этот метод в журналах или отчетах, которые впоследствии использовались для сопоставления информации с конкретной машиной. Если машины не подключены к сети, localhost
идентификатор бесполезен, тогда как имя дает необходимую информацию.
Таким образом, в конечном итоге каждый пользователь должен решать, какой метод лучше подходит для его приложения, в зависимости от того, какой результат им нужен. Но сказать, что этот ответ неверен из-за того, что он недостаточно краток, в лучшем случае поверхностно.
См. Пример, в котором результат будет другим: http://ideone.com/q4S4I0
Dns.GetHostName()
for hostName
вместо использования HostName
свойства IPGlobalProperties
объекта, который у вас уже есть, на одну строку выше?
IPGlobalProperties
свойство hostname возвращает имя NetBIOS, тогда как Dns.GetHostName()
возвращает имя хоста DNS.
EndsWith
чек сломана для имен хостов , которые заканчиваются с теми же буквами, что доменное имя (например, хост MyHost в домене ОСТ), следует , вероятно,EndsWith("." + domainName)
hostName.
. Должен быть !String.isNullorEmpty(domainName)
чек
Небольшое упрощение кода Miky D
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
.Trim(".")
в последнюю строку, чтобы избавиться от. если он существует.
Это рассматривается в этой статье . Этот метод короче принятого ответа и, вероятно, более надежен, чем следующий ответ, получивший наибольшее количество голосов. Обратите внимание, что, насколько я понимаю, здесь не используются имена NetBIOS, поэтому он должен подходить для использования в Интернете.
Dns.GetHostEntry("LocalHost").HostName
Dns.GetHostByName("LocalHost").HostName
Dns.GetHostEntry("LocalHost").HostName
вам лучше передать пустую строку вот так:Dns.GetHostEntry("").HostName
А для Framework 1.1 все очень просто:
System.Net.Dns.GetHostByName("localhost").HostName
А затем удалите имя NETBIOS машины, чтобы получить только имя домена
GetHostByName("localhost")
устарело. VS 2010 предложил использовать GetHostEntry("localhost")
вместо этого, что отлично работает.
Небольшое улучшение ответа Мэтта Зи, так что конечная точка не возвращается, если компьютер не является членом домена:
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
Использовал это как один из моих вариантов объединения имени хоста и имени домена для построения отчета, добавил общий текст для заполнения, когда имя домена не было захвачено, это было одним из требований клиентов.
Я тестировал это с помощью C # 5.0, .Net 4.5.1
private static string GetHostnameAndDomainName()
{
// if No domain name return a generic string
string currentDomainName = IPGlobalProperties.GetIPGlobalProperties().DomainName ?? "nodomainname";
string hostName = Dns.GetHostName();
// check if current hostname does not contain domain name
if (!hostName.Contains(currentDomainName))
{
hostName = hostName + "." + currentDomainName;
}
return hostName.ToLower(); // Return combined hostname and domain in lowercase
}
Построен с использованием идей из решения Мики Динеску.
Мы реализовали предлагаемый результат для использования таким образом:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
Однако оказалось, что это не работает правильно, когда имя компьютера длиннее 15 символов и используется имя NetBios. Environment.MachineName возвращает только частичное имя, а разрешение имени хоста возвращает то же имя компьютера.
После некоторого исследования мы нашли решение этой проблемы:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName
Это решило все проблемы, включая имя компьютера.
Ни один из ответов, которые я тестировал, на самом деле не предоставлял DNS-суффикс, который я искал. Вот что я придумал.
public static string GetFqdn()
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
var ipprops = networkInterfaces.First().GetIPProperties();
var suffix = ipprops.DnsSuffix;
return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}
Если вы хотите привести его в порядок и обработать исключения, попробуйте следующее:
public static string GetLocalhostFQDN()
{
string domainName = string.Empty;
try
{
domainName = NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
}
catch
{
}
string fqdn = "localhost";
try
{
fqdn = System.Net.Dns.GetHostName();
if (!string.IsNullOrEmpty(domainName))
{
if (!fqdn.ToLowerInvariant().EndsWith("." + domainName.ToLowerInvariant()))
{
fqdn += "." + domainName;
}
}
}
catch
{
}
return fqdn;
}
Dns.GetHostEntry("LocalHost").HostName
я всегда получаю имя хоста (не netbios) с суффиксом основного домена. Это не зависит от того, является ли машина частью домена, доступен DNS-сервер или подключена сеть. Возможно, я не понимаю вашего объяснения, но результат такой, как я ожидал. (Машина: W2008R2; .net 4.0; netbiosname: TESTNAME-VERYLO hostname: TESTNAME-VERYLONG)