<?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/ar/tags/windows-11/</link><description>Recent content in Windows 11 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ar</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 22:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ar/tags/windows-11/index.xml" rel="self" type="application/rss+xml"/><item><title>دليل إنشاء حزم MSIX لنظام Windows 11 وفخ شهادة التوقيع الذاتي</title><link>http://kenji.blog/ar/p/windows-11-msix-packaging-guide/</link><pubDate>Sat, 12 Sep 2026 22:00:00 +0900</pubDate><guid>http://kenji.blog/ar/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 دليل إنشاء حزم MSIX لنظام Windows 11 وفخ شهادة التوقيع الذاتي" />&lt;p>في عصر Windows 11، أصبح &amp;ldquo;MSIX&amp;rdquo; هو الخيار القياسي لتنسيق توزيع التطبيقات. على الرغم من أن المثبتات التقليدية مثل MSI و EXE كانت تعاني من العديد من المشاكل، إلا أنه من المتوقع أن يحل MSIX هذه المشاكل كتقنية حزم من الجيل التالي. ومع ذلك، عندما يحاول المطورون إنشاء حزمة MSIX وإجراء التحميل الجانبي (Sideloading) في بيئة تنظيمية أو اختبارية، غالباً ما يقعون في &amp;ldquo;فخ شهادة التوقيع الذاتي&amp;rdquo;.&lt;/p>
&lt;p>في هذه المقالة، سنشرح بالتفصيل التفاصيل الفنية لـ MSIX، وكيفية إنشاء الحزم باستخدام Visual Studio وأدوات سطر الأوامر، بالإضافة إلى أسباب وحلول الأخطاء المتعلقة بشهادة التوقيع الذاتي التي يواجهها العديد من المطورين. نأمل أن يكون هذا دليلاً لا غنى عنه لمطوري تطبيقات Windows، ومسؤولي البنية التحتية، والمسؤولين عن الحزم.&lt;/p>
&lt;h2 id="1-ما-هو-msix-مقارنة-مع-msiexe-التقليدية">1. ما هو MSIX؟ مقارنة مع MSI/EXE التقليدية
&lt;/h2>&lt;p>MSIX هو أحدث تنسيق لحزم التطبيقات لنظام Windows تقدمه Microsoft. يجمع بين جميع الميزات والمفاهيم الممتازة من MSI (Microsoft Installer) التقليدي، والمثبتات المخصصة المستندة إلى .exe، و App-V (Application Virtualization)، و AppX (حزم تطبيقات Universal Windows Platform) التي تم تقديمها منذ Windows 8، بالإضافة إلى تطوره ليتناسب مع متطلبات الأمان والنشر الحديثة.&lt;/p>
&lt;h3 id="مشاكل-المثبتات-التقليدية-msiexe">مشاكل المثبتات التقليدية (MSI/EXE)
&lt;/h3>&lt;p>كانت لـ MSI و EXE، اللتين استخدمتا كصيغ تثبيت قياسية في Windows لسنوات عديدة، مشاكل جذرية كما يلي:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>ظاهرة Win Rot (تدهور Windows)&lt;/strong>: أثناء تكرار تثبيت وإلغاء تثبيت التطبيقات، تبقى مفاتيح غير ضرورية في السجل، وتُترك ملفات DLL في مجلدات النظام (مثل &lt;code>C:\Windows\System32&lt;/code>). يؤدي هذا إلى إبطاء نظام التشغيل نفسه تدريجياً وحدوث ظاهرة عدم الاستقرار.&lt;/li>
&lt;li>&lt;strong>جحيم DLL (DLL Hell)&lt;/strong>: عندما تحاول تطبيقات متعددة تثبيت ملف DLL يحمل نفس الاسم (ولكن بإصدارات مختلفة) في دليل النظام المشترك، فإن التطبيق المثبت لاحقاً يستبدل ملف DLL الموجود، مما يؤدي إلى توقف التطبيق المثبت مسبقاً عن العمل بشكل صحيح.&lt;/li>
&lt;li>&lt;strong>عدم الاستقرار بسبب الإجراءات المخصصة&lt;/strong>: في حزم MSI، يمكن تنفيذ نصوص أو تعليمات برمجية تعسفية تسمى &amp;ldquo;الإجراءات المخصصة&amp;rdquo; بصلاحيات النظام أثناء التثبيت أو إلغاء التثبيت. تسبب هذا في خطر انهيار المثبت في منتصف العملية أو التسبب في تغييرات غير متوقعة في إعدادات النظام.&lt;/li>
&lt;/ol>
&lt;h3 id="الحل-من-خلال-بنية-الحاويات-في-msix">الحل من خلال بنية الحاويات في MSIX
&lt;/h3>&lt;p>يحل MSIX هذه المشكلات عن طريق تشغيل التطبيق داخل &amp;ldquo;حاوية&amp;rdquo; خفيفة الوزن. يحتوي نهج الحاويات هذا على المزايا الهائلة التالية:&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 أو الموارد الخاصة بالتطبيقات الأخرى. هذا يحررك من جحيم 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>)، وتتم إدارة معاملات التثبيت بدقة على مستوى نظام التشغيل. في حالة الفشل، يتم التراجع تماماً إلى الحالة الأصلية.&lt;/li>
&lt;/ul>
&lt;h2 id="2-النظرة-العامة-على-إنشاء-حزمة-msix-وسلسلة-الأدوات">2. النظرة العامة على إنشاء حزمة MSIX وسلسلة الأدوات
&lt;/h2>&lt;p>هناك طريقتان رئيسيتان لإنشاء حزمة MSIX. الأولى هي استخدام بيئة التطوير المتكاملة (IDE) لـ Visual Studio، والثانية هي الاستفادة من أدوات سطر الأوامر (مثل &lt;code>MakeAppx.exe&lt;/code> و &lt;code>SignTool.exe&lt;/code>) المرفقة مع Windows SDK.&lt;/p>
&lt;p>يوضح مخطط Mermaid التالي العملية منذ ملفات المصدر وحتى إنشاء حزمة 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;التوقيع الرقمي&amp;rdquo;. لأسباب أمنية، لا يسمح Windows 11 بتثبيت حزم MSIX غير الموقعة على الإطلاق.&lt;/p>
&lt;h2 id="3-النهج-أ-إنشاء-msix-باستخدام-visual-studio">3. النهج أ: إنشاء MSIX باستخدام Visual Studio
&lt;/h2>&lt;p>الطريقة الأسهل والأكثر شيوعاً هي استخدام &amp;ldquo;مشروع حزم تطبيقات Windows (Windows Application Packaging Project - WAP)&amp;rdquo; في Visual Studio. باستخدام قالب المشروع هذا، يمكنك بسهولة تحزيم تطبيقات WPF، Windows Forms، WinUI 3، وحتى تطبيقات Win32 القديمة المكتوبة بـ C++ إلى MSIX.&lt;/p>
&lt;h3 id="دليل-خطوة-بخطوة">دليل خطوة بخطوة
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>إضافة مشروع WAP&lt;/strong>: انقر بزر الماوس الأيمن على حل (Solution) Visual Studio الحالي، واختر &amp;ldquo;إضافة مشروع جديد&amp;rdquo;، ثم حدد &amp;ldquo;مشروع حزم تطبيقات Windows&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>اختيار النظام الأساسي المستهدف&lt;/strong>: حدد الإصدار الأدنى والإصدار المستهدف لنظام التشغيل Windows 10/11 الذي يدعمه التطبيق.&lt;/li>
&lt;li>&lt;strong>الإشارة إلى التطبيق&lt;/strong>: انقر بزر الماوس الأيمن على عقدة &amp;ldquo;التطبيقات&amp;rdquo; في مشروع الحزمة، واختر &amp;ldquo;إضافة مرجع&amp;rdquo;، ثم حدد المشروع الرئيسي الذي تريد حزمه (مثل مشروع WPF).&lt;/li>
&lt;li>&lt;strong>إعداد البيان (Manifest)&lt;/strong>: انقر نقراً مزدوجاً فوق ملف &lt;code>Package.appxmanifest&lt;/code> لفتح المصمم المرئي. هنا، قم بتعيين اسم عرض التطبيق، الوصف، صورة الشعار، والأهم من ذلك &amp;ldquo;اسم الحزمة (Identity Name)&amp;rdquo; و&amp;quot;الناشر (Publisher)&amp;quot;.&lt;/li>
&lt;li>&lt;strong>إنشاء الحزمة&lt;/strong>: انقر بزر الماوس الأيمن على المشروع، واختر &amp;ldquo;نشر&amp;rdquo; -&amp;gt; &amp;ldquo;إنشاء حزم التطبيقات&amp;rdquo;. اختر &amp;ldquo;للتحميل الجانبي (Sideloading)&amp;rdquo; وحدد البنية (مثل x64، ARM64)، وسيقوم Visual Studio تلقائياً بالترجمة، الحزم باستخدام &lt;code>MakeAppx&lt;/code>، وحتى إنشاء شهادة توقيع ذاتي والتوقيع عليها.&lt;/li>
&lt;/ol>
&lt;p>هذا سلس للغاية، ولكن إذا استخدمت شهادة التوقيع الذاتي (Test Certificate) التي تم إنشاؤها تلقائياً بواسطة Visual Studio، فستقع في &amp;ldquo;الفخ&amp;rdquo; الموصوف لاحقاً.&lt;/p>
&lt;h2 id="4-النهج-ب-الإنشاء-باستخدام-سطر-الأوامر-makeappxexe">4. النهج ب: الإنشاء باستخدام سطر الأوامر (MakeAppx.exe)
&lt;/h2>&lt;p>لأتمتة العملية في مسار CI/CD، أو لإعادة حزم مجموعة من الملفات يدوياً من مثبت موجود، ستحتاج إلى أدوات سطر الأوامر. إذا كانت بيئة 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>في موجه الأوامر، قم بتشغيل الأمر التالي لضغط الدليل إلى ملف 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>هذا يكمل ملف MSIX غير الموقّع، ولكن في هذه الحالة، لا يمكن تثبيته على نظام Windows.&lt;/p>
&lt;h2 id="5-التوقيع-الرقمي-والخلفية-الرياضية-لتكنولوجيا-التشفير">5. التوقيع الرقمي والخلفية الرياضية لتكنولوجيا التشفير
&lt;/h2>&lt;p>لفهم سبب الحاجة إلى التوقيع على حزم MSIX بعمق، من الضروري فهم الآليات التشفيرية وراء التوقيعات الرقمية. يضمن التوقيع الرقمي أن الحزمة &amp;ldquo;تم إنشاؤها بالتأكيد بواسطة الناشر المحدد (المصادقة)&amp;rdquo; وأنها &amp;ldquo;لم يتم العبث بها من قبل طرف ثالث من وقت الإنشاء وحتى الآن (النزاهة)&amp;rdquo;.&lt;/p>
&lt;p>يستخدم التوقيع لـ MSIX عادةً مزيجاً من تشفير RSA و SHA-256 (خوارزمية التجزئة الآمنة 256 بت).&lt;/p>
&lt;h3 id="تطبيق-دالة-التجزئة">تطبيق دالة التجزئة
&lt;/h3>&lt;p>أولاً، لنجعل البيانات الثنائية (المحتويات) لحزمة MSIX بأكملها هي الرسالة $M$. تقوم أداة التوقيع (SignTool.exe) بتطبيق دالة التجزئة التشفيرية SHA-256 على هذه الرسالة $M$ لحساب قيمة تجزئة بطول ثابت (256 بت) $H(M)$.&lt;/p>
&lt;h3 id="إنشاء-التوقيع-الناشر">إنشاء التوقيع (الناشر)
&lt;/h3>&lt;p>بعد ذلك، يستخدم الناشر &amp;ldquo;مفتاحه الخاص (Private Key)&amp;rdquo; $d$ لتشفير قيمة التجزئة، ويولد توقيعاً رقمياً $\sigma$. في سياق خوارزمية RSA، يتم التعبير عن هذا كعملية أسية نموذجية على النحو التالي:&lt;/p>
$$ \sigma \equiv (H(M))^d \pmod n $$&lt;p>حيث $n$ هو معامل RSA (حاصل ضرب عددين أوليين ضخمين). يتم تضمين هذه الشهادة (بصيغة X.509) التي تحتوي على التوقيع $\sigma$ و &amp;ldquo;المفتاح العام (Public Key)&amp;rdquo; $e$ الخاص بالناشر كجزء من حزمة MSIX (في &lt;code>AppxSignature.p7x&lt;/code>).&lt;/p>
&lt;h3 id="التحقق-من-التوقيع-نظام-تشغيل-windows">التحقق من التوقيع (نظام تشغيل Windows)
&lt;/h3>&lt;p>عندما يحاول المستخدم تثبيت MSIX، يستخرج نظام التشغيل Windows المفتاح العام $e$ من الشهادة الموجودة داخل الحزمة، ويقوم بالحساب التالي لاستعادة قيمة التجزئة $H'(M)$.&lt;/p>
$$ H'(M) \equiv \sigma^e \pmod n $$&lt;p>في نفس الوقت، يقوم نظام التشغيل نفسه بإعادة حساب قيمة التجزئة $H(M)$ لحزمة MSIX بأكملها التي تم تنزيلها $M$.
في النهاية، يتحقق مما إذا كانت قيمة التجزئة المستردة وقيمة التجزئة المعاد حسابها متساويتين ($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>إذا كانت الشهادة صادرة عن مرجع مصدق جذري عام (Root CA) موثوق به مسبقاً من قبل نظام التشغيل، مثل VeriSign أو DigiCert، فيمكن تثبيته دون مشاكل (التطبيقات الموزعة عبر Microsoft Store موثوق بها بالمثل بواسطة شهادة جذر Microsoft).&lt;/p>
&lt;p>ومع ذلك، إذا لم تتمكن من تحمل تكلفة شراء شهادة عامة، مثل أثناء التطوير أو للأدوات الداخلية للشركة، يقوم المطور بإصدار الشهادة بنفسه. هذه هي &amp;ldquo;شهادة التوقيع الذاتي (Self-Signed Certificate)&amp;rdquo;.&lt;/p>
&lt;p>يوضح مخطط التسلسل التالي سلوك نظام التشغيل عند محاولة تثبيت حزمة 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;التحقق من ثقة شهادة الناشر&amp;#34;
alt &amp;#34;الشهادة موجودة في مخزن المراجع المصدقة الجذرية الموثوقة&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;تم التحقق من الثقة بنجاح&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;مطالبة بالتثبيت (زر التثبيت نَشِط)&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;الشهادة غير موثوقة (الفخ)&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;فشل التحقق من الثقة (0x800B0109)&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;عرض خطأ: تمت معالجة سلسلة الشهادات، لكنها انتهت في شهادة جذر غير موثوقة&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;زر التثبيت مُعَطَّل&amp;#34;
end
&lt;/pre>
&lt;p>هذا هو بالضبط &amp;ldquo;الفخ&amp;rdquo;. على الرغم من أن المطور قد أنشأها ووقّعها بشكل صحيح، إلا أن نظام Windows 11 في حالته الافتراضية لا يعرف (لا يثق بـ) شهادة التوقيع الذاتي تلك، وبالتالي يتم حظر التثبيت برمز الخطأ &lt;code>0x800B0109&lt;/code>. يتحول زر &amp;ldquo;تثبيت&amp;rdquo; في المثبت إلى اللون الرمادي ولا يمكن الضغط عليه.&lt;/p>
&lt;p>يواجه العديد من المطورين هذا الخطأ، ويقعون في متاهة إعادة كتابة ملف البيان مراراً وتكراراً معتقدين أن &amp;ldquo;MSIX مليء بالأخطاء&amp;rdquo; أو &amp;ldquo;يجب أن يكون الإعداد خاطئاً&amp;rdquo;، ولكن المشكلة لا تكمن في هيكل الحزمة، بل في وجود أو عدم وجود تسجيل في مخزن الشهادات (Certificate Store) لنظام التشغيل.&lt;/p>
&lt;h2 id="7-الحل-إنشاء-ونشر-شهادة-توقيع-ذاتي-باستخدام-powershell">7. الحل: إنشاء ونشر شهادة توقيع ذاتي باستخدام PowerShell
&lt;/h2>&lt;p>لحل هذه المشكلة، من الضروري تنفيذ الخطوتين التاليتين بشكل موثوق.&lt;/p>
&lt;ol>
&lt;li>إنشاء شهادة توقيع ذاتي صالحة، وتصدير ملف PFX الذي يحتوي على المفتاح الخاص.&lt;/li>
&lt;li>تثبيت جزء المفتاح العام (ملف CER) للشهادة التي تم إنشاؤها في مخزن &lt;strong>&amp;ldquo;المراجع المصدقة الجذرية الموثوقة (Trusted Root Certification Authorities)&amp;rdquo; لجميع أجهزة الكمبيوتر المستهدفة&lt;/strong>.&lt;/li>
&lt;/ol>
&lt;p>باستخدام PowerShell، يمكن معالجة ذلك بشكل موثوق وتلقائي.&lt;/p>
&lt;h3 id="الخطوة-1-إنشاء-وتصدير-شهادة-التوقيع-الذاتي">الخطوة 1: إنشاء وتصدير شهادة التوقيع الذاتي
&lt;/h3>&lt;p>أولاً، قم بتشغيل PowerShell بصلاحيات المسؤول (Administrator)، وقم بتنفيذ البرنامج النصي التالي لإنشاء الشهادة. هنا، سنقوم بإنشاء شهادة مخصصة لأغراض توقيع التعليمات البرمجية (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 (المفتاح العام فقط) (للتثبيت على أجهزة العملاء)&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>باستخدام ملف &lt;code>$PfxPath&lt;/code> الذي تم إنشاؤه هنا، قم بالتوقيع على حزمة 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">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-تثبيت-الشهادة-على-جهاز-الكمبيوتر-العميل-إزالة-الفخ">الخطوة 2: تثبيت الشهادة على جهاز الكمبيوتر العميل (إزالة الفخ)
&lt;/h3>&lt;p>إذا أخذت حزمة MSIX الموقعة إلى جهاز كمبيوتر آخر (أو بيئة افتراضية)، ونقرت عليها نقراً مزدوجاً كما هي، فلن تتمكن من تثبيتها كما هو موضح أعلاه. مقدماً (أو في نفس الوقت)، ستحتاج إلى تثبيت ملف &lt;code>$CerPath&lt;/code> الذي تم تصديره للتو في &amp;ldquo;المراجع المصدقة الجذرية الموثوقة&amp;rdquo; لـ &amp;ldquo;الكمبيوتر المحلي (Local Computer)&amp;rdquo;.&lt;/p>
&lt;p>للقيام بذلك، افتح PowerShell &lt;strong>بصلاحيات المسؤول&lt;/strong> على جهاز الكمبيوتر المستهدف للنشر، وقم بتنفيذ الأمر التالي.&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&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"># استيراد إلى &amp;#34;المراجع المصدقة الجذرية الموثوقة&amp;#34; للكمبيوتر المحلي&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>)، فقد لا يتم التعرف عليها بسبب سياق امتيازات App Installer.&lt;/p>
&lt;/blockquote>
&lt;p>مباشرة بعد نجاح هذا البرنامج النصي، حاول النقر نقراً مزدوجاً فوق ملف MSIX الذي كان يعطي خطأ في وقت سابق مرة أخرى. وكأنه سحر، يجب أن تختفي رسالة الخطأ ويظهر زر &amp;ldquo;تثبيت&amp;rdquo; نشط بلون أزرق ساطع. بهذا تكون قد تخطيت &amp;ldquo;فخ شهادة التوقيع الذاتي&amp;rdquo; بالكامل.&lt;/p>
&lt;h2 id="8-التشغيل-في-بيئة-المؤسسات-وأفضل-الممارسات">8. التشغيل في بيئة المؤسسات وأفضل الممارسات
&lt;/h2>&lt;p>إذا كان ذلك لاختبار محلي للمطور، فإن الخطوات المذكورة أعلاه كافية. ولكن عند نشر تطبيقات محملة جانبياً على عشرات أو مئات من أجهزة الكمبيوتر داخل الشركة، فمن غير العملي ويشكل خطراً أمنياً أن تطلب من كل مستخدم تشغيل برنامج تثبيت الشهادة النصي.&lt;/p>
&lt;p>أفضل الممارسات في بيئة المؤسسات هي كما يلي.&lt;/p>
&lt;h3 id="1-الاستفادة-من-نهج-مجموعة-active-directory-gpo">1. الاستفادة من نهج مجموعة Active Directory (GPO)
&lt;/h3>&lt;p>إذا تم تقديم Active Directory داخل الشركة، يمكنك استخدام &amp;ldquo;نهج المفتاح العام&amp;rdquo; لـ GPO لتوزيع شهادة التوقيع الذاتي (ملف CER) تلقائياً على &amp;ldquo;المراجع المصدقة الجذرية الموثوقة&amp;rdquo; لجميع أجهزة الكمبيوتر المنضمة إلى المجال. هذا يسمح للموظفين بتثبيت التطبيق بمجرد النقر المزدوج على ملف MSIX في مجلد مشترك دون أي وعي بالشهادة.&lt;/p>
&lt;h3 id="2-النشر-عبر-microsoft-intune-mdm">2. النشر عبر Microsoft Intune (MDM)
&lt;/h3>&lt;p>تستخدم البيئات الحديثة Microsoft Intune لإدارة الأجهزة. في Intune، يمكنك دفع شهادة موثوقة (.cer) إلى نقاط النهاية باستخدام ميزة &amp;ldquo;ملف تعريف التكوين (Configuration Profile)&amp;rdquo;. بعد ذلك، يمكنك نشر حزمة MSIX نفسها كتثبيت صامت كتطبيق LOB (Line of Business).&lt;/p>
&lt;h3 id="3-التحديث-التلقائي-من-خلال-ملف-app-installer-appinstaller">3. التحديث التلقائي من خلال ملف App Installer (.appinstaller)
&lt;/h3>&lt;p>يحتوي MSIX على ميزة قوية لأتمتة تحديثات التطبيقات. عن طريق إنشاء ملف &lt;code>.appinstaller&lt;/code> يستند إلى XML ووضعه على خادم ويب أو مجلد SMB مشترك، يمكنك جعل التطبيق يتحقق في الخلفية من وجود إصدارات جديدة من 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-استكشاف-الأخطاء-وإصلاحها-الأخطاء-الشائعة-المتعلقة-بالشهادات">9. استكشاف الأخطاء وإصلاحها: الأخطاء الشائعة المتعلقة بالشهادات
&lt;/h2>&lt;p>أخيراً، سألخص الأخطاء الشائعة الأخرى التي يمكن أن تحدث فيما يتعلق بالشهادات والتوقيعات وحلولها.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>0x800B0101&lt;/strong>: انتهت صلاحية الشهادة المستخدمة للتوقيع. يرجى إصدار شهادة جديدة، أو استخدم خادم طابع زمني عند التوقيع (مثل &lt;code>http://timestamp.digicert.com&lt;/code>) لإثبات أن التوقيع تم ضمن فترة صلاحية الشهادة (بإضافة طابع زمني، سيتم اعتبار التوقيع صالحاً حتى لو انتهت صلاحية الشهادة نفسها).&lt;/li>
&lt;li>&lt;strong>0x80080204&lt;/strong>: قيمة &lt;code>Publisher&lt;/code> المذكورة في &lt;code>AppxManifest.xml&lt;/code> لا تتطابق تماماً مع قيمة &lt;code>Subject&lt;/code> للشهادة. يرجى التحقق بدقة مما إذا كانت تتطابق تماماً كسلسلة نصية، بما في ذلك وجود أو عدم وجود مسافة بعد الفاصلة.&lt;/li>
&lt;li>&lt;strong>التحقق من عارض الأحداث (Event Viewer)&lt;/strong>: للبحث في سبب أكثر تفصيلاً للخطأ، من المهم جداً فتح عارض أحداث Windows والتحقق من السجلات ضمن &amp;ldquo;سجلات التطبيقات والخدمات (Applications and Services Logs)&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-الخلاصة">10. الخلاصة
&lt;/h2>&lt;p>تعد حزم MSIX لنظام التشغيل Windows 11 تقنية قوية تحسن إدارة دورة حياة التطبيقات بشكل كبير. يمكنك التحرر من Win Rot وجحيم DLL، وتوفير بيئة نظيفة وآمنة للمستخدمين.&lt;/p>
&lt;p>من ناحية أخرى، نظراً لأن نموذج الأمان أصبح أكثر صرامة، فإن الفهم العميق لـ &amp;ldquo;سلسلة الثقة&amp;rdquo; الخاصة بالتوقيعات الرقمية والشهادات أمر بالغ الأهمية. &amp;ldquo;فخ شهادة التوقيع الذاتي&amp;rdquo; هو بوابة مرور يواجهها تقريباً كل مطور يلمس تقنية MSIX لأول مرة. من خلال فهم آلية إنشاء الشهادات، وتصديرها، واستيرادها إلى المخزن المناسب الموضحة في هذه المقالة، والاستفادة من البرامج النصية و GPO للأتمتة، ستتمكن من تحقيق نشر سلس يستخرج أقصى إمكانات MSIX.&lt;/p>
&lt;p>يُرجى الاستفادة من هذه المعرفة لبناء بيئة توزيع تطبيقات Windows نظيفة من الجيل التالي.&lt;/p></description></item><item><title>أساسيات سجل ويندوز (Windows Registry) وطرق التحرير الآمنة والقابلة للبرمجة</title><link>http://kenji.blog/ar/p/windows-registry-safe-programmable-editing/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/ar/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 Registry) وطرق التحرير الآمنة والقابلة للبرمجة" />&lt;h1 id="أساسيات-سجل-ويندوز-windows-registry-وطرق-التحرير-الآمنة-والقابلة-للبرمجة">أساسيات سجل ويندوز (Windows Registry) وطرق التحرير الآمنة والقابلة للبرمجة
&lt;/h1>&lt;p>في نظام التشغيل ويندوز (Windows)، يُعد &amp;ldquo;السجل&amp;rdquo; (Registry) قاعدة بيانات هرمية ضخمة تخزن التكوينات والإعدادات المختلفة للنظام والتطبيقات. في هذه المقالة، سنشرح بالتفصيل الشديد كل شيء بدءًا من البنية الأساسية لسجل ويندوز، ووصولاً إلى طرق التحرير الآمنة والقابلة للبرمجة باستخدام PowerShell و C#.&lt;/p>
&lt;h2 id="1-مقدمة-تاريخ-وتطور-سجل-ويندوز">1. مقدمة: تاريخ وتطور سجل ويندوز
&lt;/h2>&lt;p>في الإصدارات الأولى من ويندوز (عصر Windows 3.x)، كانت إعدادات النظام والتطبيقات تُحفظ بشكل أساسي في ملفات &lt;code>.ini&lt;/code> (ملفات التهيئة). ومع ذلك، أصبحت ملفات INI التي لا تعد ولا تحصى متناثرة في جميع أنحاء النظام لكل تطبيق، مما جعل الإدارة معقدة للغاية. بالإضافة إلى ذلك، نظرًا لأن ملفات INI تعتمد على النصوص العادية، كان من الصعب تخزين البيانات الثنائية (Binary data)، ولم تكن هناك آلية للتحكم في الوصول (الأمان). كما كانت سرعة تحليل الملفات بطيئة، مما جعلها غير مناسبة لتخزين الإعدادات واسعة النطاق.&lt;/p>
&lt;p>لحل هذه المشكلات بشكل جذري، ومنذ نظامي التشغيل Windows NT و Windows 95 وما بعدهما، تم اعتماد &amp;ldquo;السجل&amp;rdquo; (Registry) بشكل كامل كقاعدة بيانات مركزية للإعدادات. السجل عبارة عن قاعدة بيانات هرمية توفر كتابة قوية (Strong typing)، ودعمًا للبيانات الثنائية، وميزات أمان قوية من خلال قوائم التحكم في الوصول (ACL). بفضل هذا، أصبح بإمكان أي مكون، من نواة نظام التشغيل (OS Kernel) إلى تطبيقات مساحة المستخدم (User-space applications)، قراءة الإعدادات وكتابتها من خلال واجهة موحدة (مجموعة دوال &lt;code>Reg*&lt;/code> في واجهة برمجة تطبيقات Win32).&lt;/p>
&lt;p>وحتى في نظام Windows 11 الحديث، لا يزال السجل يعمل كقلب نظام التشغيل. يتم تجميع كافة البيانات الوصفية (Metadata) اللازمة لتشغيل النظام في السجل، بما في ذلك تكوين الأجهزة، وترتيب تحميل برامج تشغيل الأجهزة (Device drivers)، وبيئة سطح مكتب المستخدم، وقائمة البرامج المثبتة.&lt;/p>
&lt;h2 id="2-عمق-البنية-الكيانات-الحقيقية-لخلايا-السجل-registry-hives-وتعيين-الذاكرة-memory-mapping">2. عمق البنية: الكيانات الحقيقية لخلايا السجل (Registry Hives) وتعيين الذاكرة (Memory Mapping)
&lt;/h2>&lt;p>على الرغم من أن السجل يبدو منطقيًا كبنية شجرة (Tree) ضخمة واحدة، إلا أنه فعليًا مقسم إلى عدة ملفات تسمى &amp;ldquo;الخلايا&amp;rdquo; (Hives) ويتم تخزينها على القرص. هذا يفصل بين إعدادات النظام بالكامل وإعدادات المستخدم الخاصة، مما يتيح تحميلًا فعالاً.&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>: مدير حسابات الأمان (حسابات المستخدمين المحليين وتجزئات كلمات المرور).&lt;/li>
&lt;li>&lt;code>SECURITY&lt;/code>: سياسات الأمان المحلية وتعيين الصلاحيات.&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>يتم تعيين هذه الملفات في ذاكرة تجمع صفحات النواة (Kernel page pool memory) بواسطة &amp;ldquo;مدير التكوين&amp;rdquo; (Configuration Manager - CM) الخاص بالنواة عند بدء تشغيل نظام التشغيل. مدير التكوين هو مكون يعمل في وضع النواة (Kernel-mode) ويعالج طلبات القراءة والكتابة في السجل.&lt;/p>
&lt;p>ما يستحق الذكر هو أنه ليست كل بيانات السجل موجودة على القرص. على سبيل المثال، الخلية &lt;code>HARDWARE&lt;/code> متطايرة (Volatile) ولا يتم حفظها على الإطلاق في أي ملف على القرص. في كل مرة يبدأ فيها تشغيل نظام التشغيل ويكتشف مدير &amp;ldquo;التوصيل والتشغيل&amp;rdquo; (PnP) الأجهزة، يتم إعادة بنائها ديناميكيًا في الذاكرة.&lt;/p>
&lt;p>علاوة على ذلك، لزيادة موثوقية السجل، تطبق أحدث إصدارات ويندوز تسجيل المعاملات (Transaction logging). لا تتم كتابة التغييرات التي تطرأ على ملفات الخلايا مباشرة في ملف البيانات، بل يتم تسجيلها أولاً في سجل المعاملات (&lt;code>.log1&lt;/code>، &lt;code>.log2&lt;/code>). يمنع هذا تلف البيانات (Corruption) في حالة الانقطاع المفاجئ للتيار الكهربائي أو تعطل النظام أثناء الكتابة، ويضمن سلامة قاعدة البيانات بشكل قريب من خصائص ACID.&lt;/p>
&lt;h2 id="3-البنية-الهرمية-لمفاتيح-وقيم-السجل">3. البنية الهرمية لمفاتيح وقيم السجل
&lt;/h2>&lt;p>يتمتع السجل ببنية هرمية تشبه إلى حد كبير نظام الملفات. تُسمى العقدة (Node) الجذرية &amp;ldquo;المفتاح الجذري&amp;rdquo; (Root Key) أو &amp;ldquo;الخلية&amp;rdquo; (Hive)، وتُخزن تحتها &amp;ldquo;المفاتيح&amp;rdquo; (Keys)، و&amp;quot;المفاتيح الفرعية&amp;quot; (Subkeys)، و&amp;quot;القيم&amp;quot; (Values) التي تمثل البيانات الفعلية. من الأسهل فهمها إذا اعتبرت أن المفاتيح تقابل الأدلة (Directories) والقيم تقابل الملفات.&lt;/p>
&lt;p>تُصنف المفاتيح الجذرية الرئيسية إلى الخمسة التالية:&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>: يُخزن الإعدادات الخاصة بالمستخدم الذي قام بتسجيل الدخول حاليًا. في الواقع، هذه ليست قاعدة بيانات مستقلة، بل هي مجرد ارتباط رمزي (Symbolic link / Alias) لمفتاح المعرف الأمني (SID) الخاص بالمستخدم المعني ضمن &lt;code>HKEY_USERS&lt;/code>.&lt;/li>
&lt;li>&lt;strong>HKEY_CLASSES_ROOT (HKCR)&lt;/strong>: يُخزن اقترانات امتدادات الملفات، ومعلومات تسجيل فئات COM (نموذج كائن المكون)، وامتدادات واجهة المستخدم (Shell extensions). هذا المفتاح خاص؛ فهو عرض افتراضي (Virtual view) يتم فيه دمج (Merge) &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>: يُخزن إعدادات جميع ملفات تعريف المستخدمين على النظام (تلك المحملة حاليًا في الذاكرة). يتم تنظيمه هرميًا بناءً على معرفات الأمان (SIDs).&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;معرفات أمان المستخدم (User SIDs)...&amp;#34;))
HKCC((&amp;#34;HKEY_CURRENT_CONFIG (رابط)&amp;#34;))
&lt;/pre>
&lt;h2 id="4-أنواع-بيانات-السجل-شرح-مفصل">4. أنواع بيانات السجل (شرح مفصل)
&lt;/h2>&lt;p>كل &amp;ldquo;قيمة&amp;rdquo; في السجل لها نوع بيانات محدد بدقة. عند التعامل مع السجل برمجيًا، من الضروري فهم هذه الأنواع بشكل صحيح وكتابة البيانات بالنوع المناسب. ستؤدي الكتابة بنوع خاطئ إلى رمي التطبيقات لاستثناءات (Exceptions) أو التسبب في توقف ميزات نظام التشغيل.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>REG_SZ (قيمة سلسلة)&lt;/strong>: نوع البيانات الأكثر شيوعًا. يخزن سلسلة نصية Unicode (UTF-16LE) منتهية بحرف NULL. يُستخدم لمسارات الملفات، وعناوين URL، وأسماء العرض في واجهة المستخدم، وما إلى ذلك.&lt;/li>
&lt;li>&lt;strong>REG_DWORD (قيمة عدد صحيح 32-بت)&lt;/strong>: قيمة عدد صحيح غير إشارة (Unsigned integer) بحجم 32-بت (4 بايت). يُستخدم بشكل متكرر للقيم المنطقية (0 = معطل، 1 = ممكّن)، وقيم انتهاء المهلة بالمللي ثانية، وإعدادات رموز الخطأ. نظرًا لأن ويندوز يستخدم بنية 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-بت، يُستخدم لحفظ الأرقام الضخمة (مثل الحصص النسبية للقرص وتحديد حجم الذاكرة الكبيرة) وإعدادات حجم المؤشرات (Pointers).&lt;/li>
&lt;li>&lt;strong>REG_MULTI_SZ (قيمة سلسلة متعددة الأسطر)&lt;/strong>: يخزن سلاسل نصية متعددة منتهية بحرف NULL بشكل متتابع، وينتهي في النهاية بحرف NULL إضافي فارغ (Double NULL). يُعد مناسبًا لتخزين بيانات تشبه المصفوفات (Arrays)، مثل قوائم عناوين IP، وقوائم الخدمات ذات التبعيات، وترتيب الارتباط (Binding order).&lt;/li>
&lt;li>&lt;strong>REG_EXPAND_SZ (قيمة سلسلة قابلة للتوسيع)&lt;/strong>: نوع سلسلة خاص يتضمن سلاسل متغيرات البيئة غير الموسعة (Unexpanded) مثل &lt;code>%USERPROFILE%&lt;/code> أو &lt;code>%SystemRoot%&lt;/code>. عند قيام أحد التطبيقات بقراءتها عبر واجهة برمجة التطبيقات &lt;code>RegQueryValueEx&lt;/code>، أو باستدعاء واجهة برمجة التطبيقات &lt;code>ExpandEnvironmentStrings&lt;/code>، يتم توسيعها ديناميكيًا بواسطة نظام التشغيل إلى المسار المطلق الفعلي.&lt;/li>
&lt;li>&lt;strong>REG_BINARY (قيمة ثنائية)&lt;/strong>: دفق بيانات ثنائية خام عشوائية. يخزن كلمات المرور المشفرة (مثل LSA Secrets)، والشهادات الرقمية، والهياكل المعقدة الخاصة بالتطبيقات، والبيانات المتسلسلة (Serialized data).&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>: أنواع متقدمة خاصة بالنواة (Kernel) تُستخدم بواسطة برامج تشغيل الأجهزة لتسجيل معلومات تخصيص موارد الأجهزة (طلبات المقاطعة IRQ، ومنافذ الإدخال/الإخراج I/O ports، وقنوات الوصول المباشر للذاكرة DMA).&lt;/li>
&lt;/ul>
&lt;h2 id="5-النموذج-الرياضي-للسجل-وأداؤه-في-نظام-التشغيل">5. النموذج الرياضي للسجل وأداؤه في نظام التشغيل
&lt;/h2>&lt;p>نظرًا لأن السجل يرتبط ارتباطًا مباشرًا بأداء نظام التشغيل (خاصة وقت التمهيد وسرعة تهيئة العمليات)، فقد تم تحسينه داخليًا باستخدام بنية بيانات متقدمة تشبه شجرة-B (B-Tree) تسمى &amp;ldquo;مؤشر الخلية&amp;rdquo; (Cell Index).&lt;/p>
&lt;h3 id="التعقيد-الزمني-للبحث-time-complexity">التعقيد الزمني للبحث (Time Complexity)
&lt;/h3>&lt;p>يعتمد التعقيد الزمني $T_{\text{search}}$ عند البحث عن مفتاح معين (مسار) في السجل على عمق الشجرة وعدد العقد (Nodes) في كل مستوى. عند البحث في مفتاح فرعي ذي عمق $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$ هو طول السلسلة (عدد الأحرف) التي تتم مقارنتها. داخل ملف الخلية الذي يمثل كيان السجل، يتم الاحتفاظ بقائمة المفاتيح الفرعية كفهرس مرتب أبجديًا أو بقيم التجزئة (Hash values) للأسماء. لذلك، بدلاً من البحث الخطي البسيط $O(C_i)$، يمكن إجراء بحث ثنائي (Binary Search) $O(\log(C_i))$، مما يحقق وصولاً سريعًا للغاية حتى لو كان هناك عشرات الآلاف من المفاتيح الفرعية ضمن مفتاح واحد.&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$. يتم أيضًا تضمين النفقات الإضافية $S_{\text{overhead}}$ الناتجة عن سجلات المعاملات والخلايا الفارغة التي لم يعد يُحتاج إليها (التجزئة - Fragmentation). إذا تركت بيانات غير ضرورية (مثل بقايا البرامج التي لم يتم إلغاء تثبيتها بالكامل) في السجل لفترة طويلة، فستزيد هذه البصمة، مما يضغط على ذاكرة تجمع صفحات نظام التشغيل ويؤدي إلى انخفاض الأداء.&lt;/p>
&lt;h2 id="6-مخاطر-التحرير-اليدوي-واحتمالات-التلف-التي-تهدد-استقرار-النظام">6. مخاطر التحرير اليدوي واحتمالات التلف التي تهدد استقرار النظام
&lt;/h2>&lt;p>يجب اعتبار التحرير اليدوي باستخدام محرر السجل (&lt;code>regedit.exe&lt;/code>) بمثابة الملاذ الأخير لإدارة النظام. لا يحتوي السجل على ميزة &amp;ldquo;تراجع&amp;rdquo; (Undo) كما هو الحال في محررات المستندات العامة، ويتم تطبيق تغييرات القيم أو حذف المفاتيح فورًا على النظام عبر مدير التكوين.&lt;/p>
&lt;p>على وجه الخصوص، إذا قمت بالخطأ بتحرير أو حذف حرف واحد فقط من المفاتيح الحرجة (Critical keys) الضرورية لبدء تشغيل النظام (على سبيل المثال، إعدادات برامج تشغيل وحدة تحكم القرص تحت &lt;code>HKLM\SYSTEM\CurrentControlSet\Services&lt;/code>، أو قيمة &lt;code>Userinit&lt;/code> في &lt;code>HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon&lt;/code>)، فهناك خطر قاتل يتمثل في تعطل نظام التشغيل وظهور شاشة الموت الزرقاء (BSoD) أو عدم القدرة على تجاوز شاشة تسجيل الدخول (الشاشة السوداء).&lt;/p>
&lt;h3 id="النموذج-الرياضي-لاحتمالية-التلف">النموذج الرياضي لاحتمالية التلف
&lt;/h3>&lt;p>لنفكر في احتمالية حدوث فشل في النظام إذا تم تغيير المفاتيح أو حذفها عشوائيًا في السجل. لنفترض أن مجموعة المفاتيح الحرجة الضرورية لكي يعمل النظام بشكل طبيعي هي $C$، وإجمالي عددها هو $N_c = |C|$. ولنفترض أن إجمالي عدد المفاتيح في السجل بأكمله هو $N_{\text{total}}$.
إذا قمنا بحذف أو إتلاف عدد $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-المحاكاة-الافتراضية-للسجل-registry-virtualization-وبنية-wow64">7. المحاكاة الافتراضية للسجل (Registry Virtualization) وبنية WOW64
&lt;/h2>&lt;p>للحفاظ على التوافق مع التطبيقات القديمة (Legacy applications)، ينفذ ويندوز بعض آليات &amp;ldquo;المحاكاة الافتراضية&amp;rdquo; (Virtualization / Redirection) المتقدمة للوصول إلى السجل. إذا قمت بالبرمجة دون فهم ذلك، فسوف يتسبب ذلك في حدوث أخطاء برمجية (Bugs) فادحة.&lt;/p>
&lt;h3 id="المحاكاة-الافتراضية-للسجل-وuac">المحاكاة الافتراضية للسجل وUAC
&lt;/h3>&lt;p>تم تقديم التحكم في حساب المستخدم (UAC) منذ نظام التشغيل Windows Vista. لمنع التطبيقات القديمة التي تم إنشاؤها في عصر Windows XP (والتي تعمل بصلاحيات مستخدم قياسي) من التعطل مع خطأ &amp;ldquo;تم رفض الوصول&amp;rdquo; (Access Denied) عندما تحاول الكتابة إلى مفاتيح محمية تتطلب في الأصل صلاحيات المسؤول مثل &lt;code>HKLM\SOFTWARE&lt;/code>، يقوم ويندوز بإعادة توجيه تلك الكتابة سرًا إلى المتجر الافتراضي (Virtual Store) داخل ملف تعريف المستخدم: &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> في ملف البيان (Manifest file) لتعطيل هذه المحاكاة الافتراضية.&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>عند تشغيل تطبيقات 32-بت قديمة على إصدار 64-بت من ويندوز (التيار السائد حاليًا)، يتم فصل مفاتيح سجل معينة وإعادة توجيهها تلقائيًا لمنع تطبيق 32-بت من الكتابة فوق إعدادات النظام الأصلية (Native) 64-بت عن طريق الخطأ أو تحميل ملفات DLL 64-بت غير متوافقة.
على سبيل المثال، عندما يحاول تطبيق 32-بت الوصول إلى &lt;code>HKLM\SOFTWARE\Vendor\App&lt;/code>، يقوم نظام التشغيل بإعادة توجيهه بشفافية إلى &lt;code>HKLM\SOFTWARE\WOW6432Node\Vendor\App&lt;/code>.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
App32[&amp;#34;تطبيق 32-بت&amp;#34;]
App64[&amp;#34;تطبيق 64-بت&amp;#34;]
RegAPI[&amp;#34;واجهة برمجة تطبيقات السجل (Advapi32.dll)&amp;#34;]
CM[&amp;#34;مدير التكوين (النواة)&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-بت | HKLM_Soft
CM --&amp;gt;| إذا كانت العملية 32-بت (إعادة توجيه) | HKLM_WOW64
&lt;/pre>
&lt;p>عند تحرير السجل من نصوص PowerShell أو تطبيقات C#، يجب أن تكون واعيًا تمامًا بما إذا كانت العملية قيد التشغيل نفسها 32-بت أم 64-بت. وإلا، فسوف تتسبب في مشكلة مزعجة تتمثل في &amp;ldquo;الإعدادات التي كان من المفترض كتابتها غير مرئية في مستكشف الملفات (مكتوبة في مكان آخر)&amp;rdquo;.&lt;/p>
&lt;h2 id="8-التحرير-الآمن-والقابل-للبرمجة-باستخدام-powershell">8. التحرير الآمن والقابل للبرمجة باستخدام PowerShell
&lt;/h2>&lt;p>لتقليل مخاطر تحرير السجل يدويًا، من أفضل الممارسات الحديثة تدوين العمليات (البنية التحتية ككود - Infrastructure as Code) باستخدام نصوص PowerShell لضمان الأتمتة وإمكانية التكرار والقابلية للاختبار. يأتي PowerShell مزودًا بـ &amp;ldquo;مزود السجل&amp;rdquo; (Registry Provider)، مما يسمح لك بالتلاعب في السجل بشفافية باستخدام نفس الأوامر (Cmdlets) تمامًا (&lt;code>Get-ChildItem&lt;/code>، &lt;code>Get-ItemProperty&lt;/code>، &lt;code>New-Item&lt;/code>، إلخ) المستخدمة للتعامل مع نظام الملفات (مثل محرك الأقراص C:).&lt;/p>
&lt;p>في PowerShell، يتم تركيب محركات أقراص PSDrive مخصصة (تشبه أحرف محركات الأقراص) مثل &lt;code>HKLM:&lt;/code> و &lt;code>HKCU:&lt;/code> افتراضيًا.&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>يوضح البرنامج النصي التالي مثالاً لأتمتة إضافة دليل الأدوات المخصصة بأمان إلى متغير بيئة المستخدم &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"># إنشاء المفتاح الأصل لعنصر القائمة&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"># تعيين اسم العرض للقيمة (الافتراضية)&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-إلى-السجل">تسلسل داخلي لوصول PowerShell إلى السجل
&lt;/h3>&lt;p>يوضح المخطط التالي التسلسل الداخلي لنظام التشغيل عندما يقوم نص PowerShell بتعديل السجل.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant U as &amp;#34;المسؤول / PowerShell&amp;#34;
participant PS as &amp;#34;مزود السجل (.NET)&amp;#34;
participant CM as &amp;#34;مدير التكوين (النواة)&amp;#34;
participant Disk as &amp;#34;ملفات الخلية (Hive) على 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;التحقق من رمز الوصول (Access Token) مقابل قائمة التحكم في الوصول (ACL) للمفتاح&amp;#34;
alt &amp;#34;تم منح الوصول (رمز المسؤول)&amp;#34;
CM-&amp;gt;&amp;gt;CM: &amp;#34;تخصيص خلية في الذاكرة المخبئية المتطايرة&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;كتابة كسولة (Lazy Write) إلى ملف بيانات الخلية (في الخلفية)&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;تم رفض الوصول (مستخدم قياسي)&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)، والقدرة على تحديد العرض 32-بت / 64-بت بشكل صريح باستخدام التعداد (Enum) &lt;code>RegistryView&lt;/code>.&lt;/p>
&lt;p>فيما يلي مثال لشفرة C# البرمجية التي تقرأ وتكتب السجل بشكل موثوق على جانب 64-بت (تجنب إعادة توجيه WOW6432Node) في بيئة نظام تشغيل 64-بت.&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">// تحديد RegistryView.Registry64 لفتح العرض الأصلي 64-بت&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// استخدام عبارة using للتأكد من التخلص (Dispose) الآمن لمقبض مفتاح السجل (مورد غير مُدار - Unmanaged Resource)&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">// عند حظره بواسطة أمان الوصول إلى التعليمات البرمجية (CAS) الخاص بـ .NET&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">// أخطاء إدخال/إخراج غير متوقعة أخرى&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>&amp;ldquo;المقبض&amp;rdquo; (Handle) الذي يعيده نظام التشغيل عند فتح مفتاح السجل هو مورد غير مُدار يستهلك الذاكرة وموارد النظام. لذلك، من القواعد الصارمة في برمجة C# استخدام كتلة &lt;code>using&lt;/code> أو استدعاء &lt;code>.Dispose()&lt;/code> (أو &lt;code>.Close()&lt;/code>) صراحةً داخل كتلة &lt;code>finally&lt;/code> لمنع تسرب المقابض (Handle leaks).&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>.&lt;/em>&lt;/p>
&lt;p>باستخدام أداة سطر الأوامر &lt;code>reg.exe&lt;/code>، يمكنك تنفيذ النسخ الاحتياطي التلقائي داخل البرامج النصية الدفعية (Batch scripts).&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>بدلاً من مجرد نصوص عادية، يمكنك الاستفادة من التوجه الكائني (Object-Oriented) في PowerShell لتصدير كائنات السجل وحفظها بتنسيق XML (CliXML). يتيح لك ذلك التعامل مع البيانات مع الحفاظ على معلومات النوع دون الاعتماد على تحليل السلاسل النصية عند الاستعادة.&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"># أخذ نسخة احتياطية (حفظ الخصائص كـ 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"># مفهوم الاستعادة&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"># يمكن بناء منطق لتكرار (Loop) خصائصه وتطبيقها مرة أخرى باستخدام 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">11. استكشاف الأخطاء وإصلاحها باستخدام Sysinternals Process Monitor (Procmon)
&lt;/h2>&lt;p>إذا لم تكن متأكدًا من المكان الذي يكتب فيه البرنامج في السجل، أو إذا كنت تبحث عن سبب الخطأ &amp;ldquo;تم رفض الوصول&amp;rdquo; (Access Denied)، فإن أداة &lt;strong>Process Monitor (Procmon)&lt;/strong> التي توفرها مايكروسوفت (Microsoft) مجانًا تعتبر قوية للغاية.
باستخدام Procmon، يمكنك التقاط جميع استدعاءات واجهة برمجة تطبيقات السجل (مثل &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>الالتزام بمبدأ الامتياز الأقل (Least Privilege)&lt;/strong>: يجب حفظ إعدادات التطبيق أو البرنامج النصي ضمن المفتاح &lt;code>Software&lt;/code> الموجود أسفل &lt;code>HKCU&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) لتسجيل (تدقيق) من قام بتغيير القيم أو حذفها ومتى تم ذلك في &amp;ldquo;سجل الأمان&amp;rdquo; (Security Log) الخاص بعارض أحداث ويندوز (Event Viewer).&lt;/li>
&lt;li>&lt;strong>التعامل مع إيقاف ميزات المعاملات (Deprecation)&lt;/strong>: تم إهمال (Deprecated) ميزة معاملات السجل (TxR) باستخدام &amp;ldquo;مدير معاملات النواة&amp;rdquo; (Kernel Transaction Manager - KTM) التي تم تقديمها مسبقًا في Windows Vista بدءًا من نظام التشغيل Windows 10 وما بعده. تحتاج التطبيقات إلى تنفيذ آليات النسخ الاحتياطي والتراجع الخاصة بها (مثل قراءة القيم الأصلية والاحتفاظ بها في الذاكرة قبل إجراء أي تغييرات).&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. حتى إذا قمت بإعادة كتابة هذه المفاتيح مباشرة من البرنامج النصي، فسيتم الكتابة فوقها قسرًا بإعدادات وحدة تحكم المجال (Domain Controller) في دورة تحديث خلفية نهج المجموعة التالية (عادةً بفاصل زمني من 90 إلى 120 دقيقة)، مما يؤدي إلى عدم استمرار الإعدادات.&lt;/li>
&lt;/ol>
&lt;h2 id="الخلاصة">الخلاصة
&lt;/h2>&lt;p>يعد سجل ويندوز (Windows Registry) نظامًا أساسيًا قويًا ومعقدًا يدير بشكل متكامل جميع سلوكيات نظام التشغيل وإعدادات التطبيقات. يحمل التحرير اليدوي العشوائي مخاطر عالية ومثبتة رياضيًا لإلحاق الضرر بالنظام. لذلك، فإن استخدام وسائل قابلة للبرمجة مثل PowerShell أو C# لإدارة التكوين بطريقة آمنة وقابلة للاختبار وقابلة للتكرار، وفقًا لمبدأ البنية التحتية ككود (Infrastructure as Code)، يعد أمرًا ضروريًا في إدارة الأنظمة وتطويرها في العصر الحديث. يُرجى الاستفادة من الفهم العميق للبنية وأنماط التنفيذ المشروحة في هذه المقالة لبناء بيئات ويندوز أكثر قوة وأمانًا.&lt;/p></description></item></channel></rss>