.NET ফ্রেমওয়ার্ক 4.x ব্যবহার করে bit৪ বিট উইন্ডোজের নিচে রেজিস্ট্রি অ্যাক্সেসের জন্য স্থানীয় সমর্থন রয়েছে । নিম্নলিখিত কোডটি উইন্ডোজ 7, 64 বিট এবং উইন্ডোজ 10, 64 বিটের সাথেও পরীক্ষা করা হয় ।
ব্যবহারের পরিবর্তে "Wow6432Node"
, যা কোনও রেজিস্ট্রি গাছকে অন্যটিতে ম্যাপিং করে কোনও নোডকে অনুকরণ করে সেখানে কার্যত প্রদর্শিত হয়, আপনি ফলউইং করতে পারেন:
আপনার যদি 64 বিট বা 32 বিট রেজিস্ট্রি অ্যাক্সেস করতে হবে এবং নীচে বর্ণিত হিসাবে এটি ব্যবহার করুন কিনা তা স্থির করুন। আপনি পরে উল্লিখিত কোডটি (অতিরিক্ত তথ্য বিভাগ) ব্যবহার করতে পারেন, যা একটি কোয়েরিতে উভয় নোড থেকে রেজিস্ট্রি কীগুলি পেতে ইউনিয়ন কোয়েরি তৈরি করে - যাতে আপনি তাদের আসল পথটি ব্যবহার করে এখনও তাদের জিজ্ঞাসা করতে পারেন।
64 বিট রেজিস্ট্রি
64 বিট রেজিস্ট্রি অ্যাক্সেস করতে, আপনি RegistryView.Registry64
নিম্নলিখিত হিসাবে ব্যবহার করতে পারেন :
string value64 = string.Empty;
RegistryKey localKey =
RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,
RegistryView.Registry64);
localKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
if (localKey != null)
{
value64 = localKey.GetValue("RegisteredOrganization").ToString();
localKey.Close();
}
Console.WriteLine(String.Format("RegisteredOrganization [value64]: {0}",value64));
32 বিট রেজিস্ট্রি
যদি আপনি 32 বিট রেজিস্ট্রি অ্যাক্সেস করতে চান তবে RegistryView.Registry32
নীচের হিসাবে ব্যবহার করুন :
string value32 = string.Empty;
RegistryKey localKey32 =
RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,
RegistryView.Registry32);
localKey32 = localKey32.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
if (localKey32 != null)
{
value32 = localKey32.GetValue("RegisteredOrganization").ToString();
localKey32.Close();
}
Console.WriteLine(String.Format("RegisteredOrganization [value32]: {0}",value32));
বিভ্রান্ত হবেন না, উভয় সংস্করণই Microsoft.Win32.RegistryHive.LocalMachine
প্রথম প্যারামিটার হিসাবে ব্যবহার করছে , আপনি ২ য় প্যারামিটার ( বনাম ) দ্বারা bit৪ বিট বা 32 বিট ব্যবহার করবেন কিনা তা পার্থক্য তৈরি করেছেন ।RegistryView.Registry64
RegistryView.Registry32
নোট যে
Bit৪ বিট উইন্ডোতে, 32৪ HKEY_LOCAL_MACHINE\Software\Wow6432Node
বিট সিস্টেমে 32 বিট অ্যাপ্লিকেশন দ্বারা ব্যবহৃত মান রয়েছে। কেবল সত্য 64 বিট অ্যাপ্লিকেশনগুলি তাদের মানগুলি HKEY_LOCAL_MACHINE\Software
সরাসরি সঞ্চয় করে । সাবট্রিটি Wow6432Node
32 বিট অ্যাপ্লিকেশনগুলির জন্য সম্পূর্ণ স্বচ্ছ, 32 বিট অ্যাপ্লিকেশনগুলি এখনও HKEY_LOCAL_MACHINE\Software
যেমনটি প্রত্যাশা করে ততক্ষণ দেখুন (এটি এক ধরণের পুনঃনির্দেশ)। পাশাপাশি 32 বিট উইন্ডোজ 7 যেমন উইন্ডোজের পুরোনো সংস্করণগুলি (এবং ভিস্তা 32 বিট) সাবট্রি Wow6432Node
স্পষ্টত নেই না বিদ্যমান।
উইন্ডোজ in (bit৪ বিট) -র একটি বাগের কারণে, 32 বিট উত্স কোড সংস্করণ সর্বদা "মাইক্রোসফ্ট" ফিরিয়ে দেয় আপনি নির্বিশেষে কোন সংস্থায় registered৪ বিট উত্স কোড সংস্করণটি সঠিক সংস্থাটি ফিরিয়ে দেয়।
আপনি যে উদাহরণ সরবরাহ করেছেন তা ফিরে আসার জন্য, 64৪ বিট শাখাটি অ্যাক্সেস করার জন্য এটি নিম্নলিখিত উপায়ে করুন:
RegistryKey localKey =
RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,
RegistryView.Registry64);
RegistryKey sqlServerKey = localKey.OpenSubKey(
@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL");
string sqlExpressKeyName = (string) sqlServerKey.GetValue("SQLEXPRESS");
ব্যবহারিক ব্যবহারের জন্য অতিরিক্ত তথ্য:
আমি জনি স্কোভডাল মন্তব্যগুলিতে একটি আকর্ষণীয় পন্থা যুক্ত করতে চাই , যা আমি তার পদ্ধতির সাহায্যে কিছু কার্যকর ফাংশন বিকাশের জন্য গ্রহণ করেছি: কিছু পরিস্থিতিতে আপনি সমস্ত কীগুলি 32 বিট বা নির্বিশেষে ফিরে পেতে চান 64 বিট। এসকিউএল উদাহরণগুলির নামগুলি এরকম একটি উদাহরণ। আপনি নিম্নলিখিত ক্ষেত্রে একটি ইউনিয়ন কোয়েরি ব্যবহার করতে পারেন (সি # 6 বা উচ্চতর):
public static IEnumerable<string> GetRegValueNames(RegistryView view, string regPath,
RegistryHive hive = RegistryHive.LocalMachine)
{
return RegistryKey.OpenBaseKey(hive, view)
?.OpenSubKey(regPath)?.GetValueNames();
}
public static IEnumerable<string> GetAllRegValueNames(string RegPath,
RegistryHive hive = RegistryHive.LocalMachine)
{
var reg64 = GetRegValueNames(RegistryView.Registry64, RegPath, hive);
var reg32 = GetRegValueNames(RegistryView.Registry32, RegPath, hive);
var result = (reg64 != null && reg32 != null) ? reg64.Union(reg32) : (reg64 ?? reg32);
return (result ?? new List<string>().AsEnumerable()).OrderBy(x => x);
}
public static object GetRegValue(RegistryView view, string regPath, string ValueName="",
RegistryHive hive = RegistryHive.LocalMachine)
{
return RegistryKey.OpenBaseKey(hive, view)
?.OpenSubKey(regPath)?.GetValue(ValueName);
}
public static object GetRegValue(string RegPath, string ValueName="",
RegistryHive hive = RegistryHive.LocalMachine)
{
return GetRegValue(RegistryView.Registry64, RegPath, ValueName, hive)
?? GetRegValue(RegistryView.Registry32, RegPath, ValueName, hive);
}
public static IEnumerable<string> GetRegKeyNames(RegistryView view, string regPath,
RegistryHive hive = RegistryHive.LocalMachine)
{
return RegistryKey.OpenBaseKey(hive, view)
?.OpenSubKey(regPath)?.GetSubKeyNames();
}
public static IEnumerable<string> GetAllRegKeyNames(string RegPath,
RegistryHive hive = RegistryHive.LocalMachine)
{
var reg64 = GetRegKeyNames(RegistryView.Registry64, RegPath, hive);
var reg32 = GetRegKeyNames(RegistryView.Registry32, RegPath, hive);
var result = (reg64 != null && reg32 != null) ? reg64.Union(reg32) : (reg64 ?? reg32);
return (result ?? new List<string>().AsEnumerable()).OrderBy(x => x);
}
এখন আপনি উপরের ফাংশনগুলি কেবল নীচের মতো ব্যবহার করতে পারেন:
উদাহরণ 1: এসকিউএল উদাহরণগুলির নাম পান
var sqlRegPath=@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL";
foreach (var valueName in GetAllRegValueNames(sqlRegPath))
{
var value=GetRegValue(sqlRegPath, valueName);
Console.WriteLine($"{valueName}={value}");
}
sqlRegPath এ আপনাকে মান নাম এবং মানগুলির একটি তালিকা দেবে।
দ্রষ্টব্য: আপনি যদি উপরের সম্পর্কিত ফাংশনগুলিতে প্যারামিটার বাদ দেন তবে আপনি একটি কী ( ডিফল্ট কমান্ডলাইন সরঞ্জাম দ্বারা REGEDT32.EXE
চিহ্নিত (Default)
) এর মান নির্ধারণ করতে পারেন ValueName
।
একটি রেজিস্ট্রি কীতে সাবকিগুলির একটি তালিকা পেতে , ফাংশনটি ব্যবহার করুন GetRegKeyNames
বাGetAllRegKeyNames
। আপনি রেজিস্ট্রিতে আরও কীগুলি অনুসরণ করতে এই তালিকাটি ব্যবহার করতে পারেন।
উদাহরণ 2: ইনস্টল করা সফ্টওয়্যারটির আনইনস্টল তথ্য পান
var currentVersionRegPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion";
var uninstallRegPath = $@"{currentVersionRegPath}\Uninstall";
var regKeys = Registry.GetAllRegKeyNames(RegPath: uninstallRegPath);
সমস্ত 32 বিট এবং 64 বিট আনইনস্টল কীগুলি পাবেন।
ফাংশনগুলিতে নাল হ্যান্ডলিংয়ের প্রয়োজনীয়তা লক্ষ্য করুন কারণ এসকিউএল সার্ভারটি 32 বিট বা 64৪ বিটের হিসাবে ইনস্টল করা যেতে পারে (উদাহরণস্বরূপ 1 টি)। ফাংশনগুলি ওভারলোড হয়ে গেছে যাতে প্রয়োজনে আপনি এখনও 32 বিট বা 64 বিট প্যারামিটারটি পাস করতে পারেন - তবে, আপনি যদি এটি বাদ দেন তবে এটি 64 বিট পড়ার চেষ্টা করবে, যদি এটি ব্যর্থ হয় (নাল মান), এটি 32 বিট মানগুলি পড়ে।
এখানে একটি বৈশিষ্ট্য রয়েছে: কারণ GetAllRegValueNames
সাধারণত লুপের প্রসঙ্গে ব্যবহৃত হয় (উপরে উদাহরণ 1 দেখুন), এটি লুপগুলি null
সরল করার পরিবর্তে একটি খালি গণনার ফিরিয়ে দেয় foreach
: যদি এটি সেভাবে পরিচালনা করা না যায় তবে লুপটি উপস্থাপিত করতে হবে একটি if
বিবৃতি চেকnull
করা অসুবিধাগুলি তা করানো হবে - যাতে ফাংশনে একবার মোকাবেলা করা হয়।
নাল সম্পর্কে কেন বিরক্ত করছেন? কারণ যদি আপনি যত্ন না পান তবে আপনার কোডটিতে কেন সেই নাল রেফারেন্স ব্যতিক্রম ছড়িয়ে দেওয়া হয়েছিল তা জানতে আপনার আরও অনেক মাথাব্যথা থাকবে - আপনি কোথায় এবং কেন এটি ঘটেছে তা খুঁজে বের করতে অনেক সময় ব্যয় করতে চাই। এবং যদি এটি উত্পাদনে ঘটে থাকে তবে আপনি লগ ফাইলগুলি বা ইভেন্টের লগগুলি অধ্যয়ন করতে খুব ব্যস্ত থাকবেন (আমি আশা করি আপনি লগিংটি কার্যকর করেছেন) ... নাল ইস্যুগুলি যেখানে আপনি একটি প্রতিরক্ষামূলক উপায়ে পারেন তা এড়ানো ভাল avoid অপারেটরগণ ?.
, ?[
... ]
এবং ??
আপনাকে অনেক সহায়তা করতে পারে (উপরের কোডটি দেখুন)। সেখানে একটা চমৎকার সংশ্লিষ্ট নিবন্ধটি নতুন আলোচনা করছে C # nullable রেফারেন্স ধরনের , যা আমি পড়তে এবং সুপারিশ এই এক এলভিস অপারেটর সম্পর্কে।
ইঙ্গিত: উইন্ডোজ অধীনে সমস্ত উদাহরণ পরীক্ষা করতে আপনি লিনকপ্যাডের ফ্রি সংস্করণ ব্যবহার করতে পারেন । এটি একটি ইনস্টলেশন প্রয়োজন হয় না। নেমস্পেস আমদানি ট্যাবে টিপতে F4এবং প্রবেশ করতে ভুলবেন না Microsoft.Win32
। ভিজ্যুয়াল স্টুডিওতে আপনার প্রয়োজনusing Microsoft.Win32;
আপনার কোডের শীর্ষে ।
টিপ: নতুন নাল হ্যান্ডলিং অপারেটরগুলির সাথে নিজেকে পরিচিত করতে , লিনকপ্যাডে নিম্নলিখিত কোডটি চেষ্টা করুন (এবং ডিবাগ করুন):
উদাহরণ 3: নাল হ্যান্ডলিং অপারেটরগুলি প্রদর্শন করা
static string[] test { get { return null;} }
static void Main()
{
test.Dump();
test?.Dump();
test?[0].Dump();
(test?[0]).Dump();
(test?[0]??"<null>").Dump();
}
। নেট ফিজল দিয়ে এটি ব্যবহার করে দেখুন
আপনি যদি আগ্রহী হন তবে এই সরঞ্জামটির সাহায্যে আপনি আর কী করতে পারেন তা প্রদর্শন করার জন্য আমি এখানে কয়েকটি উদাহরণ রেখেছি।