আপনি কীভাবে সি # তে স্থানীয় মেশিনের এফকিউডিএন পেতে পারেন?
উত্তর:
দ্রষ্টব্য: এই সমাধানটি শুধুমাত্র .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()
উইলটি ফিরে উপরের পদ্ধতিটি হোস্টের নেটবাইজের নাম ফিরিয়ে দেবে।
এই পার্থক্যটি গুরুত্বপূর্ণ যখন মেশিন এফকিউডিএন সন্ধানের উদ্দেশ্য তথ্য লগ করা, বা একটি প্রতিবেদন তৈরি করা। বেশিরভাগ সময় আমি লগ বা রিপোর্টে এই পদ্ধতিটি ব্যবহার করেছি যা পরবর্তী সময়ে কোনও নির্দিষ্ট মেশিনে তথ্য মানচিত্রে ব্যবহৃত হয়। যদি মেশিনগুলি নেটওয়ার্ক না হয় তবেlocalhost
সনাক্তকারীটি অকেজো, অন্যদিকে নামটি প্রয়োজনীয় তথ্য দেয়।
সুতরাং শেষ পর্যন্ত এটি প্রতিটি ব্যবহারকারীর উপর নির্ভর করে যে তাদের প্রয়োগের জন্য কোন পদ্ধতিটি আরও উপযুক্ত তার উপযুক্ত ফলাফলগুলির উপর নির্ভর করে। তবে এই উত্তরটি যথেষ্ট সংক্ষিপ্ত না হওয়ার জন্য ভুল বলে রাখা সর্বোপরি মাত্রাতিরিক্ত।
আউটপুট আলাদা হবে যেখানে একটি উদাহরণ দেখুন: http://ideone.com/q4S4I0
Dns.GetHostName()
করবেন ? hostName
HostName
IPGlobalProperties
IPGlobalProperties
হোস্টনামের সম্পত্তি নেটবিআইওএস নামটি দেয়, যেখানে Dns.GetHostName()
ডিএনএস হোস্টের নাম দেয় returns
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(".")
পরিত্রাণ পেতে শেষ লাইনে একটি যুক্ত করুন। যদি এটি বিদ্যমান থাকে।
এটি এই নিবন্ধ দ্বারা আচ্ছাদিত করা হয় । এই কৌশলটি গৃহীত উত্তরের চেয়ে আরও সংক্ষিপ্ত এবং সম্ভবত পরবর্তী সর্বাধিক ভোট দেওয়া উত্তরের চেয়ে বেশি নির্ভরযোগ্য। মনে রাখবেন যতদূর আমি বুঝতে পারি, এটি নেটবিআইওএস নাম ব্যবহার করে না , সুতরাং এটি ইন্টারনেট ব্যবহারের জন্য উপযুক্ত হতে হবে।
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")
অপ্রচলিত হয়। ভিএস 2010 এর GetHostEntry("localhost")
পরিবর্তে আমি পরিবর্তে ব্যবহার করার পরামর্শ দিয়েছি যা ভাল কাজ করে।
আপনি নিম্নলিখিত চেষ্টা করতে পারেন:
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
এই শব্দটি আপনাকে বর্তমান স্থানীয় মেশিনের এফকিউডিএন দেয় (বা আপনি কোনও হোস্ট নির্দিষ্ট করতে পারেন)।
ম্যাট জেড এর উত্তরে একটি সামান্য উন্নতি যাতে কম্পিউটার কোনও ডোমেনের সদস্য না হলে একটি পেছনের পূর্ণ স্টপ ফিরে না পাওয়া যায়:
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
এটি প্রতিবেদন তৈরির জন্য হোস্টের নাম এবং ডোমেন নাম একত্রিত করার জন্য আমার বিকল্পগুলির মধ্যে একটি হিসাবে ব্যবহার করা হয়েছে, যখন ডোমেন নামটি ক্যাপচার করা হয়নি তখন পূরণ করার জন্য জেনেরিক পাঠ্য যুক্ত করা হয়েছিল, এটি গ্রাহকদের প্রয়োজনীয়তার একটি ছিল।
আমি এটি সি # 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
}
মিকি ডাইনস্কু সমাধান থেকে ধারণাগুলি ব্যবহার করে নির্মিত।
আমরা এইভাবে ব্যবহারের জন্য প্রস্তাবিত ফলাফল কার্যকর করেছি:
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}";
}
এফকিউ হোস্টনেম / হোস্টনাম / নেটবিআইওএস মেশিনেনাম / ডোমেননেমের চারপাশে সমস্ত ক্ষেত্রে পরিচালনা করার জন্য পদ্ধতিগুলির আমার সংগ্রহ
/// <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;
}
আপনি যদি এটি পরিপাটি করে রাখতে চান, এবং ব্যতিক্রমগুলি পরিচালনা করতে চান তবে এটি ব্যবহার করে দেখুন:
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
আমি সর্বদা প্রাথমিক ডোমেন প্রত্যয় সহ হোস্টনাম (নেটবিওস নয়) পাই। এটি মেশিনটি কোনও ডোমেনের অংশ কিনা, কোনও ডিএনএস সার্ভার পৌঁছনীয় বা নেটজওয়ার্ক সংযুক্ত কিনা তার উপর নির্ভর করে না। সম্ভবত আমি আপনার ব্যাখ্যাটি বুঝতে পারি না তবে ফলাফলটি আমি প্রত্যাশা করি। (মেশিন: W2008R2; .NET 4.0; নেটবায়োস নাম: টেস্ট-নেম-ভেরিওর হোস্টনাম: টেস্ট-নেম-ভেরিওলং)