Làm thế nào bạn có thể lấy FQDN của một máy cục bộ trong C #?
Câu trả lời:
LƯU Ý: Giải pháp này chỉ hoạt động khi nhắm mục tiêu các khuôn khổ .NET 2.0 (và mới hơn).
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
}
CẬP NHẬT
Vì có nhiều người nhận xét rằng Câu trả lời của Sam ngắn gọn hơn nên tôi quyết định thêm một số nhận xét vào câu trả lời.
Điều quan trọng nhất cần lưu ý là mã tôi đã đưa ra không tương đương với mã sau:
Dns.GetHostEntry("LocalHost").HostName
Trong trường hợp chung khi máy được nối mạng và là một phần của miền, cả hai phương pháp nói chung sẽ tạo ra cùng một kết quả, trong các trường hợp khác, kết quả sẽ khác nhau.
Một tình huống mà đầu ra sẽ khác khi máy không phải là một phần của miền. Trong trường hợp này, Dns.GetHostEntry("LocalHost").HostName
sẽ trả về localhost
trong khi GetFQDN()
phương thức trên sẽ trả về tên NETBIOS của máy chủ.
Sự khác biệt này rất quan trọng khi mục đích của việc tìm kiếm máy FQDN là để ghi thông tin hoặc tạo báo cáo. Hầu hết thời gian tôi sử dụng phương pháp này trong nhật ký hoặc báo cáo sau đó được sử dụng để ánh xạ thông tin trở lại một máy cụ thể. Nếu các máy không được nối mạng, mã localhost
định danh sẽ vô dụng, ngược lại tên cung cấp thông tin cần thiết.
Vì vậy, cuối cùng tùy thuộc vào mỗi người dùng phương pháp nào phù hợp hơn cho ứng dụng của họ, tùy thuộc vào kết quả họ cần. Nhưng để nói rằng câu trả lời này là sai vì không đủ ngắn gọn là tốt nhất là hời hợt.
Xem ví dụ trong đó đầu ra sẽ khác: http://ideone.com/q4S4I0
Dns.GetHostName()
for hostName
thay vì sử dụng thuộc HostName
tính của IPGlobalProperties
đối tượng bạn đã có, một dòng ở trên?
IPGlobalProperties
tên máy chủ trả về tên NetBIOS, trong khi Dns.GetHostName()
trả về tên máy chủ DNS.
EndsWith
kiểm tra được chia cho hostname kết thúc bằng các chữ cái giống như tên miền (ví dụ như một myhost chủ trong OST miền), có lẽ nên đượcEndsWith("." + domainName)
hostName.
. Nên có !String.isNullorEmpty(domainName)
séc
Đơn giản hóa một chút mã của Miky D
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
.Trim(".")
vào dòng cuối cùng để loại bỏ. nếu nó tồn tại.
Điều này được đề cập bởi bài báo này . Kỹ thuật này ngắn gọn hơn câu trả lời được chấp nhận và có lẽ đáng tin cậy hơn câu trả lời được bình chọn nhiều nhất tiếp theo. Lưu ý rằng theo như tôi hiểu, điều này không sử dụng tên NetBIOS, vì vậy nó phải phù hợp để sử dụng Internet.
Dns.GetHostEntry("LocalHost").HostName
Dns.GetHostByName("LocalHost").HostName
Dns.GetHostEntry("LocalHost").HostName
bạn tốt hơn thông qua một chuỗi rỗng như vậy:Dns.GetHostEntry("").HostName
Và đối với Framework 1.1 thì đơn giản như sau:
System.Net.Dns.GetHostByName("localhost").HostName
Và sau đó loại bỏ tên NETBIOS của máy để chỉ lấy tên miền
GetHostByName("localhost")
được xóa sổ. VS 2010 đề nghị tôi sử dụng GetHostEntry("localhost")
thay thế, hoạt động tốt.
Một chút cải tiến cho câu trả lời của Matt Z để một điểm dừng đầy đủ theo sau không được trả lại nếu máy tính không phải là thành viên của miền:
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
Sử dụng đây là một trong những lựa chọn của tôi để kết hợp tên máy chủ và tên miền để xây dựng báo cáo, thêm văn bản chung chung để điền vào khi chưa nắm bắt được tên miền, đây là một trong những yêu cầu của khách hàng.
Tôi đã thử nghiệm điều này bằng 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
}
Được xây dựng bằng cách sử dụng ý tưởng từ giải pháp Miky Dinescu.
Chúng tôi đã triển khai kết quả được đề xuất để sử dụng theo cách này:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
Tuy nhiên, hóa ra điều này không hoạt động đúng khi tên máy tính dài hơn 15 ký tự và sử dụng tên NetBios. Môi trường.MachineName chỉ trả về một phần tên và phân giải tên máy chủ trả về cùng một tên máy tính.
Sau một số nghiên cứu, chúng tôi đã tìm ra giải pháp để khắc phục sự cố này:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName
Điều này giải quyết tất cả các vấn đề bao gồm cả tên máy tính.
Không có câu trả lời nào được cung cấp mà tôi đã kiểm tra thực sự cung cấp hậu tố DNS mà tôi đang tìm kiếm. Đây là những gì tôi nghĩ ra.
public static string GetFqdn()
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
var ipprops = networkInterfaces.First().GetIPProperties();
var suffix = ipprops.DnsSuffix;
return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}
Nếu bạn muốn thu gọn nó và xử lý các ngoại lệ, hãy thử cách này:
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
tôi luôn nhận được tên máy chủ (không phải netbios) với hậu tố tên miền chính. Điều này không phụ thuộc vào việc máy có thuộc miền, máy chủ DNS có thể truy cập được hay mạng lưới được kết nối hay không. Có lẽ tôi không hiểu lời giải thích của bạn nhưng kết quả là những gì tôi mong đợi. (Máy: W2008R2; .net 4.0; netbiosname: TESTNAME-VERYLO tên máy chủ: TESTNAME-VERYLONG)