Как найти полное доменное имя локальной машины в С#/. 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;
        }