সি # /। নেট এ কীভাবে স্থানীয় মেশিনের এফকিউডিএন সন্ধান করবেন?


89

আপনি কীভাবে সি # তে স্থানীয় মেশিনের এফকিউডিএন পেতে পারেন?

উত্তর:


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ফিরে আসবেlocalhostGetFQDN() উইলটি ফিরে উপরের পদ্ধতিটি হোস্টের নেটবাইজের নাম ফিরিয়ে দেবে।

এই পার্থক্যটি গুরুত্বপূর্ণ যখন মেশিন এফকিউডিএন সন্ধানের উদ্দেশ্য তথ্য লগ করা, বা একটি প্রতিবেদন তৈরি করা। বেশিরভাগ সময় আমি লগ বা রিপোর্টে এই পদ্ধতিটি ব্যবহার করেছি যা পরবর্তী সময়ে কোনও নির্দিষ্ট মেশিনে তথ্য মানচিত্রে ব্যবহৃত হয়। যদি মেশিনগুলি নেটওয়ার্ক না হয় তবেlocalhost সনাক্তকারীটি অকেজো, অন্যদিকে নামটি প্রয়োজনীয় তথ্য দেয়।

সুতরাং শেষ পর্যন্ত এটি প্রতিটি ব্যবহারকারীর উপর নির্ভর করে যে তাদের প্রয়োগের জন্য কোন পদ্ধতিটি আরও উপযুক্ত তার উপযুক্ত ফলাফলগুলির উপর নির্ভর করে। তবে এই উত্তরটি যথেষ্ট সংক্ষিপ্ত না হওয়ার জন্য ভুল বলে রাখা সর্বোপরি মাত্রাতিরিক্ত।

আউটপুট আলাদা হবে যেখানে একটি উদাহরণ দেখুন: http://ideone.com/q4S4I0


4
ব্যবহার করে Dns.GetHostEntry("LocalHost").HostNameআমি সর্বদা প্রাথমিক ডোমেন প্রত্যয় সহ হোস্টনাম (নেটবিওস নয়) পাই। এটি মেশিনটি কোনও ডোমেনের অংশ কিনা, কোনও ডিএনএস সার্ভার পৌঁছনীয় বা নেটজওয়ার্ক সংযুক্ত কিনা তার উপর নির্ভর করে না। সম্ভবত আমি আপনার ব্যাখ্যাটি বুঝতে পারি না তবে ফলাফলটি আমি প্রত্যাশা করি। (মেশিন: W2008R2; .NET 4.0; নেটবায়োস নাম: টেস্ট-নেম-ভেরিওর হোস্টনাম: টেস্ট-নেম-ভেরিওলং)
মার্শ-

আপনি কেন ইতিমধ্যে আপনার নিজের উপরে থাকা একটি বস্তুর সম্পত্তি ব্যবহার করার পরিবর্তে ব্যবহার Dns.GetHostName()করবেন ? hostNameHostNameIPGlobalProperties
Xharlie

@ Xharlie কারণ IPGlobalPropertiesহোস্টনামের সম্পত্তি নেটবিআইওএস নামটি দেয়, যেখানে Dns.GetHostName()ডিএনএস হোস্টের নাম দেয় returns
মাইক ডাইনেসকু

4
EndsWithচেক হোস্টনেইম জন্য নষ্ট হয়ে গেছে যে ডোমেন নাম হিসাবে একই চিঠি (যেমন একটি ডোমেইন OST মধ্যে হোস্ট MYHOST) সঙ্গে শেষ, সম্ভবত হওয়া উচিতEndsWith("." + domainName)
user3391859

7
যদি ডোমেইননামটি খালি থাকে তবে এটি ফিরে আসে hostName. । একটি !String.isNullorEmpty(domainName)চেক থাকা উচিত
রডজারগ্রেট

63

মিকি ডি এর কোডটির একটি সামান্য সরলীকরণ

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

4
মিকি ডি-এর কোডের বিপরীতে যদি মেশিনটি কোনও ডোমেনের সদস্য না হয় তবে এটি সংযুক্ত ফুলস্টপ সহ হোস্টনামটি দেয়।
বসকো

4
এছাড়াও, এটি ডিএনএস হোস্ট নামের পরিবর্তে নেটবিআইওএস নাম ব্যবহার করে। আমি বিশ্বাস করি নেটবিআইওএসের নামগুলি কেবল ল্যানের মধ্যেই উপযুক্ত।
স্যাম

সম্ভবত .Trim(".")পরিত্রাণ পেতে শেষ লাইনে একটি যুক্ত করুন। যদি এটি বিদ্যমান থাকে।
ডেভিড ডি সি ই ফ্রেইটাস

29

এটি এই নিবন্ধ দ্বারা আচ্ছাদিত করা হয় । এই কৌশলটি গৃহীত উত্তরের চেয়ে আরও সংক্ষিপ্ত এবং সম্ভবত পরবর্তী সর্বাধিক ভোট দেওয়া উত্তরের চেয়ে বেশি নির্ভরযোগ্য। মনে রাখবেন যতদূর আমি বুঝতে পারি, এটি নেটবিআইওএস নাম ব্যবহার করে না , সুতরাং এটি ইন্টারনেট ব্যবহারের জন্য উপযুক্ত হতে হবে।

.NET 2.0+

Dns.GetHostEntry("LocalHost").HostName

নেট 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName

@ ডেক্সটারলেগাস্পি - স্যামের উত্তরটি একটি ভাল উত্তর (আমি নিজেও এটিকে ভোড দিয়েছি) তবে এটি আমার উত্তরের সমতুল্য নয়, প্রয়োজনীয়ভাবেও এর চেয়ে ভাল নয়। বিশদ জন্য আমার আপডেট উত্তর দেখুন।
মাইক ডাইনসকু

@ মাইকডাইনস্কু প্রশ্নটি কীভাবে এফকিউডিএন পাবেন, যা মেশিনটি একটি নেটওয়ার্ক এবং একটি ডোমেনের অংশে রয়েছে তা বোঝায়। গৃহীত উত্তরটি কাজটি করে তবে স্যামের উত্তরটি আরও "সুনির্দিষ্ট" (আরও ভাল শর্তের অভাবে)
ডেক্সটার লেগাস্পি

4
এটা সঠিক উত্তর! তবে এর Dns.GetHostEntry("LocalHost").HostNameচেয়ে ভাল করার পরিবর্তে আপনি খালি স্ট্রিংটি পাস করুন:Dns.GetHostEntry("").HostName
পলগুটেন

17

এটি হ্যাকের জন্য এটি পাওয়ারশেলটিতে রয়েছে:

$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")অপ্রচলিত হয়। ভিএস 2010 এর GetHostEntry("localhost")পরিবর্তে আমি পরিবর্তে ব্যবহার করার পরামর্শ দিয়েছি যা ভাল কাজ করে।
পাইদার

@ পিডার, আপনি নেট। 1.1 এর জন্য এই সম্পর্কে কিছুটা মিস করতে পারেন।
স্যাম

আমি এই উত্তরে আপডেট হওয়া তথ্য যুক্ত করতে চেয়েছিলাম, কারণ এটি ছিল সহজতম এবং এভাবে আমার প্রিয়। আপনার উত্তরটি দেখার জন্য আমি সম্ভবত খুব বেশি স্ক্রোল করি নি, যা আমার মন্তব্যটিকে অপ্রয়োজনীয় করে তুলেছে।
পাইদার

8

আপনি নিম্নলিখিত চেষ্টা করতে পারেন:

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

এই শব্দটি আপনাকে বর্তমান স্থানীয় মেশিনের এফকিউডিএন দেয় (বা আপনি কোনও হোস্ট নির্দিষ্ট করতে পারেন)।


5

ম্যাট জেড এর উত্তরে একটি সামান্য উন্নতি যাতে কম্পিউটার কোনও ডোমেনের সদস্য না হলে একটি পেছনের পূর্ণ স্টপ ফিরে না পাওয়া যায়:

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

নোট করুন যে আমি মনে করি এটি নেটবিআইওএস হোস্টের নামটি ব্যবহার করে তাই এটি ইন্টারনেট ব্যবহারের জন্য উপযুক্ত নাও হতে পারে।
স্যাম

2

এটি প্রতিবেদন তৈরির জন্য হোস্টের নাম এবং ডোমেন নাম একত্রিত করার জন্য আমার বিকল্পগুলির মধ্যে একটি হিসাবে ব্যবহার করা হয়েছে, যখন ডোমেন নামটি ক্যাপচার করা হয়নি তখন পূরণ করার জন্য জেনেরিক পাঠ্য যুক্ত করা হয়েছিল, এটি গ্রাহকদের প্রয়োজনীয়তার একটি ছিল।

আমি এটি সি # 5.0, নেট .৪.৪.১ ব্যবহার করে পরীক্ষা করেছি

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
} 

মিকি ডাইনস্কু সমাধান থেকে ধারণাগুলি ব্যবহার করে নির্মিত।


1

আমরা এইভাবে ব্যবহারের জন্য প্রস্তাবিত ফলাফল কার্যকর করেছি:

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

তবে, পরিণত হয়েছে যে কম্পিউটারের নামটি 15 টি অক্ষরের চেয়ে বেশি হয়ে গেলে এবং নেটবিওস নামটি ব্যবহার করার পরে এটি সঠিকভাবে কাজ করে না। এনভায়রনমেন্ট.ম্যাচাইননেম কেবল আংশিক নাম দেয় এবং হোস্ট নামটি সমাধান করে একই কম্পিউটারের নাম দেয়।

কিছু গবেষণার পরে আমরা এই সমস্যাটি সমাধানের একটি সমাধান পেয়েছি:

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

এটি কম্পিউটারের নাম সহ সমস্ত সমস্যার সমাধান করে।


এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে, এবং প্রস্তাবিত বেশিরভাগ সমাধানগুলিও একই সাথে ব্যর্থ হবে, যদি আপনার এমন একটি কম্পিউটার থাকে যা ব্যবহারকারীর দ্বারা অ্যাজেড, 0-9, '।', '-' থেকে বর্ণযুক্ত অক্ষরযুক্ত কোনও ব্যবহারকারীকে একটি নাম দেওয়া হয়েছে। সুতরাং আপনার যদি এশিয়া বা এর মতো ব্যবহারকারীদের সমস্যা থাকে তবে আশা করুন। গেটহোস্টনামে সেই অক্ষরগুলি '?' দ্বারা প্রতিস্থাপিত হবে। এজন্যই আমি getHostByName ("লোকালহোস্ট") পছন্দ করি Host হোস্টনেম যা প্রকৃত কম্পিউটারের নাম দেখায়।
গুরান

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}";
}

0

এফকিউ হোস্টনেম / হোস্টনাম / নেটবিআইওএস মেশিনেনাম / ডোমেননেমের চারপাশে সমস্ত ক্ষেত্রে পরিচালনা করার জন্য পদ্ধতিগুলির আমার সংগ্রহ

    /// <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;
    }

-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;
        }

4
"এবং ব্যতিক্রমগুলি পরিচালনা করুন" - ব্যর্থ।
জর্জেন সিগওয়ার্ডসন

আপনি নিজেই ধরা ব্যতিক্রম পরিচালনা করে!
সাহের আহওয়াল

না, আমি মনে করি আপনি কীভাবে ব্যতিক্রমগুলি পরিচালনা করতে চান তা আপনার নিজের জন্য সিদ্ধান্ত নেওয়ার দরকার। এবং যদি আপনি কোনও ডোমেন নাম ফিরে না পেতে পারেন তবে আপনি কীভাবে এটি পরিচালনা করার প্রস্তাব করবেন?
রজার উইলককস

4
একটি ত্রুটি প্রতিবেদন লগ করুন এবং ব্যবহারকারীকে সতর্ক করুন যে ত্রুটিযুক্ত তথ্য সহ ক্লায়েন্ট কোড সরবরাহ করার পরিবর্তে কিছু ভুল হয়েছে।
dahvyd
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.