Bagaimana Anda bisa mendapatkan FQDN mesin lokal di C #?
Jawaban:
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").HostName
akan dikembalikan localhost
sedangkan 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
Dns.GetHostName()
untuk hostName
alih - alih menggunakan HostName
properti IPGlobalProperties
objek yang sudah Anda miliki, satu baris di atas?
IPGlobalProperties
properti nama host mengembalikan nama NetBIOS, sedangkan Dns.GetHostName()
mengembalikan nama host DNS.
EndsWith
cek rusak untuk hostname yang berakhir dengan huruf sama dengan nama domain (misalnya myhost tuan rumah di OST domain), mungkin harusEndsWith("." + domainName)
hostName.
. Harus ada !String.isNullorEmpty(domainName)
pemeriksaan
Sedikit penyederhanaan kode Miky D.
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
.Trim(".")
ke baris terakhir untuk menghilangkan. jika itu ada.
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.
Dns.GetHostEntry("LocalHost").HostName
Dns.GetHostByName("LocalHost").HostName
Dns.GetHostEntry("LocalHost").HostName
Anda lebih baik memberikan string kosong seperti ini:Dns.GetHostEntry("").HostName
Dan untuk Framework 1.1 sesederhana ini:
System.Net.Dns.GetHostByName("localhost").HostName
Dan kemudian hapus nama mesin NETBIOS untuk mengambil hanya domainName
GetHostByName("localhost")
sudah usang. VS 2010 menyarankan saya menggunakan GetHostEntry("localhost")
sebagai gantinya, yang berfungsi dengan baik.
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);
}
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.
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.
Saya telah menggunakan pendekatan ini:
private static string GetLocalhostFQDN()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return $"{ipProperties.HostName}.{ipProperties.DomainName}";
}
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}";
}
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;
}
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;
}
Dns.GetHostEntry("LocalHost").HostName
Saya 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)