9 ответов:
Примечание: это решение работает только при ориентации на .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-имя хоста.это различие важно, когда целью поиска полного доменного имени машины является регистрация информации, или создать отчет. Большую часть времени я использовал этот метод в журналах или отчетах, которые впоследствии используются для отображения информации на определенную машину. Если машины не подключены к сети, то
localhostидентификатор бесполезен, тогда как имя дает необходимую информацию.так что в конечном итоге это зависит от каждого пользователя, какой метод лучше подходит для их применения, в зависимости от того, какой результат им нужен. Но сказать, что этот ответ неправильный, потому что он недостаточно лаконичен, поверхностно лучший.
Смотрите пример, где выход будет отличаться:http://ideone.com/q4S4I0
небольшое упрощение кода Мики Д
public static string GetLocalhostFqdn() { var ipProperties = IPGlobalProperties.GetIPGlobalProperties(); return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName); }
этот в этой статье. Этот метод является более кратким, чем принятый ответ, и, вероятно, более надежным, чем следующий наиболее проголосованный ответ. Обратите внимание, что насколько я понимаю, это не используйте имена NetBIOS, поэтому он должен подходить для использования в Интернете.
.NET 2.0+
Dns.GetHostEntry("LocalHost").HostName.NET 1.0-1.1
Dns.GetHostByName("LocalHost").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 машины, чтобы получить только имя домена
вы можете попробовать следующее:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;этот shoud дает вам полное доменное имя текущей локальной машины (или вы можете указать любой хост).
небольшое улучшение ответа Мэтта Z, так что трейлинг-стоп не возвращается, если компьютер не является членом домена:
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, .Чистая 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 }построен с использованием идей из решения Мики Динеску.
Если вы хотите, чтобы привести его в порядок, и обрабатывать исключения, попробуйте это:
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; }
Comments