Bagaimana menemukan FQDN mesin lokal di C # /. NET?

89

Bagaimana Anda bisa mendapatkan FQDN mesin lokal di C #?

Sam
sumber

Jawaban:

143

CATATAN: Solusi ini hanya berfungsi saat menargetkan kerangka kerja .NET 2.0 (dan yang lebih baru).

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
}

MEMPERBARUI

Karena banyak orang yang berkomentar tentang Jawaban Sam lebih ringkas, saya memutuskan untuk menambahkan beberapa komentar pada jawabannya.

Hal terpenting yang harus diperhatikan adalah kode yang saya berikan tidak setara dengan kode berikut:

Dns.GetHostEntry("LocalHost").HostName

Sementara dalam kasus umum ketika mesin terhubung ke jaringan dan merupakan bagian dari domain, kedua metode umumnya akan menghasilkan hasil yang sama, dalam skenario lain hasilnya akan berbeda.

Skenario di mana output akan berbeda adalah ketika mesin bukan bagian dari domain. Dalam hal ini, Dns.GetHostEntry("LocalHost").HostNameakan dikembalikan localhostsedangkan GetFQDN()metode di atas akan mengembalikan nama NETBIOS dari host.

Perbedaan ini penting ketika tujuan menemukan mesin FQDN adalah untuk mencatat informasi, atau membuat laporan. Sebagian besar waktu saya menggunakan metode ini dalam log atau laporan yang kemudian digunakan untuk memetakan informasi kembali ke mesin tertentu. Jika mesin tidak terhubung ke jaringan, filelocalhost pengenal tidak berguna, sedangkan nama memberikan informasi yang diperlukan.

Jadi pada akhirnya terserah setiap pengguna metode mana yang lebih cocok untuk aplikasi mereka, tergantung pada hasil apa yang mereka butuhkan. Tetapi mengatakan bahwa jawaban ini salah karena tidak cukup ringkas adalah hal yang dangkal.

Lihat contoh di mana hasilnya akan berbeda: http://ideone.com/q4S4I0

Mike Dinescu
sumber
2
Menggunakan Dns.GetHostEntry("LocalHost").HostNameSaya selalu mendapatkan nama host (bukan netbios) dengan akhiran domain primer. Ini tidak tergantung pada apakah mesin adalah bagian dari domain, server DNS dapat dijangkau atau jaringan terhubung. Mungkin saya tidak mengerti penjelasan Anda tapi hasilnya seperti yang saya harapkan. (Mesin: W2008R2; .net 4.0; netbiosname: TESTNAME-VERYLO hostname: TESTNAME-VERYLONG)
marsh-wiggle
Mengapa Anda menggunakan Dns.GetHostName()untuk hostNamealih - alih menggunakan HostNameproperti IPGlobalPropertiesobjek yang sudah Anda miliki, satu baris di atas?
Xharlie
@Xharlie karena IPGlobalPropertiesproperti nama host mengembalikan nama NetBIOS, sedangkan Dns.GetHostName()mengembalikan nama host DNS.
Mike Dinescu
2
yang EndsWithcek rusak untuk hostname yang berakhir dengan huruf sama dengan nama domain (misalnya myhost tuan rumah di OST domain), mungkin harusEndsWith("." + domainName)
user3391859
7
Jika domainName kosong maka ini kembali hostName.. Harus ada !String.isNullorEmpty(domainName)pemeriksaan
RodgerTheGreat
63

Sedikit penyederhanaan kode Miky D.

    public static string GetLocalhostFqdn()
    {
        var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
        return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
    }
Matt Z
sumber
4
Tidak seperti kode Micky D, ini mengembalikan nama host dengan fullstop yang ditambahkan jika mesin bukan anggota domain.
Bosco
1
Selain itu, ini menggunakan nama NetBIOS, bukan nama host DNS. Saya yakin nama NetBIOS hanya cocok untuk LAN.
Sam
Mungkin menambahkan a .Trim(".")ke baris terakhir untuk menghilangkan. jika itu ada.
David d C e Freitas
29

Ini tercakup dalam artikel ini . Teknik ini lebih singkat daripada jawaban yang diterima dan mungkin lebih dapat diandalkan daripada jawaban yang paling banyak dipilih berikutnya. Perhatikan bahwa sejauh yang saya mengerti, ini tidak menggunakan nama NetBIOS, jadi harus sesuai untuk penggunaan Internet.

.NET 2.0+

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName
Sam
sumber
@DexterLegaspi - Jawaban Sam bagus (saya bahkan telah meng-up-voded sendiri) tetapi tidak setara dengan jawaban saya, atau juga lebih baik. Silakan lihat jawaban saya yang diperbarui untuk detailnya.
Mike Dinescu
@MikeDinescu pertanyaannya adalah bagaimana mendapatkan FQDN, yang berkonotasi bahwa mesin berada di jaringan dan bagian dari domain. jawaban yang diterima melakukan pekerjaan itu tetapi jawaban Sam lebih "tepat" (karena kurangnya istilah yang lebih baik)
Dexter Legaspi
4
ini jawaban yang benar! tetapi daripada melakukan Dns.GetHostEntry("LocalHost").HostNameAnda lebih baik memberikan string kosong seperti ini:Dns.GetHostEntry("").HostName
paulgutten
17

Ini dia di PowerShell, untuk itu:

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

Dan untuk Framework 1.1 sesederhana ini:

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

Dan kemudian hapus nama mesin NETBIOS untuk mengambil hanya domainName

javizcaino.dll
sumber
Di sini, di 2013, GetHostByName("localhost")sudah usang. VS 2010 menyarankan saya menggunakan GetHostEntry("localhost")sebagai gantinya, yang berfungsi dengan baik.
piedar
@piedar, Anda mungkin melewatkan sedikit tentang keberadaan ini untuk .NET 1.1.
Sam
Saya ingin menambahkan informasi terbaru ke jawaban ini, karena ini yang paling sederhana dan karenanya menjadi favorit saya. Saya mungkin tidak menggulir cukup jauh untuk melihat jawaban Anda, yang memang membuat komentar saya tidak perlu.
piedar
8

Anda dapat mencoba yang berikut ini:

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

Ini harusnya memberi Anda FQDN dari mesin lokal saat ini (atau Anda dapat menentukan host mana saja).

UT-Fan-05
sumber
5

Sedikit perbaikan pada jawaban Matt Z sehingga tanda titik penuh tidak ditampilkan jika komputer bukan anggota domain:

public static string GetLocalhostFqdn()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
Bosco
sumber
Perhatikan bahwa saya pikir ini menggunakan nama host NetBIOS, jadi mungkin tidak cocok untuk penggunaan Internet.
Sam
2

Menggunakan ini sebagai salah satu opsi saya untuk menggabungkan nama host dan nama domain untuk membuat laporan, menambahkan teks umum untuk diisi saat nama domain tidak diambil, ini adalah salah satu persyaratan pelanggan.

Saya menguji ini menggunakan 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
} 

Dibangun menggunakan ide dari solusi Miky Dinescu.

pengguna3500031
sumber
1

Kami telah menerapkan hasil yang disarankan untuk menggunakan cara ini:

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

Namun, ternyata ini tidak berfungsi dengan benar ketika nama komputer lebih dari 15 karakter dan menggunakan nama NetBios. Environment.MachineName hanya mengembalikan nama parsial dan nama host yang menyelesaikan mengembalikan nama komputer yang sama.

Setelah beberapa penelitian kami menemukan solusi untuk memperbaiki masalah ini:

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

Ini menyelesaikan semua masalah termasuk nama komputer.

btomas
sumber
Ini akan memunculkan pengecualian, dan sebagian besar solusi lain yang disarankan juga akan gagal, jika Anda memiliki komputer yang telah diberi nama oleh pengguna yang berisi karakter bukan dari az, 0-9, '.', '-'. Jadi harapkan masalah jika Anda memiliki pengguna di Asia atau serupa. GetHostName akan mengganti karakter tersebut dengan '?'. Itu sebabnya saya lebih memilih GetHostByName ("localhost") HostName yang menampilkan nama komputer sebenarnya.
Göran
0

Saya telah menggunakan pendekatan ini:

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

Tidak ada jawaban yang diberikan yang saya uji benar-benar memberikan akhiran DNS yang saya cari. Inilah yang saya dapatkan.

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

Kumpulan metode saya untuk menangani semua kasus seputar FQ Hostname / Hostname / NetBIOS Machinename / DomainName

    /// <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;
    }
marsh-goyangan
sumber
-9

Jika Anda ingin merapikannya, dan menangani pengecualian, coba ini:

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;
        }
Roger Willcocks
sumber
2
"dan menangani pengecualian" - GAGAL.
Jörgen Sigvardsson
u pikir menangkap dengan sendirinya menangani pengecualian!
Saher Ahwal
Tidak, menurut saya cara Anda ingin menangani pengecualian adalah sesuatu yang perlu Anda putuskan sendiri. Dan jika Anda tidak bisa mendapatkan nama domain kembali, bagaimana cara ANDA menanganinya?
Roger Willcocks
4
Catat laporan kesalahan dan peringatkan pengguna bahwa ada yang salah alih-alih memberikan informasi yang salah kepada kode klien.
dahvyd