C # /। NET में स्थानीय मशीन का FQDN कैसे खोजें?


87

आप C # में स्थानीय मशीन का FQDN कैसे प्राप्त कर सकते हैं?

जवाबों:


143

नोट: यह समाधान केवल .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


2
उपयोग करके Dns.GetHostEntry("LocalHost").HostNameमुझे प्राथमिक डोमेन प्रत्यय के साथ हमेशा होस्टनाम (नेटबायोस नहीं) मिलता है। यह इस बात पर निर्भर नहीं करता है कि मशीन एक डोमेन का हिस्सा है, एक DNS सर्वर पहुंच योग्य है या नेटज़वर्क जुड़ा हुआ है। संभवतः मैं आपके स्पष्टीकरण को नहीं समझता लेकिन परिणाम वही है जिसकी मुझे उम्मीद है। (मशीन: W2008R2; .net 4.0; netbiosname: TESTNAME-VERYLO होस्टनाम: TESTNAME-VERYLONG)
-wiggle

जो वस्तु आपके पास पहले से है, उसकी संपत्ति का उपयोग करने Dns.GetHostName()के hostNameबजाय आप एक पंक्ति से ऊपर का उपयोग क्यों करते हैं ? HostNameIPGlobalProperties
Xharlie

@Xharlie क्योंकि IPGlobalPropertiesहोस्टनाम गुण NetBIOS नाम Dns.GetHostName()लौटाता है , जबकि DNS होस्ट नाम देता है।
माइक दिनेस्कु

2
EndsWithजांच होस्ट नामों का टूट गया है कि डोमेन नाम के रूप में ही पत्र (जैसे एक डोमेन OST में मेजबान myhost) के साथ अंत, शायद होना चाहिएEndsWith("." + domainName)
user3391859

6
यदि domainName खाली है तो यह रिटर्न करता है hostName.। एक !String.isNullorEmpty(domainName)जांच होनी चाहिए
रॉगरइंटरगेट

63

मिकी डी के कोड का एक मामूली सरलीकरण

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

4
मिकी डी के कोड के विपरीत, यदि मशीन एक डोमेन का सदस्य नहीं है, तो यह एक होस्टेड फुलस्टॉप के साथ होस्टनाम देता है।
बॉस्को

1
साथ ही, यह DNS होस्ट नाम के बजाय NetBIOS नाम का उपयोग करता है। मेरा मानना ​​है कि NetBIOS नाम केवल LAN में उपयुक्त हैं।
सैम

शायद .Trim(".")छुटकारा पाने के लिए अंतिम पंक्ति में एक जोड़ दें । अगर यह मौजूद है।
डेविड डी सी ई फ्रीटास

28

यह इस लेख द्वारा कवर किया गया है । यह तकनीक स्वीकृत उत्तर की तुलना में अधिक संक्षिप्त है और शायद अगले सबसे अधिक मतदान वाले उत्तर की तुलना में अधिक विश्वसनीय है। ध्यान दें कि जहां तक ​​मैं समझता हूं, यह NetBIOS नामों का उपयोग नहीं करता है , इसलिए यह इंटरनेट उपयोग के लिए उपयुक्त होना चाहिए।

.NET 2.0+

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName

@DexterLegaspi - सैम का उत्तर एक अच्छा है (मैंने इसे स्वयं भी अप-वोड किया है) लेकिन यह मेरे उत्तर के बराबर नहीं है, और न ही बेहतर है। कृपया विवरण के लिए मेरा अद्यतन उत्तर देखें।
माइक दिनेस्कु

@MikeDinescu सवाल यह है कि एफक्यूडीएन कैसे प्राप्त करें, जो यह बताता है कि मशीन एक नेटवर्क पर है और एक डोमेन का हिस्सा है। स्वीकृत उत्तर काम करता है लेकिन सैम का उत्तर अधिक "सटीक" (बेहतर कार्यकाल की कमी के लिए) है
डेक्सटर लेगास्पी

3
यह सही जवाब है! लेकिन इसके बजाय Dns.GetHostEntry("LocalHost").HostNameआप बेहतर तरीके से एक खाली स्ट्रिंग पास करें जैसे:Dns.GetHostEntry("").HostName
paulgutten

17

यहाँ यह PowerShell में है, इसके लिए यह है:

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

15

और फ्रेमवर्क 1.1 के लिए इस रूप में सरल है:

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

और उसके बाद केवल डोमेन नाम को पुनः प्राप्त करने के लिए मशीन NETBIOS नाम को हटा दें


यहां 2013 में, GetHostByName("localhost")obsoleted है। वीएस 2010 ने सुझाव दिया कि मैं GetHostEntry("localhost")इसके बजाय उपयोग करता हूं , जो ठीक काम करता है।
पाइडर

@piedar, आप .NET 1.1 के लिए इस बारे में थोड़ा याद कर सकते हैं।
सैम

मैं इस उत्तर में अद्यतन जानकारी जोड़ना चाहता था, क्योंकि यह सबसे सरल था और इस प्रकार यह मेरा पसंदीदा था। मैंने संभवतः आपके उत्तर को देखने के लिए पर्याप्त स्क्रॉल नहीं किया था, जिसने वास्तव में मेरी टिप्पणी को अनावश्यक बना दिया था।
17

8

आप निम्नलिखित की कोशिश कर सकते हैं:

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

यह जोर आपको वर्तमान स्थानीय मशीन का FQDN देता है (या आप किसी भी होस्ट को निर्दिष्ट कर सकते हैं)।


5

मैट ज़ेड के उत्तर पर एक मामूली सुधार ताकि कंप्यूटर एक डोमेन का सदस्य न होने पर एक पूर्ण विराम वापस आ जाए।

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

ध्यान दें कि मुझे लगता है कि यह NetBIOS होस्ट नाम का उपयोग करता है, इसलिए यह इंटरनेट उपयोग के लिए उपयुक्त नहीं हो सकता है।
सैम

2

रिपोर्ट बनाने के लिए होस्ट नाम और डोमेन नाम को संयोजित करने के लिए मेरे विकल्पों में से एक के रूप में इसका इस्तेमाल किया, डोमेन नाम में कब्जा नहीं होने पर भरने के लिए जेनेरिक पाठ जोड़ा, यह ग्राहकों की आवश्यकताओं में से एक था।

मैंने 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 समाधान से विचारों का उपयोग कर बनाया गया।


1

हमने इस तरह से उपयोग करने के लिए सुझाए गए परिणाम को लागू किया है:

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

हालाँकि, यह पता चला कि यह सही नहीं है जब कंप्यूटर का नाम 15 अक्षरों से अधिक लंबा हो और नेटबायोस नाम का उपयोग कर रहा हो। एन्वायर्नमेंट। मैचिनेनाम केवल आंशिक नाम देता है और होस्ट नाम हल करने पर समान कंप्यूटर नाम देता है।

कुछ शोध के बाद हमें इस समस्या को हल करने का एक उपाय मिला:

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

इससे कंप्यूटर नाम सहित सभी समस्याओं का समाधान हो गया।


यह एक अपवाद को फेंक देगा, और सुझाए गए अधिकांश अन्य समाधान भी विफल हो जाएंगे, यदि आपके पास एक कंप्यूटर है जिसे उपयोगकर्ता द्वारा नाम दिया गया है जिसमें az, 0-9, ',', '-' से नहीं है। यदि एशिया या इससे मिलते-जुलते उपयोगकर्ता हैं तो समस्याओं की उम्मीद करें। GetHostName में उन अक्षरों को '?' द्वारा प्रतिस्थापित किया जाएगा। यही कारण है कि मैं GetHostByName ("लोकलहोस्ट") को पसंद करता हूं। HostName जो वास्तविक कंप्यूटर का नाम दिखाता है।
गोरान

0

मैंने इस दृष्टिकोण का उपयोग किया है:

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

0

जिन उत्तरों का मैंने परीक्षण किया, उनमें से कोई भी वास्तव में प्रदान नहीं किया गया था, क्योंकि मैं उस डीएनएस प्रत्यय की तलाश कर रहा था, जिसकी मुझे तलाश थी। यहाँ मैं क्या लेकर आया हूँ।

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

-9

यदि आप इसे ठीक करना चाहते हैं, और अपवादों को संभालना चाहते हैं, तो यह प्रयास करें:

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
"और अपवादों को संभालना" - विफल।
जोगेन सिगवार्डसन

आपको लगता है कि खुद को पकड़ना अपवाद को संभालता है!
साहिर अहवाल

नहीं, मुझे लगता है कि आप अपवादों को कैसे संभालना चाहते हैं, यह कुछ ऐसा है जिसे आपको खुद तय करने की जरूरत है। और यदि आपको एक डोमेन नाम वापस नहीं मिलता है, तो आप इसे कैसे संभालना चाहेंगे?
रोजर विलकॉक्स

4
एक त्रुटि रिपोर्ट दर्ज करें और उपयोगकर्ता को चेतावनी दें कि दोषपूर्ण जानकारी के साथ क्लाइंट कोड की आपूर्ति करने के बजाय कुछ गलत हो गया।
डेहव्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.