Как получить полное доменное имя локальной машины на 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.GetHostEntry("LocalHost").HostName
я всегда получаю имя хоста (не netbios) с суффиксом основного домена. Это не зависит от того, является ли машина частью домена, доступен DNS-сервер или подключена сеть. Возможно, я не понимаю вашего объяснения, но результат такой, как я ожидал. (Машина: W2008R2; .net 4.0; netbiosname: TESTNAME-VERYLO hostname: TESTNAME-VERYLONG)Dns.GetHostName()
forhostName
вместо использования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, поэтому он должен подходить для использования в Интернете.
.NET 2.0+
Dns.GetHostEntry("LocalHost").HostName
.NET 1.0–1.1
Dns.GetHostByName("LocalHost").HostName
источник
Dns.GetHostEntry("LocalHost").HostName
вам лучше передать пустую строку вот так:Dns.GetHostEntry("").HostName
Вот оно, черт возьми, в PowerShell:
$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties() "{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName
источник
А для Framework 1.1 все очень просто:
System.Net.Dns.GetHostByName("localhost").HostName
А затем удалите имя NETBIOS машины, чтобы получить только имя домена
источник
GetHostByName("localhost")
устарело. VS 2010 предложил использоватьGetHostEntry("localhost")
вместо этого, что отлично работает.Вы можете попробовать следующее:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
Это shoud предоставит вам полное доменное имя текущего локального компьютера (или вы можете указать любой хост).
источник
Небольшое улучшение ответа Мэтта Зи, так что конечная точка не возвращается, если компьютер не является членом домена:
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 возвращает только частичное имя, а разрешение имени хоста возвращает то же имя компьютера.
После некоторого исследования мы нашли решение этой проблемы:
Это решило все проблемы, включая имя компьютера.
источник
Я использовал такой подход:
private static string GetLocalhostFQDN() { var ipProperties = IPGlobalProperties.GetIPGlobalProperties(); return $"{ipProperties.HostName}.{ipProperties.DomainName}"; }
источник
Ни один из ответов, которые я тестировал, на самом деле не предоставлял 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; }
источник