<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Windows 11 on kenji.blog</title><link>http://kenji.blog/hi/tags/windows-11/</link><description>Recent content in Windows 11 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 22:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/tags/windows-11/index.xml" rel="self" type="application/rss+xml"/><item><title>Windows 11 के लिए MSIX पैकेज बनाने की गाइड और सेल्फ-साइन्ड सर्टिफिकेट का जाल</title><link>http://kenji.blog/hi/p/windows-11-msix-packaging-guide/</link><pubDate>Sat, 12 Sep 2026 22:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/windows-11-msix-packaging-guide/</guid><description>&lt;img src="http://kenji.blog/p/windows-11-msix-packaging-guide/img/eyecatch.jpg" alt="Featured image of post Windows 11 के लिए MSIX पैकेज बनाने की गाइड और सेल्फ-साइन्ड सर्टिफिकेट का जाल" />&lt;p>Windows 11 के युग में, &amp;ldquo;MSIX&amp;rdquo; एप्लिकेशन वितरण (डिस्ट्रीब्यूशन) फॉर्मेट के रूप में एक मानक विकल्प बनता जा रहा है। पारंपरिक MSI और EXE जैसे इंस्टॉलरों में कई चुनौतियां थीं, लेकिन MSIX से उन समस्याओं को हल करने वाली अगली पीढ़ी (next-generation) की पैकेजिंग तकनीक के रूप में उम्मीद की जाती है। हालांकि, जब डेवलपर्स MSIX पैकेज बनाते हैं और अपने संगठन (organization) या परीक्षण वातावरण (test environment) में साइडलोडिंग (Sideloading) करने का प्रयास करते हैं, तो वे अक्सर &amp;ldquo;सेल्फ-साइन्ड सर्टिफिकेट के जाल (Trap of Self-Signed Certificate)&amp;rdquo; में फंस जाते हैं।&lt;/p>
&lt;p>इस लेख में, हम MSIX के तकनीकी विवरण से लेकर विजुअल स्टूडियो (Visual Studio) और कमांड लाइन टूल्स का उपयोग करके पैकेज बनाने की विधि, और कई डेवलपर्स द्वारा सामना किए जाने वाले सेल्फ-साइन्ड सर्टिफिकेट से संबंधित त्रुटियों (errors) के कारणों और समाधानों तक बहुत विस्तार से चर्चा करेंगे। हमारा उद्देश्य इसे Windows ऐप डेवलपर्स, इंफ्रास्ट्रक्चर एडमिनिस्ट्रेटर्स और पैकेजिंग के प्रभारी लोगों के लिए एक आवश्यक गाइड बनाना है।&lt;/p>
&lt;h2 id="1-msix-कय-ह-परपरक-msiexe-क-सथ-तलन">1. MSIX क्या है? पारंपरिक MSI/EXE के साथ तुलना
&lt;/h2>&lt;p>MSIX, Microsoft द्वारा प्रदान किया गया Windows के लिए नवीनतम (latest) एप्लिकेशन पैकेज फॉर्मेट है। यह पारंपरिक रूप से मौजूद MSI (Microsoft Installer), .exe-आधारित कस्टम इंस्टॉलर, App-V (Application Virtualization) और Windows 8 के बाद पेश किए गए AppX (Universal Windows Platform ऐप पैकेज) की सभी बेहतरीन सुविधाओं और अवधारणाओं (concepts) को एकीकृत करता है, और इसे आधुनिक सुरक्षा और डिप्लॉयमेंट (deployment) आवश्यकताओं को पूरा करने के लिए विकसित किया गया है।&lt;/p>
&lt;h3 id="परपरक-इसटलर-msiexe-क-चनतय">पारंपरिक इंस्टॉलर (MSI/EXE) की चुनौतियां
&lt;/h3>&lt;p>कई वर्षों से Windows के मानक इंस्टॉलेशन फॉर्मेट के रूप में उपयोग किए जा रहे MSI और EXE में निम्नलिखित मूलभूत समस्याएं थीं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>विन रॉट (Win Rot) की समस्या&lt;/strong>: एप्लिकेशन को बार-बार इंस्टॉल और अनइंस्टॉल करने से, अनावश्यक कुंजियाँ (keys) रजिस्ट्री में रह जाती हैं और DLL सिस्टम फोल्डर (जैसे &lt;code>C:\Windows\System32&lt;/code>) में छूट जाते हैं। इसके कारण, OS का प्रदर्शन धीरे-धीरे धीमा हो जाता है और अस्थिरता (instability) की समस्या उत्पन्न होती है।&lt;/li>
&lt;li>&lt;strong>DLL हेल (DLL Hell)&lt;/strong>: जब कई एप्लिकेशन एक ही नाम के (लेकिन अलग-अलग वर्जन वाले) DLL को साझा (shared) सिस्टम डायरेक्टरी में इंस्टॉल करने का प्रयास करते हैं, तो बाद में इंस्टॉल किया गया ऐप मौजूदा DLL को ओवरराइट कर देता है, जिससे पहले इंस्टॉल किया गया ऐप काम करना बंद कर देता है।&lt;/li>
&lt;li>&lt;strong>कस्टम एक्शन के कारण अस्थिरता&lt;/strong>: MSI पैकेज में, &amp;ldquo;कस्टम एक्शन&amp;rdquo; नामक किसी भी स्क्रिप्ट या कोड को इंस्टॉलेशन या अनइंस्टॉलेशन के दौरान सिस्टम विशेषाधिकारों (system privileges) के साथ निष्पादित (execute) किया जा सकता है। इससे इंस्टॉलर के बीच में क्रैश होने या सिस्टम में अप्रत्याशित (unexpected) कॉन्फ़िगरेशन परिवर्तन होने का जोखिम (risk) रहता था।&lt;/li>
&lt;/ol>
&lt;h3 id="msix-क-कटनरइजशन-आरकटकचर-दवर-समधन">MSIX के कंटेनराइजेशन आर्किटेक्चर द्वारा समाधान
&lt;/h3>&lt;p>MSIX एप्लिकेशनों को एक हल्के &amp;ldquo;कंटेनर&amp;rdquo; के भीतर चलाकर इन चुनौतियों का समाधान करता है। इस कंटेनरीकृत (containerized) दृष्टिकोण के निम्नलिखित बड़े फायदे हैं:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>क्लीन अनइंस्टॉल&lt;/strong>: MSIX द्वारा इंस्टॉल किए गए ऐप्स फ़ाइल सिस्टम और रजिस्ट्री में अपने बदलावों को वर्चुअलाइज़ (VFS: Virtual File System, VReg: Virtual Registry) करके करते हैं। इसलिए, अनइंस्टॉल करते समय, इस वर्चुअलाइज्ड कंटेनर को पूरी तरह से हटा दिया जाता है, जिससे सिस्टम में कोई कचरा (अवशेष) नहीं बचता। यह Win Rot को पूरी तरह से रोकता है।&lt;/li>
&lt;li>&lt;strong>आइसोलेशन और सुरक्षा (Isolation)&lt;/strong>: प्रत्येक ऐप अपने स्वयं के वातावरण में चलता है और सीधे अन्य ऐप्स के DLL या संसाधनों (resources) को नष्ट नहीं करता है। यह हमें DLL हेल से मुक्त करता है।&lt;/li>
&lt;li>&lt;strong>नेटवर्क बैंडविड्थ ऑप्टिमाइजेशन&lt;/strong>: MSIX का अपडेट मैकेनिज्म बहुत उत्कृष्ट है और यह ब्लॉक-स्तर के डिफरेंशियल अपडेट (Differential Update) का समर्थन करता है। बाइनरी डेटा के केवल उन छोटे ब्लॉकों को डाउनलोड किया जाता है जिन्हें बदला गया है, जिससे बड़े ऐप अपडेट में भी नेटवर्क पर लोड कम से कम हो जाता है।&lt;/li>
&lt;li>&lt;strong>विश्वसनीय इंस्टॉलेशन स्थिति&lt;/strong>: पैकेज में एक मेनिफेस्ट फ़ाइल (&lt;code>AppxManifest.xml&lt;/code>) शामिल होती है, और इंस्टॉलेशन ट्रांजेक्शन OS स्तर पर सख्ती से प्रबंधित किए जाते हैं। यदि यह विफल रहता है, तो इसे पूरी तरह से अपनी मूल स्थिति में वापस (rollback) कर दिया जाता है।&lt;/li>
&lt;/ul>
&lt;h2 id="2-msix-पकज-बनन-क-समगर-दषटकण-overview-और-टलचन">2. MSIX पैकेज बनाने का समग्र दृष्टिकोण (Overview) और टूलचेन
&lt;/h2>&lt;p>MSIX पैकेज बनाने के लिए मुख्य रूप से दो दृष्टिकोण (approaches) हैं। पहला Visual Studio के इंटीग्रेटेड डेवलपमेंट एनवायरनमेंट (IDE) का उपयोग करना है, और दूसरा Windows SDK में शामिल कमांड लाइन टूल्स (&lt;code>MakeAppx.exe&lt;/code> और &lt;code>SignTool.exe&lt;/code>) का पूर्ण उपयोग करना है।&lt;/p>
&lt;p>निम्नलिखित मर्मेड (Mermaid) आरेख (diagram) सोर्स फ़ाइलों से अंतिम हस्ताक्षरित (signed) MSIX पैकेज उत्पन्न होने तक की प्रक्रिया को दर्शाता है।&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;सोर्स फ़ाइलें (EXE, DLL, एसेट्स, आदि)&amp;#34;] --&amp;gt; B[&amp;#34;AppxManifest.xml (मेनिफेस्ट परिभाषा)&amp;#34;]
B --&amp;gt; C[&amp;#34;MakeAppx.exe (MSIX पैकेजर)&amp;#34;]
C --&amp;gt; D[&amp;#34;अहस्ताक्षरित MSIX पैकेज (.msix)&amp;#34;]
E[&amp;#34;डिजिटल सर्टिफिकेट (.pfx)&amp;#34;] --&amp;gt; F[&amp;#34;SignTool.exe (डिजिटल साइनर)&amp;#34;]
D --&amp;gt; F
F --&amp;gt; G[&amp;#34;हस्ताक्षरित MSIX पैकेज (डिप्लॉयमेंट के लिए तैयार)&amp;#34;]
style A fill:#f9f9f9,stroke:#333
style B fill:#e6f7ff,stroke:#333
style D fill:#ffcccb,stroke:#333
style G fill:#d4edda,stroke:#333
&lt;/pre>
&lt;p>जैसा कि इस प्रक्रिया से देखा जा सकता है, केवल फ़ाइलों को एकत्र करना और उन्हें पैक करना (पैकेजिंग) पर्याप्त नहीं है; &amp;ldquo;डिजिटल हस्ताक्षर (Digital Signature)&amp;rdquo; का चरण हमेशा आवश्यक होता है। सुरक्षा कारणों से Windows 11 बिना हस्ताक्षर वाले MSIX पैकेज को इंस्टॉल करने की अनुमति बिल्कुल नहीं देता है।&lt;/p>
&lt;h2 id="3-दषटकण-a-visual-studio-क-उपयग-करक-msix-बनन">3. दृष्टिकोण A: Visual Studio का उपयोग करके MSIX बनाना
&lt;/h2>&lt;p>सबसे आसान और सबसे आम तरीका Visual Studio के &amp;ldquo;Windows एप्लिकेशन पैकेजिंग प्रोजेक्ट (Windows Application Packaging Project - WAP)&amp;rdquo; का उपयोग करना है। इस प्रोजेक्ट टेम्पलेट का उपयोग करके, आप WPF, Windows Forms, WinUI 3, या यहाँ तक कि लिगेसी (legacy) C++ Win32 ऐप्स को भी आसानी से MSIX में बदल सकते हैं।&lt;/p>
&lt;h3 id="सटप-बय-सटप-गइड">स्टेप-बाय-स्टेप गाइड
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>WAP प्रोजेक्ट जोड़ें&lt;/strong>: अपने मौजूदा Visual Studio सॉल्यूशन पर राइट-क्लिक करें, &amp;ldquo;नया प्रोजेक्ट जोड़ें (Add New Project)&amp;rdquo; चुनें और &amp;ldquo;Windows एप्लिकेशन पैकेजिंग प्रोजेक्ट&amp;rdquo; चुनें।&lt;/li>
&lt;li>&lt;strong>लक्ष्य प्लेटफ़ॉर्म (Target Platform) का चयन&lt;/strong>: वह न्यूनतम (minimum) और लक्ष्य (target) Windows 10/11 संस्करण (version) निर्दिष्ट करें जिसका आपका ऐप समर्थन करता है।&lt;/li>
&lt;li>&lt;strong>एप्लिकेशन का संदर्भ (Reference)&lt;/strong>: पैकेज प्रोजेक्ट के &amp;ldquo;एप्लिकेशन&amp;rdquo; नोड पर राइट-क्लिक करें, &amp;ldquo;संदर्भ जोड़ें (Add Reference)&amp;rdquo; चुनें और उस मुख्य प्रोजेक्ट (जैसे WPF प्रोजेक्ट) का चयन करें जिसे आप पैकेज करना चाहते हैं।&lt;/li>
&lt;li>&lt;strong>मेनिफेस्ट सेटिंग&lt;/strong>: &lt;code>Package.appxmanifest&lt;/code> फ़ाइल पर डबल-क्लिक करें और विज़ुअल डिज़ाइनर खोलें। यहाँ, ऐप का डिस्प्ले नाम, विवरण, लोगो छवि, और सबसे महत्वपूर्ण &amp;ldquo;पैकेज का नाम (Identity Name)&amp;rdquo; और &amp;ldquo;प्रकाशक (Publisher)&amp;rdquo; सेट करें।&lt;/li>
&lt;li>&lt;strong>पैकेज बनाना&lt;/strong>: प्रोजेक्ट पर राइट-क्लिक करें, &amp;ldquo;प्रकाशित करें (Publish)&amp;rdquo; -&amp;gt; &amp;ldquo;ऐप पैकेज बनाएं (Create App Packages)&amp;rdquo; चुनें। &amp;ldquo;साइडलोडिंग के लिए (For Sideloading)&amp;rdquo; चुनें, आर्किटेक्चर (x64, ARM64 आदि) चुनें, और Visual Studio स्वचालित रूप से संकलन (compile) करेगा, &lt;code>MakeAppx&lt;/code> के साथ पैकेजिंग करेगा, और सेल्फ-साइन्ड सर्टिफिकेट बनाने और हस्ताक्षर करने का पूरा काम संभाल लेगा।&lt;/li>
&lt;/ol>
&lt;p>यह बहुत ही सहज (seamless) है, लेकिन यदि आप यहाँ Visual Studio द्वारा स्वतः-निर्मित सेल्फ-साइन्ड सर्टिफिकेट (Test Certificate) का उपयोग करते हैं, तो आप उस &amp;ldquo;जाल&amp;rdquo; में फंस जाएंगे जिसकी चर्चा हम बाद में करेंगे।&lt;/p>
&lt;h2 id="4-दषटकण-b-कमड-लइन-makeappxexe-क-उपयग-करक-बनन">4. दृष्टिकोण B: कमांड लाइन (MakeAppx.exe) का उपयोग करके बनाना
&lt;/h2>&lt;p>यदि आपको CI/CD पाइपलाइन में स्वचालन (automation) की आवश्यकता है, या आप मौजूदा इंस्टॉलर से फ़ाइलों को मैन्युअल रूप से फिर से पैकेज करना चाहते हैं, तो कमांड लाइन टूल्स की आवश्यकता होती है। यदि आपके पर्यावरण में Windows SDK इंस्टॉल है, तो आप डेवलपर कमांड प्रॉम्प्ट से निम्न टूल तक पहुंच सकते हैं।&lt;/p>
&lt;h3 id="1-मनफसट-फइल-तयर-करन">1. मेनिफेस्ट फ़ाइल तैयार करना
&lt;/h3>&lt;p>पैकेज की रूट डायरेक्टरी में आवश्यक न्यूनतम जानकारी के साथ एक &lt;code>AppxManifest.xml&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;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;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;Package&lt;/span> &lt;span class="na">xmlns=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/foundation/windows10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns:uap=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/uap/windows10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns:rescap=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&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="nt">&amp;lt;Identity&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;MyCompany.AwesomeApp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Publisher=&lt;/span>&lt;span class="s">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">ProcessorArchitecture=&lt;/span>&lt;span class="s">&amp;#34;x64&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&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="nt">&amp;lt;Properties&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;DisplayName&amp;gt;&lt;/span>Awesome App&lt;span class="nt">&amp;lt;/DisplayName&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;PublisherDisplayName&amp;gt;&lt;/span>My Company&lt;span class="nt">&amp;lt;/PublisherDisplayName&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Logo&amp;gt;&lt;/span>Assets\StoreLogo.png&lt;span class="nt">&amp;lt;/Logo&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Properties&amp;gt;&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="nt">&amp;lt;Resources&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Resource&lt;/span> &lt;span class="na">Language=&lt;/span>&lt;span class="s">&amp;#34;en-us&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Resource&lt;/span> &lt;span class="na">Language=&lt;/span>&lt;span class="s">&amp;#34;ja-jp&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Resources&amp;gt;&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="nt">&amp;lt;Dependencies&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;TargetDeviceFamily&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;Windows.Desktop&amp;#34;&lt;/span> &lt;span class="na">MinVersion=&lt;/span>&lt;span class="s">&amp;#34;10.0.17763.0&amp;#34;&lt;/span> &lt;span class="na">MaxVersionTested=&lt;/span>&lt;span class="s">&amp;#34;10.0.22000.0&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Dependencies&amp;gt;&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="nt">&amp;lt;Capabilities&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;rescap:Capability&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;runFullTrust&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Capabilities&amp;gt;&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="nt">&amp;lt;Applications&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Application&lt;/span> &lt;span class="na">Id=&lt;/span>&lt;span class="s">&amp;#34;AwesomeApp&amp;#34;&lt;/span> &lt;span class="na">Executable=&lt;/span>&lt;span class="s">&amp;#34;AwesomeApp.exe&amp;#34;&lt;/span> &lt;span class="na">EntryPoint=&lt;/span>&lt;span class="s">&amp;#34;Windows.FullTrustApplication&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;uap:VisualElements&lt;/span> &lt;span class="na">DisplayName=&lt;/span>&lt;span class="s">&amp;#34;Awesome App&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Description=&lt;/span>&lt;span class="s">&amp;#34;The best app ever.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">BackgroundColor=&lt;/span>&lt;span class="s">&amp;#34;transparent&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Square150x150Logo=&lt;/span>&lt;span class="s">&amp;#34;Assets\Square150x150Logo.png&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Square44x44Logo=&lt;/span>&lt;span class="s">&amp;#34;Assets\Square44x44Logo.png&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/uap:VisualElements&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Application&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Applications&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/Package&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>यहाँ महत्वपूर्ण बात यह है कि &lt;code>&amp;lt;Identity Publisher=&amp;quot;...&amp;quot; /&amp;gt;&lt;/code> का मान उस सर्टिफिकेट के Subject से पूरी तरह मेल खाना चाहिए जिसका उपयोग आप बाद में हस्ताक्षर करने के लिए करेंगे।&lt;/p>
&lt;h3 id="2-makeappx-क-सथ-पकजग">2. MakeAppx के साथ पैकेजिंग
&lt;/h3>&lt;p>कमांड प्रॉम्प्ट में निम्नलिखित कमांड निष्पादित (execute) करें और डायरेक्टरी को MSIX फ़ाइल में पैक करें।&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;/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">MakeAppx.exe pack /d &lt;span class="s2">&amp;#34;C:\Path\To\AppFolder&amp;#34;&lt;/span> /p &lt;span class="s2">&amp;#34;C:\Path\To\Output\AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>यह अहस्ताक्षरित (unsigned) MSIX फ़ाइल को पूरा करता है, लेकिन इस स्थिति में इसे Windows पर इंस्टॉल नहीं किया जा सकता है।&lt;/p>
&lt;h2 id="5-डजटल-हसतकषर-और-करपटगरफ-क-गणतय-पषठभम-mathematical-background">5. डिजिटल हस्ताक्षर और क्रिप्टोग्राफी की गणितीय पृष्ठभूमि (Mathematical Background)
&lt;/h2>&lt;p>MSIX पैकेज के लिए हस्ताक्षर क्यों आवश्यक है, इसे गहराई से समझने के लिए, डिजिटल हस्ताक्षर के पीछे के क्रिप्टोग्राफ़िक तंत्र (cryptographic mechanism) को समझना आवश्यक है। एक डिजिटल हस्ताक्षर गारंटी देता है कि पैकेज &amp;ldquo;निश्चित रूप से निर्दिष्ट प्रकाशक (publisher) द्वारा बनाया गया था (प्रमाणीकरण/Authentication)&amp;rdquo; और &amp;ldquo;बनाए जाने के बाद से किसी तीसरे पक्ष द्वारा इसमें कोई बदलाव नहीं किया गया है (अखंडता/Integrity)&amp;quot;।&lt;/p>
&lt;p>MSIX हस्ताक्षर आमतौर पर RSA एन्क्रिप्शन और SHA-256 (Secure Hash Algorithm 256-bit) के संयोजन (combination) का उपयोग करता है।&lt;/p>
&lt;h3 id="हश-फकशन-hash-function-लग-करन">हैश फ़ंक्शन (Hash Function) लागू करना
&lt;/h3>&lt;p>सबसे पहले, मान लें कि संपूर्ण MSIX पैकेज (सामग्री) बाइनरी एक संदेश $M$ है। साइनिंग टूल (SignTool.exe) इस संदेश $M$ पर एक क्रिप्टोग्राफ़िक हैश फ़ंक्शन, SHA-256 लागू करता है, और एक निश्चित लंबाई (256-बिट) हैश मान $H(M)$ की गणना करता है।&lt;/p>
&lt;h3 id="हसतकषर-उतपनन-करन-परकशक">हस्ताक्षर उत्पन्न करना (प्रकाशक)
&lt;/h3>&lt;p>इसके बाद, प्रकाशक हैश मान को एन्क्रिप्ट करने और एक डिजिटल हस्ताक्षर $\sigma$ उत्पन्न करने के लिए अपनी &amp;ldquo;निजी कुंजी (Private Key)&amp;rdquo; $d$ का उपयोग करता है। RSA एल्गोरिथम के संदर्भ में, इसे मॉड्यूलर एक्सपोनेंटिएशन (modular exponentiation) के रूप में निम्नानुसार व्यक्त किया गया है:&lt;/p>
$$ \sigma \equiv (H(M))^d \pmod n $$&lt;p>जहाँ $n$ RSA मॉड्यूलस (दो बहुत बड़े अभाज्य संख्याओं का गुणनफल) है। इस हस्ताक्षर $\sigma$ और प्रकाशक की &amp;ldquo;सार्वजनिक कुंजी (Public Key)&amp;rdquo; $e$ वाले सर्टिफिकेट (X.509 प्रारूप) को MSIX पैकेज (&lt;code>AppxSignature.p7x&lt;/code>) के हिस्से के रूप में एम्बेड किया जाता है।&lt;/p>
&lt;h3 id="हसतकषर-सतयपन-windows-os">हस्ताक्षर सत्यापन (Windows OS)
&lt;/h3>&lt;p>जब कोई उपयोगकर्ता MSIX इंस्टॉल करने का प्रयास करता है, तो Windows OS पैकेज के भीतर सर्टिफिकेट से सार्वजनिक कुंजी $e$ निकालता है और हैश मान $H'(M)$ को पुनर्स्थापित करने के लिए निम्नलिखित गणना करता है:&lt;/p>
$$ H'(M) \equiv \sigma^e \pmod n $$&lt;p>साथ ही, OS स्वयं संपूर्ण डाउनलोड किए गए MSIX पैकेज $M$ के हैश मान $H(M)$ की पुनर्गणना (recalculate) करता है।
अंत में, यह सत्यापित करता है कि पुनर्स्थापित हैश मान और पुनर्गणना किया गया हैश मान बराबर हैं या नहीं ($H(M) = H'(M)$)। यदि यह समीकरण सही है, तो यह गणितीय रूप से सिद्ध हो जाता है कि &amp;ldquo;हस्ताक्षर के बाद फ़ाइल में एक बिट का भी बदलाव नहीं किया गया है&amp;rdquo;।&lt;/p>
&lt;h2 id="6-सबस-बड-बध-सलफ-सइनड-सरटफकट-क-जल">6. सबसे बड़ी बाधा: &amp;ldquo;सेल्फ-साइन्ड सर्टिफिकेट का जाल&amp;rdquo;
&lt;/h2>&lt;p>भले ही उपरोक्त गणितीय प्रमाण पूर्ण हो, केवल उसी से Windows 11 इंस्टॉलेशन की अनुमति नहीं देगा। ऐसा इसलिए है क्योंकि इसे &amp;ldquo;विश्वास की श्रृंखला (Chain of Trust)&amp;rdquo; को सत्यापित करने की आवश्यकता है: &amp;ldquo;क्या इस सार्वजनिक कुंजी (सर्टिफिकेट) का स्वामी वास्तव में वही सुरक्षित संगठन/व्यक्ति है जिसका वह दावा कर रहा है?&amp;rdquo;&lt;/p>
&lt;p>यदि सर्टिफिकेट VeriSign या DigiCert जैसे आधिकारिक रूट सर्टिफिकेट अथॉरिटी (Root CA) द्वारा जारी किया गया है जिस पर OS पहले से भरोसा करता है, तो इसे बिना किसी समस्या के इंस्टॉल किया जा सकता है (Microsoft Store के माध्यम से वितरित ऐप्स भी इसी तरह Microsoft के रूट सर्टिफिकेट द्वारा विश्वसनीय होते हैं)।&lt;/p>
&lt;p>हालाँकि, जब आप किसी आधिकारिक सर्टिफिकेट को खरीदने का खर्च वहन नहीं कर सकते, जैसे कि विकास के दौरान या केवल इन-हाउस (internal) टूल्स के लिए, तो डेवलपर्स स्वयं अपने सर्टिफिकेट जारी करते हैं। इसे &amp;ldquo;सेल्फ-साइन्ड सर्टिफिकेट (Self-Signed Certificate)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;p>निम्नलिखित अनुक्रम आरेख (sequence diagram) OS के व्यवहार को दर्शाता है जब वह सेल्फ-साइन्ड सर्टिफिकेट के साथ हस्ताक्षरित MSIX पैकेज को इंस्टॉल करने का प्रयास करता है।&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
autonumber
participant U as &amp;#34;उपयोगकर्ता (Windows 11)&amp;#34;
participant P as &amp;#34;MSIX ऐप इंस्टॉलर&amp;#34;
participant C as &amp;#34;Windows सर्टिफिकेट स्टोर&amp;#34;
U-&amp;gt;&amp;gt;P: &amp;#34;.msix फ़ाइल पर डबल क्लिक करें&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;AppxSignature.p7x पढ़ें&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;हस्ताक्षर और सर्टिफिकेट निकालें&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;गणित सत्यापित करें (क्या हैश मेल खाते हैं?)&amp;#34;
P-&amp;gt;&amp;gt;C: &amp;#34;प्रकाशक सर्टिफिकेट का विश्वास (Trust) जांचें&amp;#34;
alt &amp;#34;सर्टिफिकेट Trusted Root CA स्टोर में है&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;विश्वास सफलतापूर्वक सत्यापित हुआ&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;इंस्टॉलेशन के लिए संकेत दें (इंस्टॉल बटन ACTIVE है)&amp;#34;
U-&amp;gt;&amp;gt;P: &amp;#34;इंस्टॉल पर क्लिक करें&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;इंस्टॉलेशन सफल&amp;#34;
else &amp;#34;सर्टिफिकेट विश्वसनीय (Trusted) नहीं है (जाल)&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;विश्वास सत्यापन विफल (0x800B0109)&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;त्रुटि दिखाएं: सर्टिफिकेट श्रृंखला संसाधित (processed) की गई, लेकिन एक ऐसे रूट सर्टिफिकेट पर समाप्त हुई जो विश्वसनीय नहीं है&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;इंस्टॉल बटन DISABLED है&amp;#34;
end
&lt;/pre>
&lt;p>यही वह &amp;ldquo;जाल&amp;rdquo; है। भले ही डेवलपर ने इसे स्वयं बनाया हो और इसे सही ढंग से हस्ताक्षरित किया हो, डिफ़ॉल्ट Windows 11 स्थिति उस सेल्फ-साइन्ड सर्टिफिकेट को नहीं जानती है (उस पर भरोसा नहीं करती है), इसलिए इंस्टॉलेशन त्रुटि कोड &lt;code>0x800B0109&lt;/code> के साथ अवरुद्ध (blocked) हो जाता है। इंस्टॉलर का &amp;ldquo;इंस्टॉल&amp;rdquo; बटन ग्रे-आउट (greyed out) हो जाता है और उसे दबाया नहीं जा सकता।&lt;/p>
&lt;p>कई डेवलपर्स इस त्रुटि का सामना करते हैं और इस भ्रम में पड़ जाते हैं कि &amp;ldquo;MSIX बग्स से भरा है&amp;rdquo; या &amp;ldquo;सेटिंग्स गलत होनी चाहिए&amp;rdquo;, और वे बार-बार मेनिफेस्ट फ़ाइल को फिर से लिखते हैं। लेकिन समस्या पैकेज की संरचना (structure) के साथ नहीं है, बल्कि OS के सर्टिफिकेट स्टोर (Certificate Store) में इसके पंजीकरण (registration) की कमी के साथ है।&lt;/p>
&lt;h2 id="7-समधन-powershell-क-उपयग-करक-सलफ-सइनड-सरटफकट-बनन-और-तनत-deploy-करन">7. समाधान: PowerShell का उपयोग करके सेल्फ-साइन्ड सर्टिफिकेट बनाना और तैनात (Deploy) करना
&lt;/h2>&lt;p>इस समस्या को हल करने के लिए, आपको निम्नलिखित 2 चरणों को सुनिश्चित करना होगा:&lt;/p>
&lt;ol>
&lt;li>एक वैध सेल्फ-साइन्ड सर्टिफिकेट बनाएं और निजी कुंजी युक्त (containing) PFX फ़ाइल निर्यात (export) करें।&lt;/li>
&lt;li>बनाए गए सर्टिफिकेट के सार्वजनिक कुंजी भाग (CER फ़ाइल) को लक्षित &lt;strong>सभी PC के &amp;ldquo;Trusted Root Certification Authorities&amp;rdquo; (विश्वसनीय रूट प्रमाणन प्राधिकरण) स्टोर में इंस्टॉल करें&lt;/strong>।&lt;/li>
&lt;/ol>
&lt;p>PowerShell का उपयोग करके इन्हें मज़बूती से और स्वचालित रूप से (automatically) संसाधित किया जा सकता है।&lt;/p>
&lt;h3 id="चरण-1-सलफ-सइनड-सरटफकट-बनन-और-नरयत-export-करन">चरण 1: सेल्फ-साइन्ड सर्टिफिकेट बनाना और निर्यात (Export) करना
&lt;/h3>&lt;p>सबसे पहले, प्रशासक विशेषाधिकारों (Administrator privileges) के साथ PowerShell प्रारंभ करें और सर्टिफिकेट बनाने के लिए निम्न स्क्रिप्ट निष्पादित करें। यहाँ, हम कोड साइनिंग (Code Signing) उद्देश्यों के लिए विशेष रूप से एक सर्टिफिकेट उत्पन्न करेंगे।&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;/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. पैरामीटर परिभाषित करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SubjectName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CertStoreLocation&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;Cert:\CurrentUser\My&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"># 2. सेल्फ-साइन्ड सर्टिफिकेट बनाना (कोड साइनिंग उपयोग: 1.3.6.1.5.5.7.3.3)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Cert&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-SelfSignedCertificate&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">Custom&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-Subject&lt;/span> &lt;span class="nv">$SubjectName&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-KeyUsage&lt;/span> &lt;span class="n">DigitalSignature&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-FriendlyName&lt;/span> &lt;span class="s2">&amp;#34;MyCompany MSIX Signing Cert&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="n">-CertStoreLocation&lt;/span> &lt;span class="nv">$CertStoreLocation&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-TextExtension&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;2.5.29.37={text}1.3.6.1.5.5.7.3.3&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;2.5.29.19={text}&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="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;सर्टिफिकेट जनरेट हो गया है। Thumbprint: &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$Cert&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Thumbprint&lt;/span>&lt;span class="p">)&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"># 3. PFX (निजी कुंजी सहित) के निर्यात के लिए पासवर्ड बनाना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Password&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="n">-String&lt;/span> &lt;span class="s2">&amp;#34;YourSecurePassword123!&amp;#34;&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="n">-AsPlainText&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. PFX फ़ाइल का निर्यात (SignTool के साथ हस्ताक्षर करने के लिए)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$PfxPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.pfx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Export-PfxCertificate&lt;/span> &lt;span class="n">-Cert&lt;/span> &lt;span class="nv">$Cert&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$PfxPath&lt;/span> &lt;span class="n">-Password&lt;/span> &lt;span class="nv">$Password&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. CER (केवल सार्वजनिक कुंजी) का निर्यात (क्लाइंट PC पर इंस्टॉलेशन के लिए)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CerPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.cer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Export-Certificate&lt;/span> &lt;span class="n">-Cert&lt;/span> &lt;span class="nv">$Cert&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$CerPath&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>MSIX पैकेज पर हस्ताक्षर करने के लिए यहां बनाई गई &lt;code>$PfxPath&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;/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">SignTool.exe sign /fd SHA256 /a /f &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.pfx&amp;#34;&lt;/span> /p &lt;span class="s2">&amp;#34;YourSecurePassword123!&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="चरण-2-कलइट-pc-पर-सरटफकट-इसटल-करन-जल-क-तडन">चरण 2: क्लाइंट PC पर सर्टिफिकेट इंस्टॉल करना (जाल को तोड़ना)
&lt;/h3>&lt;p>यदि आप हस्ताक्षरित MSIX को दूसरे PC (या वर्चुअल मशीन) में ले जाते हैं और उस पर डबल-क्लिक करते हैं, तब भी यह इंस्टॉल नहीं होगा, जैसा कि पहले बताया गया है। इससे पहले (या उसी समय), आपको पहले से निर्यात की गई &lt;code>$CerPath&lt;/code> फ़ाइल को &amp;ldquo;स्थानीय कंप्यूटर (Local Computer)&amp;rdquo; के &amp;ldquo;विश्वसनीय रूट प्रमाणन प्राधिकरण (Trusted Root Certification Authorities)&amp;rdquo; में इंस्टॉल करना होगा।&lt;/p>
&lt;p>ऐसा करने के लिए, डिप्लॉयमेंट डेस्टिनेशन PC पर &lt;strong>प्रशासक विशेषाधिकारों (Administrator privileges)&lt;/strong> के साथ PowerShell खोलें और निम्न कमांड चलाएँ:&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"># CER फ़ाइल का पथ (Path)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CerPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.cer&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"># स्थानीय मशीन (Local Machine) के &amp;#34;Trusted Root Certification Authorities&amp;#34; में आयात (Import) करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Import-Certificate&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$CerPath&lt;/span> &lt;span class="n">-CertStoreLocation&lt;/span> &lt;span class="s2">&amp;#34;Cert:\LocalMachine\Root&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="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;सर्टिफिकेट को विश्वसनीय रूट प्रमाणन प्राधिकरण में इंस्टॉल कर दिया गया है।&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>[!CAUTION]
&amp;ldquo;स्थानीय कंप्यूटर (&lt;code>LocalMachine&lt;/code>)&amp;rdquo; के रूट सर्टिफिकेट अथॉरिटी स्टोर में सर्टिफिकेट जोड़ने के लिए प्रशासक विशेषाधिकार अनिवार्य हैं। यदि आप इसे उपयोगकर्ता के व्यक्तिगत स्टोर (&lt;code>CurrentUser&lt;/code>) में डालते हैं, तो ऐप इंस्टॉलर के अनुमति संदर्भ (permission context) के कारण इसे पहचाना नहीं जा सकता है, इसलिए सावधान रहें।&lt;/p>
&lt;/blockquote>
&lt;p>इस स्क्रिप्ट के सफल होने के तुरंत बाद, उस MSIX फ़ाइल पर फिर से डबल-क्लिक करने का प्रयास करें जो पहले एक त्रुटि दे रही थी। जादू की तरह, त्रुटि संदेश गायब हो जाना चाहिए और आपको एक चमकदार नीला, सक्रिय &amp;ldquo;इंस्टॉल&amp;rdquo; बटन दिखाई देना चाहिए। आपने &amp;ldquo;सेल्फ-साइन्ड सर्टिफिकेट के जाल&amp;rdquo; को पूरी तरह से पार कर लिया है।&lt;/p>
&lt;h2 id="8-एटरपरइज-वतवरण-म-सचलन-operations-और-सरवततम-परथए-best-practices">8. एंटरप्राइज़ वातावरण में संचालन (Operations) और सर्वोत्तम प्रथाएँ (Best Practices)
&lt;/h2>&lt;p>डेवलपर के स्थानीय परीक्षण के लिए उपरोक्त चरण पर्याप्त हैं, लेकिन जब आप किसी कंपनी के भीतर दर्जनों या सैकड़ों PC पर साइडलोडिंग ऐप तैनात (deploy) करते हैं, तो प्रत्येक उपयोगकर्ता से सर्टिफिकेट इंस्टॉलेशन स्क्रिप्ट निष्पादित करवाना अव्यावहारिक है और इसके साथ सुरक्षा जोखिम (security risks) भी जुड़े हैं।&lt;/p>
&lt;p>एंटरप्राइज़ वातावरण के लिए सर्वोत्तम प्रथाएँ निम्नलिखित हैं:&lt;/p>
&lt;h3 id="1-active-directory-group-policy-gpo-क-उपयग-करन">1. Active Directory Group Policy (GPO) का उपयोग करना
&lt;/h3>&lt;p>यदि आपकी कंपनी में Active Directory स्थापित है, तो आप &amp;ldquo;सार्वजनिक कुंजी नीतियां (Public Key Policies)&amp;rdquo; GPO का उपयोग करके डोमेन से जुड़े सभी PC के &amp;ldquo;विश्वसनीय रूट प्रमाणन प्राधिकरण&amp;rdquo; में सेल्फ-साइन्ड सर्टिफिकेट (CER फ़ाइल) स्वचालित रूप से वितरित (distribute) कर सकते हैं। यह कर्मचारियों को सर्टिफिकेट के बारे में सोचे बिना, साझा फ़ोल्डर (shared folder) पर MSIX फ़ाइल पर डबल-क्लिक करके ऐप इंस्टॉल करने की अनुमति देता है।&lt;/p>
&lt;h3 id="2-microsoft-intune-mdm-क-मधयम-स-डपलयमट">2. Microsoft Intune (MDM) के माध्यम से डिप्लॉयमेंट
&lt;/h3>&lt;p>आधुनिक वातावरण डिवाइस प्रबंधन (device management) के लिए Microsoft Intune का उपयोग करते हैं। Intune के साथ, आप &amp;ldquo;कॉन्फ़िगरेशन प्रोफ़ाइल (Configuration Profile)&amp;rdquo; सुविधा का उपयोग करके विश्वसनीय सर्टिफिकेट (.cer) को एंडपॉइंट्स पर पुश कर सकते हैं। उसके बाद, आप LOB (Line of Business) एप्लिकेशन के रूप में MSIX पैकेज को ही साइलेंट इंस्टॉलेशन के रूप में डिप्लॉय कर सकते हैं।&lt;/p>
&lt;h3 id="3-app-installer-फइल-appinstaller-क-मधयम-स-सवचलत-अपडट">3. App Installer फ़ाइल (.appinstaller) के माध्यम से स्वचालित अपडेट
&lt;/h3>&lt;p>MSIX में ऐप अपडेट को स्वचालित करने के लिए एक शक्तिशाली सुविधा है। एक XML-आधारित &lt;code>.appinstaller&lt;/code> फ़ाइल बनाकर और इसे वेब सर्वर या SMB साझा फ़ोल्डर में रखकर, आप ऐप लॉन्च होने पर पृष्ठभूमि (background) में नए MSIX संस्करण की जांच कर सकते हैं, और स्वचालित रूप से अपडेट लागू कर सकते हैं।&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;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;AppInstaller&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Uri=&lt;/span>&lt;span class="s">&amp;#34;https://internal.mycompany.com/apps/AwesomeApp.appinstaller&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/appinstaller/2018&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;MainPackage&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;MyCompany.AwesomeApp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Publisher=&lt;/span>&lt;span class="s">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">ProcessorArchitecture=&lt;/span>&lt;span class="s">&amp;#34;x64&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Uri=&lt;/span>&lt;span class="s">&amp;#34;https://internal.mycompany.com/apps/AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;UpdateSettings&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;OnLaunch&lt;/span> &lt;span class="na">HoursBetweenUpdateChecks=&lt;/span>&lt;span class="s">&amp;#34;0&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/UpdateSettings&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/AppInstaller&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस फ़ाइल को उपयोगकर्ताओं को वितरित और इंस्टॉल करने से, बाद में सर्वर पर MSIX फ़ाइल को बदलकर और &lt;code>.appinstaller&lt;/code> संस्करण संख्या को अपडेट करके, सभी उपयोगकर्ताओं के ऐप्स स्वचालित रूप से अपडेट हो जाएंगे।&lt;/p>
&lt;h2 id="9-समसय-नवरण-troubleshooting-सरटफकट-स-सबधत-समनय-तरटय">9. समस्या निवारण (Troubleshooting): सर्टिफिकेट से संबंधित सामान्य त्रुटियां
&lt;/h2>&lt;p>अंत में, यहाँ कुछ अन्य सामान्य त्रुटियाँ और उनके समाधान दिए गए हैं जो सर्टिफिकेट या हस्ताक्षर के संबंध में हो सकते हैं:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>0x800B0101&lt;/strong>: हस्ताक्षर के लिए उपयोग किए गए सर्टिफिकेट की अवधि समाप्त (expired) हो गई है। या तो एक नया सर्टिफिकेट फिर से जारी करें, या हस्ताक्षर करते समय टाइमस्टैम्प सर्वर (जैसे: &lt;code>http://timestamp.digicert.com&lt;/code>) का उपयोग करें, यह साबित करने के लिए कि सर्टिफिकेट अपनी वैधता अवधि के भीतर हस्ताक्षरित किया गया था (यदि आप टाइमस्टैम्प संलग्न চুক্ত करते हैं, तो हस्ताक्षर को मान्य माना जाता है भले ही सर्टिफिकेट की अवधि समाप्त हो जाए)।&lt;/li>
&lt;li>&lt;strong>0x80080204&lt;/strong>: &lt;code>AppxManifest.xml&lt;/code> में निर्दिष्ट &lt;code>Publisher&lt;/code> का मान और सर्टिफिकेट के &lt;code>Subject&lt;/code> का मान पूरी तरह से मेल नहीं खाते हैं। कड़ाई से जांचें कि क्या वे स्ट्रिंग के रूप में बिल्कुल मेल खाते हैं, जिसमें अल्पविराम (comma) के बाद रिक्त स्थान (spaces) भी शामिल हैं।&lt;/li>
&lt;li>&lt;strong>इवेंट व्यूअर (Event Viewer) की जांच करना&lt;/strong>: त्रुटि के अधिक विस्तृत कारण का पता लगाने के लिए, Windows इवेंट व्यूअर खोलना और &amp;ldquo;एप्लिकेशन और सेवा लॉग&amp;rdquo; -&amp;gt; &amp;ldquo;Microsoft&amp;rdquo; -&amp;gt; &amp;ldquo;Windows&amp;rdquo; -&amp;gt; &amp;ldquo;AppxPackagingOM&amp;rdquo; या &amp;ldquo;AppXDeployment-Server&amp;rdquo; के लॉग की जांच करना बहुत महत्वपूर्ण है।&lt;/li>
&lt;/ul>
&lt;h2 id="10-नषकरष-conclusion">10. निष्कर्ष (Conclusion)
&lt;/h2>&lt;p>Windows 11 के लिए MSIX पैकेजिंग एक शक्तिशाली तकनीक है जो एप्लिकेशन जीवनचक्र प्रबंधन (lifecycle management) में नाटकीय रूप से सुधार करती है। यह Win Rot और DLL हेल से छुटकारा दिलाती है और उपयोगकर्ताओं को एक साफ और सुरक्षित वातावरण प्रदान करती है।&lt;/p>
&lt;p>दूसरी ओर, क्योंकि सुरक्षा मॉडल अधिक सख्त (strict) हो गया है, डिजिटल हस्ताक्षर और सर्टिफिकेट के &amp;ldquo;विश्वास की श्रृंखला (Chain of Trust)&amp;rdquo; की गहरी समझ आवश्यक है। &amp;ldquo;सेल्फ-साइन्ड सर्टिफिकेट का जाल&amp;rdquo; एक ऐसी बाधा है जिसका सामना लगभग हर वह डेवलपर करता है जो MSIX तकनीक के लिए नया है। इस लेख में बताए गए सर्टिफिकेट निर्माण, निर्यात और उपयुक्त स्टोर में आयात के तंत्र (mechanism) को समझकर, और स्क्रिप्ट और GPO के साथ इसे स्वचालित (automate) करके, आप MSIX की क्षमता (potential) को अधिकतम करने वाली सुचारू डिप्लॉयमेंट (smooth deployment) प्राप्त कर सकते हैं।&lt;/p>
&lt;p>अगली पीढ़ी के स्वच्छ Windows एप्लिकेशन वितरण वातावरण के निर्माण के लिए कृपया इस ज्ञान का उपयोग करें।&lt;/p></description></item><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>