आप C # में स्थानीय मशीन का FQDN कैसे प्राप्त कर सकते हैं?
जवाबों:
नोट: यह समाधान केवल .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
}
अपडेट करें
चूंकि बहुत से लोगों ने टिप्पणी की है कि सैम का उत्तर अधिक संक्षिप्त है, मैंने उत्तर में कुछ टिप्पणियां जोड़ने का फैसला किया है।
ध्यान देने वाली सबसे महत्वपूर्ण बात यह है कि मैंने जो कोड दिया है वह निम्नलिखित कोड के बराबर नहीं है :
Dns.GetHostEntry("LocalHost").HostName
जबकि सामान्य स्थिति में जब मशीन को नेटवर्क किया जाता है और एक डोमेन का हिस्सा होता है, तो दोनों विधियां आम तौर पर एक ही परिणाम उत्पन्न करेंगी, अन्य स्थितियों में परिणाम भिन्न होंगे।
एक परिदृश्य जहां आउटपुट अलग होगा, जब मशीन एक डोमेन का हिस्सा नहीं है। इस स्थिति में, Dns.GetHostEntry("LocalHost").HostName
वसीयत वापस आ जाएगी localhost
जबकि GetFQDN()
उपरोक्त विधि मेजबान के NETBIOS नाम को वापस कर देगी।
यह अंतर तब महत्वपूर्ण है जब मशीन FQDN को खोजने का उद्देश्य जानकारी लॉग करना है, या एक रिपोर्ट उत्पन्न करना है। अधिकांश समय मैंने इस विधि का उपयोग लॉग या रिपोर्ट में किया है जो बाद में सूचना को एक विशिष्ट मशीन में मैप करने के लिए उपयोग किया जाता है। यदि मशीनों को नेटवर्क नहीं किया जाता है, तो localhost
पहचानकर्ता बेकार है, जबकि नाम आवश्यक जानकारी देता है।
तो आखिरकार यह प्रत्येक उपयोगकर्ता पर निर्भर करता है कि उनके आवेदन के लिए कौन सा तरीका बेहतर है, यह निर्भर करता है कि उन्हें किस परिणाम की आवश्यकता है। लेकिन यह कहना कि पर्याप्त नहीं होने के लिए यह उत्तर गलत है, सबसे अच्छा सतही है।
एक उदाहरण देखें जहां आउटपुट अलग होगा: http://ideone.com/q4S4I0
Dns.GetHostName()
के hostName
बजाय आप एक पंक्ति से ऊपर का उपयोग क्यों करते हैं ? HostName
IPGlobalProperties
IPGlobalProperties
होस्टनाम गुण NetBIOS नाम Dns.GetHostName()
लौटाता है , जबकि DNS होस्ट नाम देता है।
EndsWith
जांच होस्ट नामों का टूट गया है कि डोमेन नाम के रूप में ही पत्र (जैसे एक डोमेन OST में मेजबान myhost) के साथ अंत, शायद होना चाहिएEndsWith("." + domainName)
hostName.
। एक !String.isNullorEmpty(domainName)
जांच होनी चाहिए
मिकी डी के कोड का एक मामूली सरलीकरण
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
.Trim(".")
छुटकारा पाने के लिए अंतिम पंक्ति में एक जोड़ दें । अगर यह मौजूद है।
यह इस लेख द्वारा कवर किया गया है । यह तकनीक स्वीकृत उत्तर की तुलना में अधिक संक्षिप्त है और शायद अगले सबसे अधिक मतदान वाले उत्तर की तुलना में अधिक विश्वसनीय है। ध्यान दें कि जहां तक मैं समझता हूं, यह NetBIOS नामों का उपयोग नहीं करता है , इसलिए यह इंटरनेट उपयोग के लिए उपयुक्त होना चाहिए।
Dns.GetHostEntry("LocalHost").HostName
Dns.GetHostByName("LocalHost").HostName
Dns.GetHostEntry("LocalHost").HostName
आप बेहतर तरीके से एक खाली स्ट्रिंग पास करें जैसे:Dns.GetHostEntry("").HostName
और फ्रेमवर्क 1.1 के लिए इस रूप में सरल है:
System.Net.Dns.GetHostByName("localhost").HostName
और उसके बाद केवल डोमेन नाम को पुनः प्राप्त करने के लिए मशीन NETBIOS नाम को हटा दें
GetHostByName("localhost")
obsoleted है। वीएस 2010 ने सुझाव दिया कि मैं GetHostEntry("localhost")
इसके बजाय उपयोग करता हूं , जो ठीक काम करता है।
आप निम्नलिखित की कोशिश कर सकते हैं:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
यह जोर आपको वर्तमान स्थानीय मशीन का FQDN देता है (या आप किसी भी होस्ट को निर्दिष्ट कर सकते हैं)।
मैट ज़ेड के उत्तर पर एक मामूली सुधार ताकि कंप्यूटर एक डोमेन का सदस्य न होने पर एक पूर्ण विराम वापस आ जाए।
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
रिपोर्ट बनाने के लिए होस्ट नाम और डोमेन नाम को संयोजित करने के लिए मेरे विकल्पों में से एक के रूप में इसका इस्तेमाल किया, डोमेन नाम में कब्जा नहीं होने पर भरने के लिए जेनेरिक पाठ जोड़ा, यह ग्राहकों की आवश्यकताओं में से एक था।
मैंने 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
}
मिकी Dinescu समाधान से विचारों का उपयोग कर बनाया गया।
हमने इस तरह से उपयोग करने के लिए सुझाए गए परिणाम को लागू किया है:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
हालाँकि, यह पता चला कि यह सही नहीं है जब कंप्यूटर का नाम 15 अक्षरों से अधिक लंबा हो और नेटबायोस नाम का उपयोग कर रहा हो। एन्वायर्नमेंट। मैचिनेनाम केवल आंशिक नाम देता है और होस्ट नाम हल करने पर समान कंप्यूटर नाम देता है।
कुछ शोध के बाद हमें इस समस्या को हल करने का एक उपाय मिला:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName
इससे कंप्यूटर नाम सहित सभी समस्याओं का समाधान हो गया।
जिन उत्तरों का मैंने परीक्षण किया, उनमें से कोई भी वास्तव में प्रदान नहीं किया गया था, क्योंकि मैं उस डीएनएस प्रत्यय की तलाश कर रहा था, जिसकी मुझे तलाश थी। यहाँ मैं क्या लेकर आया हूँ।
public static string GetFqdn()
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
var ipprops = networkInterfaces.First().GetIPProperties();
var suffix = ipprops.DnsSuffix;
return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}
यदि आप इसे ठीक करना चाहते हैं, और अपवादों को संभालना चाहते हैं, तो यह प्रयास करें:
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
मुझे प्राथमिक डोमेन प्रत्यय के साथ हमेशा होस्टनाम (नेटबायोस नहीं) मिलता है। यह इस बात पर निर्भर नहीं करता है कि मशीन एक डोमेन का हिस्सा है, एक DNS सर्वर पहुंच योग्य है या नेटज़वर्क जुड़ा हुआ है। संभवतः मैं आपके स्पष्टीकरण को नहीं समझता लेकिन परिणाम वही है जिसकी मुझे उम्मीद है। (मशीन: W2008R2; .net 4.0; netbiosname: TESTNAME-VERYLO होस्टनाम: TESTNAME-VERYLONG)