Как вы можете получить полное доменное имя локальной машины в С#?
Как найти полное доменное имя локальной машины в С#/. NET?
Ответ 1
ПРИМЕЧАНИЕ. Это решение работает только при таргетинге на платформы .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
}
UPDATE
Поскольку многие люди прокомментировали, что Ответ на Сэм более краток, я решил добавить некоторые комментарии к ответу.
Самое главное отметить, что код, который я дал, не эквивалентен для следующего кода:
Dns.GetHostEntry("LocalHost").HostName
В то время как в общем случае, когда машина подключена к сети и часть домена, оба метода обычно выдают одинаковый результат, в других сценариях результаты будут отличаться.
Сценарий, в котором результат будет отличаться, заключается в том, что машина не является частью домена. В этом случае Dns.GetHostEntry("LocalHost").HostName
вернет localhost
, в то время как выше описанный выше метод GetFQDN()
вернет имя NETBIOS для хоста.
Это различие важно, когда целью поиска FQDN машины является регистрация информации или создание отчета. В большинстве случаев я использовал этот метод в журналах или отчетах, которые впоследствии используются для сопоставления информации с конкретной машиной. Если машины не подключены к сети, идентификатор localhost
бесполезен, тогда как имя дает необходимую информацию.
Таким образом, в конечном итоге это зависит от каждого пользователя, какой метод лучше подходит для их применения, в зависимости от того, какой результат им нужен. Но сказать, что этот ответ неверен, потому что он недостаточно краток, в лучшем случае является поверхностным.
См. пример, где вывод будет другим: http://ideone.com/q4S4I0
Ответ 2
Небольшое упрощение кода Miky D
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
Ответ 3
Об этом говорится в этой статье. Этот метод более краток, чем принятый ответ и, вероятно, более надежный, чем следующий наиболее голосуемый ответ. Обратите внимание, что, насколько я понимаю, этот не использует имена NetBIOS, поэтому он должен быть подходящим для использования в Интернете.
.NET 2.0 +
Dns.GetHostEntry("LocalHost").HostName
.NET 1.0 - 1.1
Dns.GetHostByName("LocalHost").HostName
Ответ 4
Вот он в PowerShell, для этого:
$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName
Ответ 5
И для Framework 1.1 так же просто:
System.Net.Dns.GetHostByName("localhost").HostName
И затем удалите имя NETBIOS машины, чтобы получить только имя домена
Ответ 6
Вы можете попробовать следующее:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
В этом режиме вы получите полное доменное имя текущего локального компьютера (или вы можете указать любой хост).
Ответ 7
Небольшое улучшение ответа Matt Z, так что конечная полная остановка не возвращается, если компьютер не является членом домена:
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
Ответ 8
Использовал это как один из моих вариантов объединить имя хоста и имя домена для создания отчета, добавив общий текст для заполнения, когда имя домена не было захвачено, это было одним из требований клиентов.
Я тестировал это, используя С# 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
}
Построен с использованием идей из решения Мики Динеску.
Ответ 9
Мы реализовали предложенный результат, чтобы использовать этот способ:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
Однако оказалось, что это работает неправильно, если имя компьютера длиннее 15 символов и используется имя NetBios. Environment.MachineName возвращает только частичное имя, а разрешающее имя хоста возвращает то же имя компьютера.
После некоторых исследований мы нашли решение, чтобы решить эту проблему:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName
Это решило все проблемы, включая имя компьютера.
Ответ 10
Если вы хотите его убрать и обрабатывать исключения, попробуйте следующее:
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;
}