<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Administration on kenji.blog</title><link>http://kenji.blog/hi/categories/administration/</link><description>Recent content in Administration on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/categories/administration/index.xml" rel="self" type="application/rss+xml"/><item><title>Windows रजिस्ट्री का बुनियादी ज्ञान और प्रोग्राम करने योग्य सुरक्षित संपादन के तरीके</title><link>http://kenji.blog/hi/p/windows-registry-safe-programmable-editing/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/windows-registry-safe-programmable-editing/</guid><description>&lt;img src="http://kenji.blog/p/windows-registry-safe-programmable-editing/img/eyecatch.jpg" alt="Featured image of post Windows रजिस्ट्री का बुनियादी ज्ञान और प्रोग्राम करने योग्य सुरक्षित संपादन के तरीके" />&lt;h1 id="windows-रजसटर-क-बनयद-जञन-और-परगरम-करन-यगय-सरकषत-सपदन-क-तरक">Windows रजिस्ट्री का बुनियादी ज्ञान और प्रोग्राम करने योग्य सुरक्षित संपादन के तरीके
&lt;/h1>&lt;p>Windows ऑपरेटिंग सिस्टम में, &amp;ldquo;रजिस्ट्री (Registry)&amp;rdquo; एक विशाल पदानुक्रमित डेटाबेस (hierarchical database) है जो सिस्टम और एप्लिकेशन की विभिन्न सेटिंग्स को संग्रहीत करता है। इस लेख में, हम Windows रजिस्ट्री की बुनियादी वास्तुकला (architecture) से लेकर PowerShell और C# का उपयोग करके प्रोग्राम करने योग्य और सुरक्षित रजिस्ट्री संपादन विधियों तक बहुत विस्तार से चर्चा करेंगे।&lt;/p>
&lt;h2 id="1-परचय-windows-रजसटर-क-इतहस-और-वकस">1. परिचय: Windows रजिस्ट्री का इतिहास और विकास
&lt;/h2>&lt;p>Windows के शुरुआती संस्करणों (Windows 3.x युग) में, सिस्टम और एप्लिकेशन सेटिंग्स मुख्य रूप से &lt;code>.ini&lt;/code> (आरंभीकरण फ़ाइलों) में सहेजी जाती थीं। हालांकि, अनगिनत INI फ़ाइलें हर एप्लिकेशन के लिए पूरे सिस्टम में बिखरी हुई होने लगीं, जिससे प्रबंधन काफी जटिल हो गया। इसके अलावा, चूंकि INI फ़ाइलें प्लेन-टेक्स्ट आधारित थीं, इसलिए बाइनरी डेटा को सहेजना मुश्किल था, और एक्सेस कंट्रोल (सुरक्षा) के लिए कोई तंत्र मौजूद नहीं था। फ़ाइल पार्स करने की गति भी धीमी थी, जिससे बड़े पैमाने पर सेटिंग्स सहेजने के लिए यह अनुपयुक्त था।&lt;/p>
&lt;p>इन समस्याओं को मौलिक रूप से हल करने के लिए, Windows NT और Windows 95 के बाद से एक केंद्रीकृत सेटिंग डेटाबेस के रूप में &amp;ldquo;रजिस्ट्री&amp;rdquo; को पूरी तरह से अपनाया गया। रजिस्ट्री एक पदानुक्रमित डेटाबेस है, जो मजबूत टाइपिंग, बाइनरी डेटा सपोर्ट, और एक्सेस कंट्रोल लिस्ट (ACL) के माध्यम से मजबूत सुरक्षा सुविधाएँ प्रदान करता है। इससे OS कर्नेल से लेकर यूजर स्पेस एप्लिकेशन तक सभी घटकों (components) को एकीकृत इंटरफ़ेस (Win32 API के &lt;code>Reg*&lt;/code> फ़ंक्शन) के माध्यम से सेटिंग्स पढ़ने और लिखने की अनुमति मिल गई।&lt;/p>
&lt;p>आधुनिक Windows 11 तक, रजिस्ट्री OS के दिल के रूप में काम करती आ रही है। हार्डवेयर कॉन्फ़िगरेशन, डिवाइस ड्राइवर लोड क्रम, उपयोगकर्ता का डेस्कटॉप वातावरण, इंस्टॉल किए गए सॉफ़्टवेयर की सूची, आदि सिस्टम के संचालन के लिए आवश्यक सभी मेटाडेटा रजिस्ट्री में एकत्रित होते हैं।&lt;/p>
&lt;h2 id="2-वसतकल-क-गहरई-रजसटर-हइव-hive-क-वसतवकत-और-ममर-मपग">2. वास्तुकला की गहराई: रजिस्ट्री हाइव (Hive) की वास्तविकता और मेमोरी मैपिंग
&lt;/h2>&lt;p>हालांकि तार्किक रूप से रजिस्ट्री एक विशाल ट्री संरचना के रूप में दिखाई देती है, लेकिन भौतिक रूप से इसे &amp;ldquo;हाइव (Hive)&amp;rdquo; नामक कई फ़ाइलों में विभाजित किया जाता है और डिस्क पर सहेजा जाता है। इसके कारण संपूर्ण सिस्टम सेटिंग्स और उपयोगकर्ता-विशिष्ट सेटिंग्स अलग हो जाती हैं, जिससे कुशल लोडिंग संभव हो पाती है।&lt;/p>
&lt;p>मुख्य हाइव फ़ाइलें आमतौर पर &lt;code>%SystemRoot%\System32\config&lt;/code> डायरेक्टरी में मौजूद होती हैं।&lt;/p>
&lt;ul>
&lt;li>&lt;code>SYSTEM&lt;/code>: ऑपरेटिंग सिस्टम बूटिंग के लिए आवश्यक महत्वपूर्ण सेटिंग्स (ड्राइवर, सेवाएं, बूट कॉन्फ़िगरेशन, आदि)।&lt;/li>
&lt;li>&lt;code>SOFTWARE&lt;/code>: इंस्टॉल किए गए सॉफ़्टवेयर के लिए पूरे सिस्टम की सेटिंग्स। थर्ड-पार्टी ऐप्स की अधिकांश सेटिंग्स यहाँ जाती हैं।&lt;/li>
&lt;li>&lt;code>SAM&lt;/code>: Security Accounts Manager (स्थानीय उपयोगकर्ता खाते और पासवर्ड हैश)।&lt;/li>
&lt;li>&lt;code>SECURITY&lt;/code>: स्थानीय सुरक्षा नीतियां (Local Security Policy) और अधिकार आवंटन।&lt;/li>
&lt;li>&lt;code>DEFAULT&lt;/code>: डिफ़ॉल्ट उपयोगकर्ता प्रोफ़ाइल (नया उपयोगकर्ता बनाते समय टेम्पलेट)।&lt;/li>
&lt;/ul>
&lt;p>उपयोगकर्ता-विशिष्ट हाइव फ़ाइलें उपयोगकर्ता की प्रोफ़ाइल डायरेक्टरी (उदाहरण: &lt;code>C:\Users\Username&lt;/code>) में छिपी हुई फ़ाइलों के रूप में मौजूद होती हैं।&lt;/p>
&lt;ul>
&lt;li>&lt;code>NTUSER.DAT&lt;/code>: उस उपयोगकर्ता की बुनियादी सेटिंग्स (HKCU का अधिकांश भाग)।&lt;/li>
&lt;li>&lt;code>UsrClass.dat&lt;/code>: उस उपयोगकर्ता के लिए फ़ाइल एक्सटेंशन एसोसिएशन सेटिंग्स (&lt;code>AppData\Local\Microsoft\Windows&lt;/code> में स्थित)।&lt;/li>
&lt;/ul>
&lt;p>जब OS बूट होता है, तो कर्नेल के &amp;ldquo;Configuration Manager (CM)&amp;rdquo; द्वारा इन फ़ाइलों को कर्नेल पेज पूल मेमोरी पर मैप किया जाता है। Configuration Manager एक कर्नेल-मोड घटक है जो रजिस्ट्री के पढ़ने/लिखने के अनुरोधों को संभालता है।&lt;/p>
&lt;p>विशेष रूप से ध्यान देने वाली बात यह है कि सारा रजिस्ट्री डेटा डिस्क पर मौजूद नहीं होता है। उदाहरण के लिए, &lt;code>HARDWARE&lt;/code> हाइव अस्थिर (Volatile) है और डिस्क पर किसी भी फ़ाइल में बिल्कुल भी सहेजा नहीं जाता है। जब भी OS बूट होता है और प्लग एंड प्ले (PnP) मैनेजर हार्डवेयर का पता लगाता है, तो इसे मेमोरी में गतिशील रूप से फिर से बनाया जाता है।&lt;/p>
&lt;p>इसके अलावा, नवीनतम Windows में रजिस्ट्री की विश्वसनीयता बढ़ाने के लिए ट्रांजेक्शन लॉगिंग (Transaction Logging) लागू की गई है। हाइव फ़ाइलों में परिवर्तन सीधे डेटा फ़ाइलों में नहीं लिखे जाते हैं, बल्कि पहले ट्रांजेक्शन लॉग (&lt;code>.log1&lt;/code>, &lt;code>.log2&lt;/code>) में दर्ज किए जाते हैं। यह लिखने के दौरान अप्रत्याशित बिजली विफलता या सिस्टम क्रैश होने पर डेटा भ्रष्टाचार (करप्शन) को रोकता है, और लगभग ACID गुणों के साथ डेटाबेस की अखंडता की गारंटी देता है।&lt;/p>
&lt;h2 id="3-रजसटर-कज-key-और-मन-value-क-पदनकरमत-सरचन">3. रजिस्ट्री कुंजी (Key) और मान (Value) की पदानुक्रमित संरचना
&lt;/h2>&lt;p>रजिस्ट्री में फ़ाइल सिस्टम के समान एक पदानुक्रमित संरचना होती है। रूट नोड को &amp;ldquo;रूट कुंजी (Root Key)&amp;rdquo; या &amp;ldquo;हाइव&amp;rdquo; कहा जाता है, जिसके तहत &amp;ldquo;कुंजी (Key)&amp;rdquo;, &amp;ldquo;उप-कुंजी (Subkey)&amp;rdquo;, और &amp;ldquo;मान (Value)&amp;rdquo; जो वास्तविक डेटा होते हैं, संग्रहीत किए जाते हैं। इसे इस तरह समझना आसान है कि कुंजियाँ डायरेक्टरी के बराबर हैं और मान फ़ाइलों के बराबर हैं।&lt;/p>
&lt;p>मुख्य रूट कुंजियों को निम्नलिखित 5 श्रेणियों में वर्गीकृत किया गया है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>HKEY_LOCAL_MACHINE (HKLM)&lt;/strong>: सिस्टम सेटिंग्स और सॉफ़्टवेयर सेटिंग्स जो संपूर्ण कंप्यूटर (सभी उपयोगकर्ताओं) पर लागू होती हैं, संग्रहीत की जाती हैं। परिवर्तनों के लिए व्यवस्थापक (Administrator) विशेषाधिकारों की आवश्यकता होती है।&lt;/li>
&lt;li>&lt;strong>HKEY_CURRENT_USER (HKCU)&lt;/strong>: वर्तमान में लॉग ऑन उपयोगकर्ता-विशिष्ट सेटिंग्स संग्रहीत की जाती हैं। वास्तव में, यह कोई स्वतंत्र डेटाबेस नहीं है, बल्कि &lt;code>HKEY_USERS&lt;/code> के तहत संबंधित उपयोगकर्ता की SID (Security Identifier) कुंजी के लिए केवल एक सिम्बोलिक लिंक (उपनाम) है।&lt;/li>
&lt;li>&lt;strong>HKEY_CLASSES_ROOT (HKCR)&lt;/strong>: फ़ाइल एक्सटेंशन एसोसिएशन, COM (Component Object Model) क्लास पंजीकरण जानकारी, और शेल एक्सटेंशन संग्रहीत किए जाते हैं। यह कुंजी एक विशेष और आभासी (virtual) दृश्य है जिसे Configuration Manager &lt;code>HKLM\SOFTWARE\Classes&lt;/code> (पूरा सिस्टम) और &lt;code>HKCU\Software\Classes&lt;/code> (वर्तमान उपयोगकर्ता) को मर्ज (मर्ज) करके प्रदर्शित करता है। टकराव की स्थिति में, उपयोगकर्ता-विशिष्ट सेटिंग्स (HKCU) को प्राथमिकता दी जाती है।&lt;/li>
&lt;li>&lt;strong>HKEY_USERS (HKU)&lt;/strong>: सिस्टम पर सभी उपयोगकर्ता प्रोफ़ाइलों (वर्तमान में मेमोरी में लोड) की सेटिंग्स संग्रहीत की जाती हैं। यह SID के आधार पर पदानुक्रमित है।&lt;/li>
&lt;li>&lt;strong>HKEY_CURRENT_CONFIG (HKCC)&lt;/strong>: वर्तमान हार्डवेयर प्रोफ़ाइल से संबंधित सेटिंग्स। वास्तव में यह &lt;code>HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current&lt;/code> का एक लिंक है।&lt;/li>
&lt;/ol>
&lt;p>इस जटिल पदानुक्रमित संरचना और लिंक संबंधों को दर्शाने के लिए नीचे विज़ुअलाइज़ेशन दिया गया है।&lt;/p>
&lt;pre class="mermaid">
mindmap
root((&amp;#34;Windows Registry&amp;#34;))
HKLM((&amp;#34;HKEY_LOCAL_MACHINE&amp;#34;))
SAM((&amp;#34;SAM (सुरक्षा खाते)&amp;#34;))
SECURITY((&amp;#34;SECURITY&amp;#34;))
SOFTWARE((&amp;#34;SOFTWARE&amp;#34;))
SYSTEM((&amp;#34;SYSTEM&amp;#34;))
HARDWARE((&amp;#34;HARDWARE (अस्थिर)&amp;#34;))
HKCU((&amp;#34;HKEY_CURRENT_USER (लिंक)&amp;#34;))
AppEvents((&amp;#34;AppEvents&amp;#34;))
Console((&amp;#34;Console&amp;#34;))
Software((&amp;#34;Software&amp;#34;))
System((&amp;#34;System&amp;#34;))
HKCR((&amp;#34;HKEY_CLASSES_ROOT (मर्ज किया गया दृश्य)&amp;#34;))
HKU((&amp;#34;HKEY_USERS&amp;#34;))
SID((&amp;#34;उपयोगकर्ता SIDs...&amp;#34;))
HKCC((&amp;#34;HKEY_CURRENT_CONFIG (लिंक)&amp;#34;))
&lt;/pre>
&lt;h2 id="4-रजसटर-डट-परकर-वसतत-ववरण">4. रजिस्ट्री डेटा प्रकार (विस्तृत विवरण)
&lt;/h2>&lt;p>रजिस्ट्री में &amp;ldquo;मान (Value)&amp;rdquo; के लिए कड़े डेटा प्रकार परिभाषित हैं। रजिस्ट्री को प्रोग्रामेटिक रूप से प्रबंधित करते समय, इन प्रकारों को सही ढंग से समझना और उचित प्रकार के साथ डेटा लिखना आवश्यक है। गलत प्रकार से लिखने पर एप्लिकेशन अपवाद (exception) फेंक सकता है या OS के कार्य बंद हो सकते हैं।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>REG_SZ (स्ट्रिंग मान)&lt;/strong>: सबसे आम डेटा प्रकार। यह NULL-टर्मिनेटेड यूनिकोड स्ट्रिंग (UTF-16LE) को संग्रहीत करता है। इसका उपयोग फ़ाइल पथ, URL, UI के प्रदर्शन नाम आदि के लिए किया जाता है।&lt;/li>
&lt;li>&lt;strong>REG_DWORD (32-बिट पूर्णांक मान)&lt;/strong>: 32-बिट (4 बाइट) अनसाइन्ड (unsigned) पूर्णांक मान। इसका अक्सर बूलियन मान (0=अक्षम, 1=सक्षम), मिलीसेकंड में टाइमआउट मान, और त्रुटि कोड सेट करने के लिए उपयोग किया जाता है। चूंकि Windows लिटिल-एंडियन (little-endian) वास्तुकला है, इसलिए डिस्क पर इसे लोअर बाइट से क्रमिक रूप से (उदाहरण: 0x12345678 &lt;code>78 56 34 12&lt;/code> के रूप में) सहेजा जाता है।&lt;/li>
&lt;li>&lt;strong>REG_QWORD (64-बिट पूर्णांक मान)&lt;/strong>: 64-बिट (8 बाइट) पूर्णांक मान। 64-बिट वास्तुकला के प्रसार के साथ, इसका उपयोग बड़ी संख्या (डिस्क कोटा या बड़ी क्षमता वाले मेमोरी आकार विनिर्देश, आदि) और पॉइंटर-आकार सेटिंग्स को सहेजने के लिए किया जाता है।&lt;/li>
&lt;li>&lt;strong>REG_MULTI_SZ (मल्टी-स्ट्रिंग मान)&lt;/strong>: एक प्रारूप जो लगातार कई NULL-टर्मिनेटेड स्ट्रिंग्स को संग्रहीत करता है, और अंत में एक और खाली NULL-टर्मिनेटेड कैरेक्टर (डबल NULL) रखकर इसे समाप्त करता है। यह सरणी (array) जैसा डेटा सहेजने के लिए उपयुक्त है, जैसे कि IP पतों की सूची, निर्भर सेवाओं की सूची, बाइंडिंग का क्रम आदि।&lt;/li>
&lt;li>&lt;strong>REG_EXPAND_SZ (विस्तार योग्य स्ट्रिंग मान)&lt;/strong>: एक विशेष स्ट्रिंग प्रकार जिसमें अन-एक्सपेंडेड पर्यावरण चर (environment variable) स्ट्रिंग जैसे &lt;code>%USERPROFILE%&lt;/code> या &lt;code>%SystemRoot%&lt;/code> शामिल हैं। जब कोई एप्लिकेशन इसे &lt;code>RegQueryValueEx&lt;/code> API के माध्यम से पढ़ता है, या &lt;code>ExpandEnvironmentStrings&lt;/code> API को कॉल करता है, तो OS द्वारा इसे गतिशील रूप से वास्तविक पूर्ण (absolute) पथ में विस्तारित किया जाता है।&lt;/li>
&lt;li>&lt;strong>REG_BINARY (बाइनरी मान)&lt;/strong>: कोई भी रॉ बाइनरी डेटा स्ट्रीम। इसमें एन्क्रिप्टेड पासवर्ड (LSA सीक्रेट्स, आदि), डिजिटल सर्टिफिकेट, एप्लिकेशन-विशिष्ट जटिल संरचनाएं और क्रमिक (serialized) डेटा संग्रहीत किए जाते हैं।&lt;/li>
&lt;li>&lt;strong>REG_NONE&lt;/strong>: अपरिभाषित प्रकार का डेटा। यह बहुत दुर्लभ है, लेकिन इसका उपयोग एन्क्रिप्शन कुंजियों के आरक्षित क्षेत्र आदि में किया जाता है।&lt;/li>
&lt;li>&lt;strong>REG_RESOURCE_LIST&lt;/strong> / &lt;strong>REG_FULL_RESOURCE_DESCRIPTOR&lt;/strong>: डिवाइस ड्राइवरों द्वारा हार्डवेयर संसाधनों (IRQ, I/O पोर्ट, DMA चैनल) की आवंटन जानकारी रिकॉर्ड करने के लिए उपयोग किए जाने वाले कर्नेल-विशिष्ट उन्नत प्रकार।&lt;/li>
&lt;/ul>
&lt;h2 id="5-ऑपरटग-ससटम-म-रजसटर-क-गणतय-मडल-और-परदरशन">5. ऑपरेटिंग सिस्टम में रजिस्ट्री का गणितीय मॉडल और प्रदर्शन
&lt;/h2>&lt;p>रजिस्ट्री सीधे OS के प्रदर्शन (विशेष रूप से बूट समय और प्रक्रिया आरंभीकरण गति) से संबंधित है, इसलिए आंतरिक रूप से इसे &amp;ldquo;Cell Index&amp;rdquo; नामक B-Tree (B-ट्री) के समान एक उन्नत डेटा संरचना का उपयोग करके अनुकूलित किया गया है।&lt;/p>
&lt;h3 id="खज-क-समय-जटलत-time-complexity">खोज की समय जटिलता (Time Complexity)
&lt;/h3>&lt;p>रजिस्ट्री में किसी विशिष्ट कुंजी (पथ) को खोजते समय समय जटिलता $T_{\text{search}}$ ट्री की गहराई और प्रत्येक पदानुक्रम स्तर में नोड्स की संख्या पर निर्भर करती है। गहराई $d$ की उप-कुंजी (उदाहरण: यदि &lt;code>A\B\C\D&lt;/code> है तो $d=4$) को खोजने की जटिलता सैद्धांतिक रूप से इस प्रकार मॉडल की जा सकती है:&lt;/p>
$$
T_{\text{search}}(d, L) = \sum_{i=1}^{d} O(\log(C_i) \cdot L_i)
$$&lt;p>यहाँ, $C_i$ गहराई $i$ पर चाइल्ड नोड्स (उप-कुंजियाँ या मान) की संख्या है, और $L_i$ तुलना की जाने वाली स्ट्रिंग की लंबाई (वर्णों की संख्या) है। हाइव फ़ाइल के अंदर जो रजिस्ट्री की वास्तविक इकाई है, उप-कुंजियों की सूची को नाम के हैश मान या वर्णानुक्रम में सॉर्ट किए गए इंडेक्स के रूप में रखा जाता है। इसलिए, सरल रैखिक खोज (linear search) $O(C_i)$ के बजाय बाइनरी खोज $O(\log(C_i))$ संभव है, जिससे किसी एक कुंजी के नीचे हजारों उप-कुंजियां होने पर भी अत्यंत तीव्र पहुंच (access) प्राप्त होती है।&lt;/p>
&lt;h3 id="सटरज-फटपरट-space-complexity">स्टोरेज फुटप्रिंट (Space Complexity)
&lt;/h3>&lt;p>रजिस्ट्री का कुल आकार (भौतिक डिस्क पर अधिकृत स्थान) प्रत्येक हाइव के योग के रूप में गणना की जाती है।&lt;/p>
$$
\text{Size}_{\text{Total}} = \sum_{h \in \text{Hives}} \left( N_{h} \times S_{\text{key\_metadata}} + \sum_{v \in h} S_{\text{value}}(v) \right) + S_{\text{overhead}}
$$&lt;p>$N_h$ हाइव $h$ में कुंजियों की संख्या है, $S_{\text{key\_metadata}}$ प्रति कुंजी मेटाडेटा (अंतिम लेखन टाइमस्टैम्प, सुरक्षा डिस्क्रिप्टर का पॉइंटर, पैरेंट कुंजी का पॉइंटर आदि) का आकार है, $S_{\text{value}}(v)$ मान $v$ का पेलोड आकार है। ट्रांजेक्शन लॉग और अनावश्यक खाली कोशिकाओं (विखंडन/fragmentation) के कारण ओवरहेड $S_{\text{overhead}}$ भी शामिल है। यदि आप लंबे समय तक रजिस्ट्री में अनावश्यक डेटा (जैसे अनइंस्टॉल किए गए सॉफ़्टवेयर के अवशेष) छोड़ते हैं, तो यह फुटप्रिंट बढ़ जाता है, जो OS की पेज पूल मेमोरी पर दबाव डाल सकता है और प्रदर्शन में कमी ला सकता है।&lt;/p>
&lt;h2 id="6-मनयअल-सपदन-क-जखम-और-ससटम-क-सथरत-क-खतर-म-डलन-क-वफलत-क-सभवन">6. मैन्युअल संपादन के जोखिम और सिस्टम की स्थिरता को खतरे में डालने की विफलता की संभावना
&lt;/h2>&lt;p>रजिस्ट्री संपादक (&lt;code>regedit.exe&lt;/code>) का उपयोग करके मैन्युअल संपादन को सिस्टम प्रबंधन के अंतिम उपाय के रूप में देखा जाना चाहिए। सामान्य दस्तावेज़ संपादकों के विपरीत, रजिस्ट्री में कोई &amp;ldquo;पूर्ववत करें (Undo)&amp;rdquo; सुविधा शामिल नहीं है, और मानों में परिवर्तन या कुंजियों का हटाना तुरंत Configuration Manager के माध्यम से सिस्टम में परिलक्षित होता है।&lt;/p>
&lt;p>विशेष रूप से, यदि आप सिस्टम बूट के लिए आवश्यक किसी महत्वपूर्ण कुंजी (क्रिटिकल की) में एक वर्ण भी गलती से संपादित या हटा देते हैं (उदाहरण के लिए: &lt;code>HKLM\SYSTEM\CurrentControlSet\Services&lt;/code> के अंतर्गत डिस्क नियंत्रक ड्राइवर सेटिंग्स, या &lt;code>HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon&lt;/code> का &lt;code>Userinit&lt;/code> मान), तो एक घातक जोखिम होता है कि OS ब्लू स्क्रीन (BSoD) का अनुभव करेगा और बूट करने में असमर्थ होगा, या यह लॉगिन स्क्रीन (ब्लैक स्क्रीन) से आगे नहीं बढ़ पाएगा।&lt;/p>
&lt;h3 id="वफलत-सभवन-क-गणतय-मडल">विफलता संभावना का गणितीय मॉडल
&lt;/h3>&lt;p>आइए उस प्रणाली विफलता की संभावना पर विचार करें यदि हम गलती से रजिस्ट्री में कुंजियों को बेतरतीब ढंग से बदलते हैं या हटा देते हैं। मान लें कि सिस्टम के ठीक से काम करने के लिए आवश्यक महत्वपूर्ण कुंजियों का सेट $C$ है, और उनकी कुल संख्या $N_c = |C|$ है। मान लें कि पूरी रजिस्ट्री में कुंजियों की कुल संख्या $N_{\text{total}}$ है।
यदि आप यादृच्छिक (random) रूप से $k$ कुंजियाँ हटाते हैं या नष्ट करते हैं, तो कम से कम एक महत्वपूर्ण कुंजी के नष्ट होने की संभावना $P_{\text{failure}}$, गैर-प्रतिस्थापन नमूनाकरण (Sampling without replacement) संभावना गणना द्वारा निम्नानुसार व्यक्त की जाती है:&lt;/p>
$$
P_{\text{failure}} = 1 - \frac{\binom{N_{\text{total}} - N_c}{k}}{\binom{N_{\text{total}}}{k}} = 1 - \prod_{i=0}^{k-1} \left( 1 - \frac{N_c}{N_{\text{total}} - i} \right)
$$&lt;p>हालाँकि पूरी रजिस्ट्री में कुंजियों की संख्या $N_{\text{total}}$ सैकड़ों हजारों से लाखों के क्रम में है, $N_c$ भी हजारों के क्रम में है। गणितीय रूप से, यहां तक कि यादृच्छिक संचालन के साथ भी, जैसे-जैसे $k$ बढ़ता है विफलता की संभावना तेजी से बढ़ती है। इसके अलावा, वास्तविक मैन्युअल संचालन में, उपयोगकर्ता &amp;ldquo;यादृच्छिक रूप से&amp;rdquo; संपादन नहीं करते हैं, बल्कि जानबूझकर (ट्यूटोरियल साइटों आदि को देखते हुए) उन क्षेत्रों में हेरफेर करते हैं जो सीधे सिस्टम सेटिंग्स या सॉफ़्टवेयर संचालन से संबंधित हैं, इसलिए महत्वपूर्ण कुंजी को छूने की संभावना सैद्धांतिक मान की तुलना में बहुत अधिक है।&lt;/p>
&lt;h2 id="7-रजसटर-वरचअलइजशन-और-wow64-वसतकल">7. रजिस्ट्री वर्चुअलाइजेशन और WOW64 वास्तुकला
&lt;/h2>&lt;p>विरासत अनुप्रयोगों (legacy applications) के साथ संगतता बनाए रखने के लिए, Windows रजिस्ट्री एक्सेस के लिए कुछ उन्नत &amp;ldquo;वर्चुअलाइजेशन (रीडायरेक्ट)&amp;rdquo; तंत्र लागू करता है। यदि आप इसे समझे बिना प्रोग्राम करते हैं, तो यह गंभीर बग का कारण बन सकता है।&lt;/p>
&lt;h3 id="uac-रजसटर-वरचअलइजशन-registry-virtualization">UAC रजिस्ट्री वर्चुअलाइजेशन (Registry Virtualization)
&lt;/h3>&lt;p>Windows Vista से, उपयोगकर्ता खाता नियंत्रण (UAC) पेश किया गया था। जब Windows XP युग में बनाया गया कोई पुराना एप्लिकेशन (मानक उपयोगकर्ता विशेषाधिकारों के साथ चल रहा हो) संरक्षित कुंजियों जैसे &lt;code>HKLM\SOFTWARE&lt;/code> पर लिखने का प्रयास करता है, जिसके लिए व्यवस्थापक विशेषाधिकारों की आवश्यकता होती है, तो उसे पहुंच अस्वीकृत (Access Denied) त्रुटि के साथ क्रैश होने से बचाने के लिए, Windows गुप्त रूप से उस लेखन को उपयोगकर्ता प्रोफ़ाइल के वर्चुअल स्टोर &lt;code>HKCU\Software\Classes\VirtualStore\MACHINE\SOFTWARE&lt;/code> पर रीडायरेक्ट कर देता है। पढ़ते समय भी, यह मूल स्थान और वर्चुअल स्टोर दोनों को मिलाता (मर्ज) है और उन्हें लौटाता है। इससे एप्लिकेशन बिना किसी त्रुटि का पता लगाए सामान्य रूप से काम करना जारी रख सकता है।
हालांकि, पूरे सिस्टम के लिए सेटिंग्स को प्रोग्रामेटिक रूप से बदलने के लिए एक टूल विकसित करते समय, आपको मेनिफ़ेस्ट फ़ाइल में &lt;code>&amp;lt;requestedExecutionLevel level=&amp;quot;requireAdministrator&amp;quot; /&amp;gt;&lt;/code> निर्दिष्ट करना होगा और इस वर्चुअलाइजेशन को अक्षम (disable) करना होगा।&lt;/p>
&lt;h3 id="wow64-windows-32-bit-on-windows-64-bit-क-रडयरकशन">WOW64 (Windows 32-bit on Windows 64-bit) का रीडायरेक्शन
&lt;/h3>&lt;p>64-बिट Windows (वर्तमान मुख्यधारा) पर एक पुराने 32-बिट एप्लिकेशन को चलाते समय, कुछ रजिस्ट्री कुंजियों को स्वचालित रूप से अलग कर दिया जाता है और रीडायरेक्ट किया जाता है ताकि यह सुनिश्चित हो सके कि 32-बिट एप्लिकेशन गलती से 64-बिट देशी सिस्टम सेटिंग्स को अधिलेखित (overwrite) न करे या असंगत 64-बिट DLL लोड न करे।
उदाहरण के लिए, जब 32-बिट ऐप &lt;code>HKLM\SOFTWARE\Vendor\App&lt;/code> को एक्सेस करने का प्रयास करता है, तो OS पारदर्शी रूप से इसे &lt;code>HKLM\SOFTWARE\WOW6432Node\Vendor\App&lt;/code> पर रीडायरेक्ट करता है।&lt;/p>
&lt;pre class="mermaid">
flowchart TD
App32[&amp;#34;32-bit एप्लिकेशन&amp;#34;]
App64[&amp;#34;64-bit एप्लिकेशन&amp;#34;]
RegAPI[&amp;#34;रजिस्ट्री API (Advapi32.dll)&amp;#34;]
CM[&amp;#34;कॉन्फ़िगरेशन मैनेजर (Kernel)&amp;#34;]
HKLM_Soft[&amp;#34;HKLM\\SOFTWARE&amp;#34;]
HKLM_WOW64[&amp;#34;HKLM\\SOFTWARE\\WOW6432Node&amp;#34;]
App32 --&amp;gt;| RegOpenKeyEx() | RegAPI
App64 --&amp;gt;| RegOpenKeyEx() | RegAPI
RegAPI --&amp;gt; CM
CM --&amp;gt;| यदि 64-bit प्रोसेस है | HKLM_Soft
CM --&amp;gt;| यदि 32-bit प्रोसेस है (रीडायरेक्शन) | HKLM_WOW64
&lt;/pre>
&lt;p>PowerShell स्क्रिप्ट या C# एप्लिकेशन से रजिस्ट्री को संपादित करते समय, इस बात का दृढ़ता से ध्यान रखना चाहिए कि निष्पादन प्रक्रिया 32-बिट है या 64-बिट। अन्यथा, यह एक कष्टप्रद समस्या पैदा कर सकता है जैसे &amp;ldquo;मैंने जो सेटिंग लिखी है वह एक्सप्लोरर से दिखाई नहीं दे रही है (इसे कहीं और लिखा गया है)&amp;quot;।&lt;/p>
&lt;h2 id="8-powershell-क-मधयम-स-परगरम-करन-यगय-सरकषत-सपदन">8. PowerShell के माध्यम से प्रोग्राम करने योग्य सुरक्षित संपादन
&lt;/h2>&lt;p>रजिस्ट्री को मैन्युअल रूप से संपादित करने के जोखिम को कम करने के लिए, PowerShell स्क्रिप्ट का उपयोग करके संचालन को कोडित (Infrastructure as Code) करना, और स्वचालन (automation), पुनरुत्पादन (reproducibility) और परीक्षण क्षमता (testability) सुनिश्चित करना आधुनिक सर्वोत्तम अभ्यास है। PowerShell एक &amp;ldquo;Registry Provider&amp;rdquo; से लैस है, जो आपको कमांडलेट्स (जैसे &lt;code>Get-ChildItem&lt;/code>, &lt;code>Get-ItemProperty&lt;/code>, &lt;code>New-Item&lt;/code>, आदि) का उपयोग करके फ़ाइल सिस्टम (C: ड्राइव, आदि) में हेरफेर करने के समान ही पारदर्शी रूप से रजिस्ट्री में हेरफेर करने की अनुमति देता है।&lt;/p>
&lt;p>PowerShell में, &lt;code>HKLM:&lt;/code> और &lt;code>HKCU:&lt;/code> जैसे समर्पित PSDrive (ड्राइव लेटर के समान) डिफ़ॉल्ट रूप से माउंट किए जाते हैं।&lt;/p>
&lt;h3 id="बनयद-crud-ऑपरशन">बुनियादी CRUD ऑपरेशन
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. अस्तित्व की जांच (Read)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$keyPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Software\MyCustomApp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-Not&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Test-Path&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># 2. नई कुंजी बनाना (Create)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Software&amp;#34;&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;MyCustomApp&amp;#34;&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;कुंजी बना दी गई है।&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3. मान लिखना/अपडेट करना (Update) - REG_DWORD के रूप में 1 लिखें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;EnableDebug&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="mf">1&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">DWord&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 4. मान पढ़ना (Read)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$debugFlag&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Get-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="py">EnableDebug&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;वर्तमान डिबग फ़्लैग: &lt;/span>&lt;span class="nv">$debugFlag&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 5. मान हटाना (Delete)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Remove-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;EnableDebug&amp;#34;&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="वयवहरक-उदहरण-1-वकस-परवश-क-सवचलत-सटग-परयवरण-चर-path-म-जडन">व्यावहारिक उदाहरण 1: विकास परिवेश की स्वचालित सेटिंग (पर्यावरण चर PATH में जोड़ना)
&lt;/h3>&lt;p>निम्नलिखित स्क्रिप्ट एक स्वचालन उदाहरण है जो डेवलपर्स द्वारा एक नई Windows मशीन स्थापित करते समय उपयोगकर्ता पर्यावरण चर (environment variable) &lt;code>PATH&lt;/code> में कस्टम टूल की डायरेक्टरी को सुरक्षित रूप से जोड़ता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$envKey&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Environment&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$newPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\tools\bin&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># वर्तमान PATH पढ़ें (त्रुटियों को दबाकर सुरक्षित रूप से प्राप्त करें)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$currentPathInfo&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$envKey&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;Path&amp;#34;&lt;/span> &lt;span class="n">-ErrorAction&lt;/span> &lt;span class="n">SilentlyContinue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$currentPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$currentPathInfo&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nv">$currentPathInfo&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Path&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># नियमित अभिव्यक्ति (regex) के साथ जाँचें कि क्या यह पहले से शामिल है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$currentPath&lt;/span> &lt;span class="o">-notmatch&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">regex&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">Escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$newPath&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># यदि अंत में कोई सेमीकोलन नहीं है, तो उसे जोड़ें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$currentPath&lt;/span> &lt;span class="o">-and&lt;/span> &lt;span class="nv">$currentPath&lt;/span> &lt;span class="o">-notmatch&lt;/span> &lt;span class="s2">&amp;#34;;$&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$currentPath&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="s2">&amp;#34;;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$updatedPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$currentPath&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="nv">$newPath&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># REG_EXPAND_SZ प्रकार के रूप में लिखें (महत्वपूर्ण)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$envKey&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;Path&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="nv">$updatedPath&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">ExpandString&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;PATH पर्यावरण चर को अपडेट कर दिया गया है: &lt;/span>&lt;span class="nv">$newPath&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># चल रही प्रक्रियाओं को पर्यावरण चर परिवर्तन के बारे में सूचित करें (WM_SETTINGCHANGE)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># यह बिना रिबूट किए नए एक्सप्लोरर आदि में परिलक्षित होगा&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="no">Environment&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">SetEnvironmentVariable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Path&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$updatedPath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">EnvironmentVariableTarget&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">User&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;PATH पहले ही जोड़ा जा चुका है।&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="वयवहरक-उदहरण-2-सदरभ-मन-context-menu-म-कसटम-करय-जडन">व्यावहारिक उदाहरण 2: संदर्भ मेनू (Context Menu) में कस्टम क्रिया जोड़ना
&lt;/h3>&lt;p>यह एक स्क्रिप्ट है जो किसी विशिष्ट फ़ाइल या डायरेक्टरी पर राइट-क्लिक करने पर संदर्भ मेनू में &amp;ldquo;My IDE में खोलें&amp;rdquo; नामक एक कस्टम आइटम जोड़ती है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># पृष्ठभूमि (खाली जगह) पर राइट-क्लिक करते समय मेनू&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$menuPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HKCR:\Directory\Background\shell\OpenWithMyIDE&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$commandPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$menuPath&lt;/span>&lt;span class="s2">\command&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># मेनू आइटम की मूल (parent) कुंजी बनाएँ&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$menuPath&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="n">-ErrorAction&lt;/span> &lt;span class="n">Stop&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># (default) मान को प्रदर्शन नाम पर सेट करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$menuPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;(default)&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="s2">&amp;#34;My IDE में खोलें&amp;#34;&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># आइकन सेट करें (वैकल्पिक)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$menuPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;Icon&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="s2">&amp;#34;C:\Program Files\MyIDE\ide.exe,0&amp;#34;&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># command उप-कुंजी बनाएँ और निष्पादित की जाने वाली कमांड लाइन सेट करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># %V एक चर है जो वर्तमान डायरेक्टरी के पथ में विस्तारित होता है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$commandPath&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="n">-ErrorAction&lt;/span> &lt;span class="n">Stop&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$commandPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;(default)&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2">C:\Program Files\MyIDE\ide.exe&lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2"> &lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2">%V&lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;संदर्भ मेनू जोड़ दिया गया है।&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Error&lt;/span> &lt;span class="s2">&amp;#34;रजिस्ट्री को बदलने में विफल रहा। सुनिश्चित करें कि आप व्यवस्थापक विशेषाधिकारों के साथ चला रहे हैं। त्रुटि: &lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="powershell-स-रजसटर-एकसस-क-आतरक-अनकरम-sequence">PowerShell से रजिस्ट्री एक्सेस का आंतरिक अनुक्रम (Sequence)
&lt;/h3>&lt;p>नीचे OS के अंदर क्रिया अनुक्रम दिखाया गया है जब PowerShell स्क्रिप्ट रजिस्ट्री को बदलती है।&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant U as &amp;#34;Admin / PowerShell&amp;#34;
participant PS as &amp;#34;Registry Provider (.NET)&amp;#34;
participant CM as &amp;#34;Configuration Manager (Kernel)&amp;#34;
participant Disk as &amp;#34;Hive Files on NTFS&amp;#34;
U-&amp;gt;&amp;gt;PS: &amp;#34;Set-ItemProperty -Path ... -Value ...&amp;#34;
PS-&amp;gt;&amp;gt;PS: &amp;#34;पथ पार्स करें और डेटा प्रकार मान्य करें&amp;#34;
PS-&amp;gt;&amp;gt;CM: &amp;#34;NtSetValueKey (सिस्टम कॉल)&amp;#34;
CM-&amp;gt;&amp;gt;CM: &amp;#34;Key ACL के विरुद्ध एक्सेस टोकन जांचें&amp;#34;
alt &amp;#34;एक्सेस स्वीकृत (Admin टोकन)&amp;#34;
CM-&amp;gt;&amp;gt;CM: &amp;#34;Volatile कैश में Cell आवंटित करें&amp;#34;
CM-&amp;gt;&amp;gt;Disk: &amp;#34;ट्रांजेक्शन लॉग में फ्लश करें (.log1)&amp;#34;
Disk--&amp;gt;&amp;gt;CM: &amp;#34;लॉग सफलतापूर्वक लिखा गया&amp;#34;
CM-&amp;gt;&amp;gt;Disk: &amp;#34;हाइव डेटा फ़ाइल में लेज़ी राइट (Background)&amp;#34;
CM--&amp;gt;&amp;gt;PS: &amp;#34;STATUS_SUCCESS (0x00000000)&amp;#34;
PS--&amp;gt;&amp;gt;U: &amp;#34;कमांड पूरी हुई&amp;#34;
else &amp;#34;एक्सेस अस्वीकृत (Standard User)&amp;#34;
CM--&amp;gt;&amp;gt;PS: &amp;#34;STATUS_ACCESS_DENIED (0xC0000022)&amp;#34;
PS--&amp;gt;&amp;gt;U: &amp;#34;UnauthorizedAccessException फेंका गया&amp;#34;
end
&lt;/pre>
&lt;h2 id="9-c-net-क-सथ-मजबत-रजसटर-एकसस">9. C# (.NET) के साथ मजबूत रजिस्ट्री एक्सेस
&lt;/h2>&lt;p>.NET एप्लिकेशन (C# आदि) से रजिस्ट्री तक पहुँचने के लिए, &lt;code>Microsoft.Win32.Registry&lt;/code> वर्ग और &lt;code>RegistryKey&lt;/code> वर्ग का उपयोग किया जाता है।
C# का उपयोग करने का सबसे बड़ा लाभ यह है कि यह शक्तिशाली अपवाद हैंडलिंग (&lt;code>try-catch&lt;/code>) के माध्यम से मजबूत त्रुटि हैंडलिंग, सख्त प्रकार की जाँच (type checking), और &lt;code>RegistryView&lt;/code> एन्यूमरेशन का उपयोग करके स्पष्ट 32-बिट/64-बिट दृश्य निर्दिष्ट करने की क्षमता प्रदान करता है।&lt;/p>
&lt;p>नीचे एक C# कोड का उदाहरण है जो सुरक्षित रूप से 64-बिट OS वातावरण में 64-बिट साइड रजिस्ट्री को पढ़ता और लिखता है (WOW6432Node के रीडायरेक्शन से बचते हुए)।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">System&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">System.Security&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">Microsoft.Win32&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">RegistryEditor&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">static&lt;/span> &lt;span class="k">void&lt;/span> &lt;span class="n">Main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// HKLM के नीचे पथ (व्यवस्थापक विशेषाधिकार आवश्यक हैं)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">string&lt;/span> &lt;span class="n">keyPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">@&amp;#34;SOFTWARE\MyEnterpriseApp\Settings&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 64-बिट नेटिव व्यू खोलने के लिए RegistryView.Registry64 निर्दिष्ट करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// using स्टेटमेंट का उपयोग करके, सुनिश्चित करें कि रजिस्ट्री कुंजी का हैंडल (अप्रबंधित संसाधन) डिस्पोज़ किया गया है&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">using&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">RegistryKey&lt;/span> &lt;span class="n">baseKey&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">RegistryKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">OpenBaseKey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RegistryHive&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">LocalMachine&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryView&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Registry64&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// लेखन अनुमति (writable: true) के साथ कुंजी खोलें। यदि यह मौजूद नहीं है, तो इसे बनाएँ।&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">using&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">RegistryKey&lt;/span> &lt;span class="n">subKey&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">baseKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CreateSubKey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">keyPath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">writable&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">subKey&lt;/span> &lt;span class="p">!=&lt;/span> &lt;span class="kc">null&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// REG_DWORD के रूप में मान लिखें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SetValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;MaxConnections&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">100&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryValueKind&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">DWord&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// REG_SZ के रूप में मान लिखें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SetValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;ApiEndpoint&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;https://api.example.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryValueKind&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// बाइट ऐरे को REG_BINARY के रूप में लिखें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">byte&lt;/span>&lt;span class="p">[]&lt;/span> &lt;span class="n">secretData&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="m">0x01&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0x02&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0x0A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0xFF&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SetValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;BinarySecret&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">secretData&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryValueKind&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Binary&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;रजिस्ट्री में सफलतापूर्वक लिखा गया।&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">UnauthorizedAccessException&lt;/span> &lt;span class="n">ex&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// अक्सर तब होता है जब व्यवस्थापक के रूप में नहीं चलाया जा रहा हो&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;अनुमति त्रुटि: कृपया प्रोग्राम को &amp;#39;व्यवस्थापक के रूप में चलाएं&amp;#39;। विवरण: {ex.Message}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">SecurityException&lt;/span> &lt;span class="n">ex&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यदि .NET कोड एक्सेस सुरक्षा (CAS) द्वारा ब्लॉक किया गया हो&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;सुरक्षा अपवाद: {ex.Message}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Exception&lt;/span> &lt;span class="n">ex&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// अन्य अप्रत्याशित IO त्रुटियां आदि।&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;अप्रत्याशित त्रुटि: {ex.Message}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>रजिस्ट्री कुंजी खोलने पर OS से प्राप्त &amp;ldquo;हैंडल (Handle)&amp;rdquo; एक अप्रबंधित संसाधन (unmanaged resource) है जो मेमोरी और सिस्टम संसाधनों की खपत करता है। इसलिए, C# प्रोग्रामिंग में यह एक सख्त नियम है कि &lt;code>using&lt;/code> ब्लॉक का उपयोग करें या &lt;code>finally&lt;/code> ब्लॉक के भीतर &lt;code>.Dispose()&lt;/code> (या &lt;code>.Close()&lt;/code>) को स्पष्ट रूप से कॉल करें ताकि हैंडल के लीक को पूरी तरह से रोका जा सके।&lt;/p>
&lt;h2 id="10-रजसटर-बकअप-और-रसटर-क-तरक">10. रजिस्ट्री बैकअप और रिस्टोर के तरीके
&lt;/h2>&lt;p>भले ही आप स्क्रिप्ट या प्रोग्राम द्वारा स्वचालित रूप से कार्य कर रहे हों, कोई भी महत्वपूर्ण परिवर्तन करने से पहले बैकअप लेना अत्यंत आवश्यक है।&lt;/p>
&lt;h3 id="reg-फइल-क-उपयग-करक-बकअप-और-आयत">.reg फ़ाइलों का उपयोग करके बैकअप और आयात
&lt;/h3>&lt;p>सबसे शास्त्रीय और सामान्य तरीका &lt;code>.reg&lt;/code> फ़ाइल में निर्यात करना है। इस फ़ाइल का अपना विशिष्ट प्रारूप होता है और यह टेक्स्ट-आधारित होती है, जिसकी संरचना इस प्रकार होती है:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Windows Registry Editor Version 5.00
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[HKEY_CURRENT_USER\Software\MyCustomApp]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;EnableDebug&amp;#34;=dword:00000001
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;ApiEndpoint&amp;#34;=&amp;#34;https://api.example.com&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;BinaryData&amp;#34;=hex:01,02,0a,ff
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;em>नोट: बाइनरी डेटा को &lt;code>hex:&lt;/code> के बाद अल्पविराम (comma) से अलग किए गए हेक्साडेसिमल मानों के रूप में दर्शाया जाता है।&lt;/em>&lt;/p>
&lt;p>कमांड-लाइन टूल &lt;code>reg.exe&lt;/code> का उपयोग करके बैच स्क्रिप्ट के भीतर स्वचालित बैकअप लागू किया जा सकता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmd" data-lang="cmd">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">REM निर्दिष्ट कुंजी का बैकअप लें (उप-कुंजियों को भी पुनरावर्ती रूप से निर्यात किया जाता है)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reg export HKLM\SOFTWARE\MyEnterpriseApp C:\backup\myapp_backup.reg /y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">REM बैकअप रिस्टोर करना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reg import C:\backup\myapp_backup.reg
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="powershell-क-उपयग-करक-अधक-उननत-बकअप-वधय">PowerShell का उपयोग करके अधिक उन्नत बैकअप विधियाँ
&lt;/h3>&lt;p>केवल सादे पाठ (text) के बजाय, PowerShell की वस्तु-उन्मुख (object-oriented) प्रकृति का लाभ उठाते हुए, आप रजिस्ट्री ऑब्जेक्ट्स को निर्यात कर सकते हैं और उन्हें XML प्रारूप (CliXML) में सहेज सकते हैं। यह आपको रिस्टोरिंग करते समय स्ट्रिंग पार्सिंग पर भरोसा किए बिना प्रकार (type) की जानकारी को बनाए रखने की अनुमति देता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># बैकअप प्राप्त करें (गुणों/properties को XML के रूप में सहेजें)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Software\MyCustomApp&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Export-Clixml&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;C:\backup\reg_backup.xml&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># रिस्टोर (Restore) की अवधारणा&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$backup&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Import-Clixml&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;C:\backup\reg_backup.xml&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># चूंकि $backup में पुनर्स्थापित कस्टम PSObject शामिल है,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># आप इसके गुणों पर लूप करने और सेटिंग्स को फिर से लागू करने के लिए Set-ItemProperty का उपयोग करके तर्क बना सकते हैं।&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="11-sysinternals-process-monitor-procmon-क-उपयग-करक-समसय-नवरण-troubleshooting">11. Sysinternals Process Monitor (Procmon) का उपयोग करके समस्या निवारण (Troubleshooting)
&lt;/h2>&lt;p>यदि आप सुनिश्चित नहीं हैं कि कोई प्रोग्राम रजिस्ट्री में कहाँ लिख रहा है, या &amp;ldquo;Access Denied&amp;rdquo; का कारण ढूंढ रहे हैं, तो Microsoft द्वारा मुफ्त प्रदान किया गया Sysinternals टूल &lt;strong>Process Monitor (Procmon)&lt;/strong> बहुत शक्तिशाली है।
Procmon का उपयोग करके, आप OS पर होने वाली सभी रजिस्ट्री API कॉल (जैसे &lt;code>RegOpenKey&lt;/code>, &lt;code>RegQueryValue&lt;/code>, &lt;code>RegSetValue&lt;/code>) को वास्तविक समय में कैप्चर कर सकते हैं, और उन्नत फ़िल्टरिंग का उपयोग करके समस्या निवारण कर सकते हैं, जैसे:&lt;/p>
&lt;ul>
&lt;li>&lt;code>Process Name&lt;/code> is &lt;code>powershell.exe&lt;/code>&lt;/li>
&lt;li>&lt;code>Operation&lt;/code> begins with &lt;code>Reg&lt;/code>&lt;/li>
&lt;li>&lt;code>Result&lt;/code> is &lt;code>ACCESS DENIED&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>इससे आप तुरंत पहचान सकते हैं कि किस कुंजी में ACL सेटिंग्स की कमी है, या क्या इसे गलती से WOW6432Node पर रीडायरेक्ट किया गया है।&lt;/p>
&lt;h2 id="12-सरकष-और-सरवततम-अभयस">12. सुरक्षा और सर्वोत्तम अभ्यास
&lt;/h2>&lt;p>अंत में, रजिस्ट्री से निपटने के लिए हम महत्वपूर्ण डिज़ाइन सिद्धांतों और सर्वोत्तम प्रथाओं को सारांशित कर रहे हैं।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>न्यूनतम विशेषाधिकार सिद्धांत (Principle of least privilege) को सख्ती से लागू करें&lt;/strong>: एप्लिकेशन या स्क्रिप्ट सेटिंग्स को यथासंभव &lt;code>HKCU&lt;/code> (वर्तमान उपयोगकर्ता) के भीतर &lt;code>Software&lt;/code> कुंजी के तहत सहेजा जाना चाहिए। &lt;code>HKLM&lt;/code> में लिखने के लिए UAC द्वारा व्यवस्थापक विशेषाधिकारों की आवश्यकता होती है, जो सुरक्षा के लिए हमले की सतह (attack surface) को बढ़ाता है और उपयोगकर्ता अनुभव को खराब करता है।&lt;/li>
&lt;li>&lt;strong>ऑडिटिंग (Auditing) सक्षम करें&lt;/strong>: सुरक्षा की दृष्टि से बेहद महत्वपूर्ण कुंजियों (जैसे ऑटो-स्टार्ट को नियंत्रित करने वाली &lt;code>Run&lt;/code> कुंजी या सर्विस सेटिंग्स) के लिए, SACL (System Access Control List) कॉन्फ़िगर करें ताकि यह रिकॉर्ड किया जा सके कि किसने और कब मानों को बदला या हटाया। इसे Windows इवेंट व्यूअर के &amp;ldquo;सुरक्षा लॉग&amp;rdquo; में लॉग (ऑडिट) किया जाता है।&lt;/li>
&lt;li>&lt;strong>ट्रांजेक्शन सुविधा के बहिष्करण (Deprecation) के प्रति प्रतिक्रिया&lt;/strong>: रजिस्ट्री ट्रांजेक्शन सुविधा (TxR), जो &amp;ldquo;Kernel Transaction Manager (KTM)&amp;rdquo; का उपयोग करती है और Windows Vista में पेश की गई थी, Windows 10 के बाद से बहिष्कृत (Deprecated) हो गई है। एप्लिकेशन पक्ष को स्वयं बैकअप और रोलबैक तंत्र लागू करना चाहिए (जैसे कि परिवर्तन से पहले मूल मान को पढ़ना और उसे मेमोरी में बनाए रखना)।&lt;/li>
&lt;li>&lt;strong>समूह नीति (Group Policy - GPO) के साथ टकराव से सावधान रहें&lt;/strong>: &lt;code>HKLM\SOFTWARE\Policies&lt;/code> और &lt;code>HKCU\Software\Policies&lt;/code> क्षेत्र Active Directory की समूह नीति द्वारा केंद्रीय रूप से प्रबंधित किए जाने चाहिए। यदि आप सीधे स्क्रिप्ट से इन कुंजियों को ओवरराइट करते हैं, तो वे अगले समूह नीति पृष्ठभूमि अपडेट चक्र (आमतौर पर 90 से 120 मिनट के अंतराल) के दौरान डोमेन नियंत्रक सेटिंग्स द्वारा जबरन अधिलेखित कर दिए जाएंगे, जिससे आपकी सेटिंग्स स्थायी नहीं रह पाएंगी।&lt;/li>
&lt;/ol>
&lt;h2 id="नषकरष">निष्कर्ष
&lt;/h2>&lt;p>Windows रजिस्ट्री एक शक्तिशाली और जटिल आधारभूत प्रणाली है जो OS के सभी व्यवहारों और एप्लिकेशन सेटिंग्स का व्यापक प्रबंधन करती है। इसके मैन्युअल, अव्यवस्थित संपादन से सिस्टम विफलता का उच्च जोखिम होता है, जो गणितीय रूप से सिद्ध हो चुका है। इसलिए, PowerShell और C# जैसे प्रोग्राम करने योग्य साधनों का उपयोग करते हुए, Infrastructure as Code के सिद्धांतों के अनुसार सुरक्षित, परीक्षण योग्य और पुनरुत्पादन योग्य कॉन्फ़िगरेशन प्रबंधन करना आधुनिक सिस्टम प्रशासन और विकास में आवश्यक है। इस लेख में समझाए गए गहरे वास्तुकला ज्ञान और कार्यान्वयन पैटर्न का लाभ उठाएं, और अधिक मजबूत और सुरक्षित Windows वातावरण बनाने का लक्ष्य रखें。&lt;/p></description></item></channel></rss>