C # /. NET'te yerel makinenin FQDN'si nasıl bulunur?


89

C # ile yerel bir makinenin FQDN'sini nasıl elde edebilirsiniz?

Yanıtlar:


143

NOT: Bu çözüm yalnızca .NET 2.0 (ve daha yeni) çerçevelerini hedeflerken çalışır.

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
}

GÜNCELLEME

Pek çok kişi Sam'in Cevabının daha özlü olduğu yorumunu yaptığından , cevaba bazı yorumlar eklemeye karar verdim.

Unutulmaması gereken en önemli şey verdiğim kodun aşağıdaki kodla eşdeğer olmamasıdır:

Dns.GetHostEntry("LocalHost").HostName

Makinenin ağa bağlı olduğu ve bir alanın parçası olduğu genel durumda, her iki yöntem de genellikle aynı sonucu verirken, diğer senaryolarda sonuçlar farklı olacaktır.

Çıktının farklı olacağı bir senaryo, makinenin bir alanın parçası olmadığı durumdur. Bu durumda, Dns.GetHostEntry("LocalHost").HostNamegeri dönecek localhostiken GetFQDN()yöntem yukarıda ana bilgisayarın NETBIOS adını döndürür.

Makine FQDN'sini bulmanın amacı bilgileri günlüğe kaydetmek veya bir rapor oluşturmak olduğunda bu ayrım önemlidir. Çoğu zaman bu yöntemi, daha sonra bilgileri belirli bir makineye geri eşlemek için kullanılan günlüklerde veya raporlarda kullandım. Makineler ağa bağlı değilse, localhosttanımlayıcı işe yaramaz, oysa isim gerekli bilgiyi verir.

Sonuç olarak, hangi sonuca ihtiyaç duyduklarına bağlı olarak, hangi yöntemin uygulamaları için daha uygun olduğu her kullanıcıya bağlıdır. Ancak bu cevabın yeterince özlü olmamanın yanlış olduğunu söylemek, en iyi ihtimalle yüzeyseldir.

Çıktının farklı olacağı bir örneğe bakın: http://ideone.com/q4S4I0


2
Kullanarak Dns.GetHostEntry("LocalHost").HostNameher zaman ana alan adını (netbios değil) birincil alan sonekiyle alırım. Bu, makinenin bir etki alanının parçası olup olmadığına, bir DNS sunucusuna ulaşılabilir olup olmadığına veya ağ bağlantısının bağlı olmasına bağlı değildir. Muhtemelen açıklamanızı anlamıyorum ama sonuç beklediğim şey. (Makine: W2008R2; .net 4.0; netbiosname: TESTNAME-VERYLO ana bilgisayar adı: TESTNAME-VERYLONG)
marsh-wiggle

Neden kullanıyorsun Dns.GetHostName()için hostNamekullanmak yerine HostNamemalı IPGlobalPropertiesbir satır yukarıda zaten sahip nesne?
Xharlie

@Xharlie, çünkü IPGlobalPropertieshostname özelliği NetBIOS adını Dns.GetHostName()döndürürken, DNS ana bilgisayar adını döndürür.
Mike Dinescu

2
EndsWithEtki alanı adıyla aynı harflerle biten ana bilgisayar adları için kontrol geçersizdir (örneğin, OST etki alanındaki bir ana bilgisayar MYHOST), muhtemelenEndsWith("." + domainName)
user3391859

7
DomainName boşsa bu geri döner hostName.. Bir !String.isNullorEmpty(domainName)çek olmalı
RodgerTheGreat

63

Miky D'nin kodunun hafif bir basitleştirmesi

    public static string GetLocalhostFqdn()
    {
        var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
        return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
    }

4
Micky D'nin kodundan farklı olarak bu, makine bir etki alanının üyesi değilse, ana bilgisayar adını ekli bir tamstop ile döndürür.
Bosco

1
Ayrıca, bu, DNS ana bilgisayar adı yerine NetBIOS adını kullanır. NetBIOS adlarının yalnızca LAN'lar içinde uygun olduğuna inanıyorum.
Sam

Belki de .Trim(".")son satıra bir ekleyerek . eğer varsa.
David d C e Freitas

29

Bu, bu makalenin kapsamındadır . Bu teknik, kabul edilen cevaptan daha kısadır ve muhtemelen bir sonraki en çok oylanan cevaptan daha güvenilirdir. Anladığım kadarıyla, bu kadar geldiğini hatırlatırız gelmez NetBIOS adlarını kullanın, bu nedenle internet kullanım için uygun olmalıdır.

.NET 2.0+

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName

@DexterLegaspi - Sam'in cevabı iyi (hatta bunu kendim de geliştirdim) ama cevabıma eşdeğer değil, daha iyi. Ayrıntılar için lütfen güncellenmiş cevabıma bakın.
Mike Dinescu

@MikeDinescu soru, makinenin bir ağda ve bir alanın parçası olduğunu ifade eden FQDN'nin nasıl alınacağıdır. kabul edilen cevap işe yarıyor ancak Sam'in cevabı daha "kesin" (daha iyi bir terim olmadığı için)
Dexter Legaspi

4
bu doğru cevap! ama bunu yapmak yerine Dns.GetHostEntry("LocalHost").HostNameboş bir dizeyi böyle Dns.GetHostEntry("").HostName
geçirseniz iyi olur

17

İşte PowerShell'de, bunun için:

$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName

15

Ve Framework 1.1 için bu kadar basit:

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

Ve sonra yalnızca domainName'i almak için makine NETBIOS adını kaldırın


Burada 2013'te GetHostByName("localhost")kullanımdan kaldırıldı. VS 2010 GetHostEntry("localhost")bunun yerine kullanmamı önerdi , bu da iyi çalışıyor.
piedar

@piedar, .NET 1.1 için bu olayla ilgili bir kısmı kaçırmış olabilirsiniz.
Sam

En basit ve dolayısıyla favorim olduğu için bu cevaba güncellenmiş bilgiler eklemek istedim. Muhtemelen cevabınızı görecek kadar ileri gitmedim, ki bu gerçekten de yorumumu gereksiz kılmıştı.
piedar

8

Aşağıdakileri deneyebilirsiniz:

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

Bu shoud size mevcut yerel makinenin FQDN'sini verir (veya herhangi bir ana bilgisayarı belirtebilirsiniz).


5

Matt Z'nin yanıtında ufak bir iyileştirme yapıldı, böylece bilgisayar bir etki alanının üyesi değilse sondaki bir nokta döndürülmedi:

public static string GetLocalhostFqdn()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}

Bunun NetBIOS ana bilgisayar adını kullandığını düşünüyorum, bu nedenle İnternet kullanımı için uygun olmayabilir.
Sam

2

Bunu, bir rapor oluşturmak için ana bilgisayar adını ve etki alanı adını birleştirme seçeneklerimden biri olarak kullandım, etki alanı adı yakalanmadığında doldurulacak genel metni ekledi, bu müşterilerin gereksinimlerinden biriydi.

Bunu C # 5.0, .Net 4.5.1 kullanarak test ettim

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 çözümündeki fikirler kullanılarak oluşturulmuştur.


1

Bu şekilde kullanmak için önerilen sonucu uyguladık:

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

Ancak, bilgisayar adı 15 karakterden uzun olduğunda ve NetBios adı kullanıldığında bunun doğru çalışmadığı ortaya çıktı. Environment.MachineName yalnızca kısmi adı döndürür ve ana bilgisayar adını çözümlemek aynı bilgisayar adını döndürür.

Biraz araştırdıktan sonra bu sorunu çözmek için bir çözüm bulduk:

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

Bu, bilgisayar adı dahil tüm sorunları çözdü.


Az, 0-9, '.', '-' karakterleri içermeyen kullanıcı tarafından bir ad verilen bir bilgisayarınız varsa, bu bir istisna oluşturur ve önerilen diğer çözümlerin çoğu da başarısız olur. Bu nedenle, Asya'da veya benzeri yerlerde kullanıcılarınız varsa sorun bekleyin. GetHostName, bu karakterlerin yerini "?" Alır. Bu yüzden GetHostByName'i ("localhost") tercih ediyorum. Asıl bilgisayar adını gösteren HostName.
Göran

0

Bu yaklaşımı kullandım:

private static string GetLocalhostFQDN()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return $"{ipProperties.HostName}.{ipProperties.DomainName}";
}

0

Test ettiğim yanıtların hiçbiri aradığım DNS son ekini gerçekten sağlamadı. İşte bulduğum şey.

public static string GetFqdn()
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
    var ipprops = networkInterfaces.First().GetIPProperties();
    var suffix = ipprops.DnsSuffix;
    return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}

0

FQ Ana Bilgisayar Adı / Ana Bilgisayar Adı / NetBIOS MakineAdı / EtkiAlanıAdı çevresindeki tüm durumları işlemek için yöntem koleksiyonum

    /// <summary>
    /// Get the full qualified hostname
    /// </summary>
    /// <param name="throwOnMissingDomainName"></param>
    /// <returns></returns>
    public static string GetMachineFQHostName(bool throwOnMissingDomainName = false)
    {
        string domainName = GetMachineFQDomainName();
        string hostName = GetMachineHostName();

        if (string.IsNullOrEmpty(domainName) && throwOnMissingDomainName) throw new Exception($"Missing domain name on machine: { hostName }");
        else if (string.IsNullOrEmpty(domainName)) return hostName;
        //<----------

        return $"{ hostName }.{ domainName }";
    }


    /// <summary>
    /// Get the NetBIOS name of the local machine
    /// </summary>
    /// <returns></returns>
    public static string GetMachineName()
    {
        return Environment.MachineName;
    }

    /// <summary>
    /// Get the Hostname from the local machine which differs from the NetBIOS name when 
    /// longer than 15 characters
    /// </summary>
    /// <returns></returns>
    public static string GetMachineHostName()
    {
        /// I have been told that GetHostName() may return the FQName. Never seen that, but better safe than sorry ....
        string hostNameRaw = System.Net.Dns.GetHostName();
        return hostNameRaw.Split('.')[0];
    }

    /// <summary>
    /// Check if hostname and NetBIOS name are equal
    /// </summary>
    /// <returns></returns>
    public static bool AreHostNameAndNetBIOSNameEqual()
    {
        return GetMachineHostName().Equals(GetMachineName(), StringComparison.OrdinalIgnoreCase);
    }

    /// <summary>
    /// Get the domain name without the hostname
    /// </summary>
    /// <returns></returns>
    public static string GetMachineFQDomainName()
    {
        return IPGlobalProperties.GetIPGlobalProperties().DomainName;
    }

-9

Düzenlemek ve istisnaları ele almak istiyorsanız, şunu deneyin:

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

2
"ve istisnaları işleme" - BAŞARISIZ.
Jörgen Sigvardsson

u kendi başına yakalamanın istisnayı ele aldığını düşünüyorum!
Saher Ahwal

Hayır, bence istisnaları nasıl ele almak istediğinizi kendiniz karar vermeniz gerekiyor. Ve bir alan adını geri alamazsanız, bununla nasıl başa çıkmayı önerirsiniz?
Roger Willcocks

4
Bir hata raporu günlüğe alın ve istemci kodunu hatalı bilgilerle sağlamak yerine bir şeylerin ters gittiği konusunda kullanıcıyı uyarın.
dahvyd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.