Как найти FQDN локальной машины в C # /. NET? - PullRequest
83 голосов
/ 30 апреля 2009

Как получить полное доменное имя локального компьютера в C #?

Ответы [ 10 ]

131 голосов
/ 30 апреля 2009

ПРИМЕЧАНИЕ. Это решение работает только при нацеливании на платформы .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-имя хоста.

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

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

См. Пример, в котором выходные данные будут другими: http://ideone.com/q4S4I0

63 голосов
/ 19 мая 2009

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

    public static string GetLocalhostFqdn()
    {
        var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
        return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
    }
24 голосов
/ 13 июня 2013

Это покрыто этой статьей . Этот метод является более кратким, чем принятый ответ, и, вероятно, более надежным, чем следующий, получивший наибольшее количество голосов. Обратите внимание, что, насколько я понимаю, этот не не использует имена NetBIOS, поэтому он должен подходить для использования в Интернете.

.NET 2.0 +

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName
17 голосов
/ 14 сентября 2009

Вот он в PowerShell, черт возьми:

$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName
15 голосов
/ 14 мая 2010

А для Framework 1.1 все так просто:

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

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

8 голосов
/ 25 января 2014

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

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

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

5 голосов
/ 12 февраля 2013

Небольшое улучшение в ответе Мэтта Z, так что трейлинг-стоп не возвращается, если компьютер не является членом домена:

public static string GetLocalhostFqdn()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
2 голосов
/ 16 мая 2014

Использовал это как один из моих вариантов для объединения имени хоста и имени домена для построения отчета, добавил общий текст для заполнения, когда имя домена не было зафиксировано, это было одним из требований клиентов.

Я проверил это, используя 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.

1 голос
/ 18 января 2019

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

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

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

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

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

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

0 голосов
/ 16 мая 2011

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

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;
        }
...