Как найти полное доменное имя локальной машины в C # / .NET?

StackOverflow https://stackoverflow.com/questions/804700

  •  03-07-2019
  •  | 
  •  

Вопрос

Как вы можете получить полное доменное имя локальной машины на 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-имя хоста.

Это различие важно, когда целью поиска ПОЛНОГО доменного имени компьютера является регистрация информации или создание отчета.Большую часть времени я использовал этот метод в журналах или отчетах, которые впоследствии использовались для сопоставления информации с конкретным компьютером.Если компьютеры не подключены к сети, то localhost идентификатор бесполезен, в то время как имя дает необходимую информацию.

Таким образом, в конечном счете, каждый пользователь сам решает, какой метод лучше подходит для его применения, в зависимости от того, какой результат ему нужен.Но сказать, что этот ответ неверен из-за недостаточной краткости, в лучшем случае поверхностно.

Смотрите пример, где результат будет другим: http://ideone.com/q4S4I0

Другие советы

Небольшое упрощение кода Miky D.

    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

А для фреймворка 1.1 все так просто, как это:

System.Net.Dns.GetHostByName("localhost").HostName

А затем удалите имя NETBIOS компьютера, чтобы получить только имя домена

Вы можете попробовать следующее:

return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;

Это даст вам полное доменное имя текущего локального компьютера (или вы можете указать любой хост).

Небольшое улучшение ответа Мэтта 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, .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
} 

Построен с использованием идей Miky Dinescu solution.

Мы реализовали предложенный результат для использования таким образом:

return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;

Однако оказалось, что это работает неправильно, когда имя компьютера длиннее 15 символов и используется NetBIOS name.Среда.MachineName возвращает только частичное имя, а разрешающее имя хоста возвращает то же имя компьютера.

После некоторых исследований мы нашли решение для устранения этой проблемы:

System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName

Это решило все проблемы, включая имя компьютера.

Если вы хотите привести это в порядок и обработать исключения, попробуйте следующее:

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;
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top