هل سبق لك أن قمت بتنزيل سكريبت PowerShell وتشغيله ، ثم واجهت الرسالة الخطأ السيئة المذكورة أدناه؟ إذا كان الأمر كذلك ، فإنك بحاجة إلى استخدام أمر Set-ExecutionPolicy وهذا البرنامج التعليمي!

في هذه المقالة ، ستتعرف على سياسات تنفيذ PowerShell وكيفية إدارتها باستخدام أمر Set-ExecutionPolicy. بحلول نهاية هذه المقالة ، ستعرف ليس فقط كيفية تشغيل السكربتات ولكن أيضًا كيفية استخدام سياسات التنفيذ أيضًا!
تم كتابة هذا البرنامج التعليمي مع الأخذ في الاعتبار Windows PowerShell ، وتم تنفيذ جميع العروض التوضيحية باستخدام Windows PowerShell. سياسات التنفيذ ليست فريدة من نوعها لـ Windows PowerShell ، وهي تعمل بنفس الطريقة في PowerShell 6+. ولكن إذا كنت تعمل مع PowerShell 6+ ، فقد تجد اختلافات صغيرة في السلوك.
ما هي سياسة التنفيذ؟
إذا كنت قد واجهت الخطأ الموضح أعلاه ، فقد واجهت سياسة تنفيذ. سياسات تنفيذ PowerShell هي آلية أمان لحماية نظامك من تشغيل السكربتات الخبيثة. السياسات التنفيذ لا تمنعك من تشغيل كود PowerShell في واجهة المستخدم كقناة ، ولكنها تؤثر فقط على تنفيذ السكربتات.
يقول مايكروسوفت إن سياسة التنفيذ ليست بحقيقة تدابير “أمان” تقنية بل هي بالأحرى بوابة يمكنك فتحها وإغلاقها. بعد كل شيء ، يمكنك تجاوز سياسة التنفيذ المحددة بسهولة ، كما ستتعلم لاحقًا.
تعتمد سياسات التنفيذ على الثقة. إذا كنت تثق في النص البرمجي، فمن المحتمل أنه ليس خبيثًا. عادةً ما لا تمنع سياسات التنفيذ تنفيذ النص البرمجي لـ جميع النصوص. الغرض الأساسي لهذه السياسات (وخاصةً عند تكوينها بصرامة أكبر) هو التأكد من أنك تثق في النص البرمجي الذي تقوم بتشغيله موقع بتوقيعه بشهادة من مصدر موثوق.
نطاقات سياسات التنفيذ
كما تعلمت، تقيد سياسات التنفيذ تنفيذ النصوص، ولكن يمكن لـ PowerShell تنفيذ النصوص في سياقات مختلفة. يقوم PowerShell بتنفيذ النصوص في سياق المستخدم المسجل أو سياق الجهاز العام، عبر المهام المجدولة التي تعمل كنظام أو في نطاق واحد لوحة تحكم PowerShell مفتوحة.
لتوفير مرونة لجميع هذه السياقات، يحتوي PowerShell على خمسة سياقات مختلفة أو نطاقات يمكنك تعريف سياسة تنفيذ فيها.
- سياسة_الجهاز – يقتصر هذا النطاق على جهاز واحد فقط. يؤثر على جميع المستخدمين الذين يسجلون الدخول إلى هذا الكمبيوتر، وتعيين كائن سياسة مجموعة Active Directory يحدده. عند تعريفه، يأخذ الأسبقية على جميع النطاقات الأخرى.
- LocalMachine. هذا هو النطاق الافتراضي الذي يؤثر على جميع مستخدمي الكمبيوتر ويتم تخزينه في مفتاح التسجيل HKEY_LOCAL_MACHINE. عند تعيين سياسة التنفيذ باستخدام
Set-ExecutionPolicy
، يكون هذا النطاق هو الافتراضي.
يتم تخزين سياسة التنفيذ لـ LocalMachine في مفتاح التسجيل HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell.
- UserPolicy – يؤثر نطاق UserPolicy فقط على مستخدم واحد على الكمبيوتر، ويتم تعيينها بواسطة كائن سياسة مجموعة Active Directory. لا يمكنك تغيير هذه السياسة باستخدام
Set-ExecutionPolicy
. - CurrentUser. يحدد نطاق السياسة CurrentUser سياسة التنفيذ فقط للمستخدم الحالي ويتم تخزينها تحت مفتاح التسجيل HKEY_CURRENT_USER. لا يمكنك تغيير هذه السياسة باستخدام
Set-ExecutionPolicy
.
يتم تخزين سياسة التنفيذ لـ CurrentUser في مفتاح التسجيل HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell.
- Process – يحدد هذا النطاق سياسة التنفيذ لجلسة PowerShell واحدة لمستخدم واحد. نطاق سياسة التنفيذ Process هو أدق سياسة تنفيذ يمكنك تحديدها. على عكس سياسات التنفيذ الأخرى، يتم حفظ هذه السياسة في متغير بيئة يسمى
PSExecutionPolicyPreference
بدلاً من التسجيل.
أنواع سياسات التنفيذ
سياسات التنفيذ لها مستويات “أمان” مختلفة. تحدد هذه المستويات مدى صرامة سياسة التنفيذ. على سبيل المثال ، يمكن أن يكون لديك سياسة تنفيذ مفعلة لا تفعل شيئًا في الواقع ؛ فهي معطلة. ومن ناحية أخرى ، يمكن لسياسة التنفيذ تعطيل تنفيذ النص بشكل كامل.
لنغطي كل طريقة يمكنك تكوين مستوى أمان سياسة التنفيذ من الأقل إلى الأكثر قيودًا.
غير مقيد
أقل سياسة قيود هي تلك التي لا تؤثر على أي شيء على الإطلاق ؛ إنها غير مقيدة. سياسات التنفيذ غير المقيدة تعطل بشكل أساسي. يمكن للمستخدمين تشغيل جميع النصوص بغض النظر عن الثقة عندما تكون سياسة التنفيذ غير مقيدة.
تجاوز
مثل النوع غير المقيدة ، فإن سياسة التنفيذ المعينة على تجاوز لا تمنع أي شيء.
على الرغم من أن سياسة التنفيذ من النوع تجاوز و غير المقيدة لها تأثير مماثل ، فإن نوع سياسة التنفيذ تجاوز ليس نوعًا فعليًا على الإطلاق. إنه يتجاوز سياسة التنفيذ المعرفة مسبقًا.
غير معرف
على الرغم من أنها غير مستخدمة بشكل شائع ، يمكنك ببساطة إزالة سياسة التنفيذ عن طريق تعيينها على غير معرفة. عندما تقوم بتعيين سياسة التنفيذ على غير معرفة ، يقوم PowerShell بإزالة تلك السياسات من نطاق التنفيذ المعين بشكل كامل.
في أجهزة الكمبيوتر غير الويندوز ، يتم تعيين سياسة التنفيذ دائمًا على غير مقيدة ولا يمكن تغييرها.
عندما يتم تعيين جميع النطاقات على “غير معرفة” ، يعامل PowerShell جميع النطاقات على أنها “مقيدة”.
RemoteSigned
كما قرأت سابقاً، تتعلق سياسات التنفيذ بالثقة المكتسبة عبر التوقيع الرقمي على النصوص البرمجية. تأخذ PowerShell أيضًا في الاعتبار مصدر تلك النصوص. هل تم إنشاؤها على جهاز الكمبيوتر المحلي أم من شخص عشوائي على الإنترنت؟
لا ينبغي أن يكون الثقة ذاتيًا في النصوص المبنية في مكان آخر غير جهاز الكمبيوتر المحلي. هذا هو السبب في أن PowerShell يوفر سياسة التنفيذ RemoteSigned. تفرض سياسة التنفيذ RemoteSigned أن تكون كافة النصوص مكتوبة في مكان آخر غير جهاز الكمبيوتر المحلي موقعة بشكل تشفيري.
يمكنك تجاوز سياسة التنفيذ هذه إلى حد ما للملفات المُنزّلة من الإنترنت باستخدام الأمر
Unblock-File
.. احصل على مزيد من المعلومات حول هذا السلوك في قسم كيفية عمل سياسة RemoteSigned.
بالنسبة لخادم Windows، تُعيَّن سياسة RemoteSigned كالسياسة الافتراضية.
AllSigned
إذا كنت ترغب في ضمان توقيع جميع النصوص البرمجية في PowerShell بشكل تشفيري، فقم بتعيين سياسة التنفيذ إلى AllSigned. على غرار سياسة RemoteSigned، تأخذ سياسة التنفيذ هذه متطلبات التوقيع خطوة إضافية وتفرض توقيع جميع النصوص قبل التنفيذ.
حتى إذا كانت سياسة التنفيذ AllSigned مُعيَّنة، يمكنك ما زال التجاوز عن سياسة التنفيذ، كما ستتعلم لاحقًا.
Restricted
أكثر سياسة تنفيذ مقيدة هي مقيدة. عندما تكون سياسة التنفيذ مقيدة، لا يمكن تنفيذ أي سكربتات على الإطلاق؛ بغض النظر عما إذا كانت موثوقة أم لا. هذه السياسة تعطل تنفيذ السكربتات تمامًا.
علاوة على ذلك، على عكس أنواع أقل قيداً، فإن النوع المقيد يضمن عدم تنفيذ ملفات تنسيق وتكوين PowerShell (PS1XML)، وملفات سكربتات الوحدة (PSM1)، وملفات الملفات الشخصية لـ PowerShell.
جميع عملاء ويندوز، بشكل افتراضي، مُعينة على سياسة تنفيذ مقيدة.
تقنيًا، تحدد مايكروسوفت سابع سياسة تنفيذ تسمى “الافتراضية”، ولكن النوع هو في الأساس عبارة أخرى لـ “موقَّع بعيد” (على خوادم ويندوز) و “مقيد” (على عملاء ويندوز).
كيف تعمل سياسة “الموقَّع بعيد”
سيناريو معين يجب أن نشير إليه هو كيف تعمل سياسة التنفيذ “الموقَّع بعيد” (كما تعلمت)؛ حيث تمنع تشغيل السكربتات التي تم إنشاؤها في مكان آخر غير جهاز الكمبيوتر المحلي.
ولكن كيف يعرف PowerShell أن السكربت تم إنشاؤه في مكان آخر؟ من خلال تدفقات البيانات.
فهم واستعلام تدفقات البيانات في نظام ملفات NTFS
عندما تقوم بإنشاء ملف في نظام الملفات NTFS، يطبق NTFS سمة تدفق بيانات بديلة (ADS) على الملف. يحتوي التدفق البيانات البديل على سمتين للملف: $Data و zone.Identifier. يستخدم PowerShell سمة zone.Identifier لتحديد ما إذا كان ملف سكربت PowerShell تم إنشاؤه في مكان آخر.
بعكس السمات الأخرى مثل “مضغوط” أو “للقراءة فقط”، فإن سمات ADS (مساحات بيانات إضافية) مخفية في مستكشف الملفات. ولكن، باستخدام PowerShell، يمكنك فحص هذه المساحات.
قم بتشغيل أمر “Get-Item” باستخدام مسار النص والمعامل “Stream” كما هو موضح أدناه. في هذا المثال، تم كتابة “Hello World.ps1” على الكمبيوتر المحلي. لاحظ أن السمة الوحيدة المسندة إلى خاصية “Stream” هي “$DATA”. لا توجد سمة ADS.

الآن، قم بتشغيل نفس الأمر على نص محمل من الإنترنت. لاحظ الآن أن “Get-Item” يعيد كائنًا آخر تمامًا بخاصية “Stream” بقيمة “Zone.Identifier”.

بمجرد أن تعرف أن الملف يحتوي على مساحة بيانات إضافية، يمكنك ثم استخدام أمر “Get-Content” لاكتشاف “المنطقة”. تحدد المنطقة مصدر الملف.
سيعيد “Get-Content” قيمة “ZoneId” تمثل منطقة الملف المصدر.

تشمل القيم الممكنة للمنطقة:
ترتيب السياسات المسبقة
كما تم شرحه أعلاه، توجد العديد من سياسات التنفيذ المختلفة في وقت واحد. عندما يكون لديك العديد من سياسات التنفيذ قيد التنفيذ، يجب أن يكون لديك أولوية.
أولوية السياسة هي الترتيب الذي يطبق به PowerShell سياسات مختلفة تم تعيينها في نطاقات مختلفة. بعض سياسات التنفيذ لديها أولوية أعلى من الأخرى.
عند تشغيل Get-ExecutionPolicy -List
، ستجد جميع سياسات التنفيذ التي تعمل حاليًا مرتبة من أقل أولوية إلى أعلى. على سبيل المثال ، نظرًا لأن MachinePolicy لديها أولوية أقل ، فإن سياسات LocalMachine و CurrentUser ستتجاوزها.

العمل مع سياسات التنفيذ
بمجرد فهمك لخلفية سياسات التنفيذ ، دعنا نتعمق الآن في كيفية العمل معها! للعمل مع سياسات تنفيذ PowerShell ، لديك أمرين في تصرفك Get-ExecutionPolicy
لاكتشاف السياسات المحددة حاليًا و Set-ExecutionPolicy
لتعيين سياسات جديدة.
الحصول على السياسات المعينة حاليًا
قبل أن تتمكن من بدء تغيير سياسات التنفيذ ، تحتاج إلى معرفة ما تعمل به. للقيام بذلك ، لديك أمر Get-ExecutionPolicy
. هذا الأمر يعرض جميع السياسات المعينة حاليًا على الكمبيوتر.
عند تشغيل الأمر Get-ExecutionPolicy
مباشرةً في نافذة PowerShell بدون معلمات ، سيظهر سياسة التنفيذ المحددة لجلسة PowerShell الحالية.

لعرض السياسة التنفيذية المعينة لنطاق معين ، قم بتحديد المعلمة Scope
باستخدام اسم النطاق الذي ترغب في رؤية النتائج له.

لعرض جميع النطاقات وسياسات التنفيذ الخاصة بها ، استخدم المعلمة List
كما هو موضح أدناه.

تغيير سياسات التنفيذ
بمجرد معرفتك بالسياسات التنفيذية المعينة حاليًا ، يمكنك أيضًا تغييرها. لتغيير السياسة على جهاز كمبيوتر واحد ، يمكنك استخدام الأمر Set-ExecutionPolicy
. ولكن إذا كنت في مؤسسة ، فسترغب في تغيير السياسات بشكل جماعي. إذا كانت هذه هي الحالة ، فلديك دائمًا سياسة المجموعة إذا كنت في نطاق Active Directory.
استخدام Set-ExecutionPolicy
دعنا نبدأ أولاً في كيفية تغيير السياسات باستخدام الأمر Set-ExecutionPolicy
. للقيام بذلك ، افتح برنامج PowerShell كمسؤول.
قم الآن بتشغيل الأمر Set-ExecutionPolicy
بمعلمة واحدة (ExecutionPolicy
) وتوفير اسم السياسة التنفيذية.
سيطلب برنامج PowerShell بعد ذلك ما إذا كنت ترغب في تغيير سياسة التنفيذ. إذا كنت ترغب في ذلك ، اكتب Y أو A واضغط على Enter.

بعض أوامر PowerShell تحتاج إلى تشغيل مهام متعددة أخرى للعمل. إذا قمت بإدخال Y
في المثال أعلاه ، قد يطلب منك برنامج PowerShell الاستمرار لكل خطوة. إذا ضغطت A
، فسيستمر في جميع الخطوات التالية.
تشغيل الأمر Set-ExecutionPolicy
بدون استدراجات
افتراضيًا، عند تشغيل Set-ExecutionPolicy
، سيتم طلب منك ما إذا كنت ترغب في تغيير سياسة التنفيذ أم لا. يمكنك تجاوز هذا الطلب عن طريق إضافة معلمة Force
إلى الأمر الخاص بك. باستخدام معلمة Force
ستمنع جميع رسائل التأكيد.

ضبط سياسة تنفيذ PowerShell عبر التسجيل
نظرًا لأن معظم سياسات التنفيذ مخزنة في التسجيل (باستثناء Process)، يمكنك أيضًا تغيير السياسات مباشرة عبر التسجيل.
لتغيير سياسات التنفيذ عبر التسجيل:
- افتح محرر التسجيل في نظام التشغيل Windows (regedit) أو أداة تحرير التسجيل التي تفضلها.
2. انتقل إلى مفتاح التسجيل لنطاق سياسة التنفيذ الذي ترغب في تغييره.
LocalMachine – HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
CurrentUser – HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
3. انقر بزر الماوس الأيمن على المفتاح في التسجيل وأنشئ قيمة سلسلة جديدة تسمى ExecutionPolicy.
4. قم بالنقر المزدوج على قيمة السلسلة الجديدة ExecutionPolicy وأدخل اسم سياسة التنفيذ المطلوبة (Restricted, RemoteSigned, AllSigned, Unrestricted, or Undefined).
5. قم بإنشاء قيمة سلسلة أخرى في نفس المفتاح تسمى Path. قيمة سلسلة Path تمثل مسار محرك PowerShell. تأكد من أن قيمة Path هي C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe والتي تشير إلى محرك PowerShell في نظام التشغيل ويندوز.

سياسة التنفيذ الحالية للمستخدم تتجاوز سياسة الماكينة المحلية. إذا كانت هناك سياسة محددة للمستخدم الحالي في التسجيل وحاولت تغيير سياسة التنفيذ باستخدام Set-ExecutionPolicy
، والذي بشكل افتراضي يضبط السياسة على نطاق LocalMachine، فسوف يعيد PowerShell خطأ موضح أدناه.

ضبط سياسة تشغيل PowerShell عبر سياسة المجموعة
إذا كنت في منظمة تستخدم Active Directory، فلن ترغب في القيام بذلك يدويًا على جميع أجهزة الويندوز الخاصة بك وتشغيل سطر الأوامر Set-ExecutionPolicy
. بدلاً من ذلك، يمكنك إدارة السياسات بشكل جماعي باستخدام سياسة المجموعة.
لإدارة سياسات التنفيذ عبر سياسة المجموعة:
قم بإنشاء كائن سياسة المجموعة
- افتح تطبيق إدارة سياسة المجموعة على خادم تحكم المجال أو على جهاز العمل الانضمام إلى المجال الخاص بك.

2. قم بتوسيع Domains -> <اسم غابة Active Directory الخاصة بك> -> كائنات سياسة المجموعة.

3. انقر بزر الماوس الأيمن على كائنات سياسة المجموعة وانقر على جديد.
4. قم بإعطاء سياسة المجموعة الخاصة بك اسمًا. في هذا البرنامج التعليمي، يُطلق على سياسة المجموعة اسم سياسة تنفيذ PowerShell.

5. انقر بزر الماوس الأيمن على سياسة المجموعة الجديدة وانقر فوق تعديل.
6. انتقل إلى تكوين الكمبيوتر\السياسات\القوالب الإدارية\مكونات Windows\Windows PowerShell.

7. افتح الإعداد في نافذة الجانب الأيمن، وافتح الإعداد تشغيل تنفيذ النصوص.

8. في مربع تشغيل تنفيذ النصوص، حدد الخيار تمكين. يمكنك الآن تحديد أيًا من الخيارات المعروضة أدناه:
9. قم الآن بتغيير سياسة التنفيذ إلى السياسة التي ترغب فيها.
- السماح فقط بتنفيذ النصوص الموقعة – يسمح بتنفيذ جميع النصوص عند توقيعها من قبل مُنشئ موثوق به.
- السماح بتشغيل النصوص المحلية والنصوص الموقعة عن بُعد – يسمح بتشغيل النصوص المحلية ولكن يجب أن تكون النصوص التي تم تنزيلها من الإنترنت موقعة من قبل مُنشئ موثوق به.
- السماح بجميع النصوص – يسمح بتشغيل جميع النصوص.

تعيين كائن سياسة المجموعة
بمجرد إنشاء سياسة المجموعة، حان الوقت لتعيينها لأجهزة الهدف الخاصة بك. للقيام بذلك، يجب أن تعين سياسة المجموعة إلى وحدة تنظيمية للدليل النشط (OU).
إذا قمت بتعديل سياسة المجموعة الحالية بدلاً من إنشاء سياسة جديدة، فقد تم تعيين سياسة المجموعة تلقائيًا إلى وحدة تنظيمية (OU).
- في إدارة سياسة المجموعة، انتقل إلى وحدة التنظيم الخاصة بك عن طريق الانتقال إلى النطاقات -> <النطاق الخاص بالدليل النشط> -> <وحدة التنظيم الخاصة بك>.
2. انقر بزر الماوس الأيمن على وحدة التنظيم وحدد ربط سياسة المجموعة الموجودة…

3. حدد سياسة المجموعة التي تم إنشاؤها للتو (سياسة تنفيذ PowerShell) وانقر على موافق.

يجب أن ترى الآن سياسة المجموعة المعينة لوحدة التنظيم كما هو موضح أدناه.

في هذه النقطة، يمكنك إما الانتظار لفترة التحديث المعرفة مسبقًا لـ سياسة المجموعة أو تشغيل الأمر gpupdate على الكمبيوتر المستهدف لإجبار التحديث.
تأمين تغييرات السياسة المحلية
بمجرد أن تكون سياسة المجموعة سارية المفعول وتغير سياسة التنفيذ، لا يمكن للمستخدمين المحليين تغيير السياسة عبر وحدة تحكم PowerShell المحلية. إذا حاولوا ذلك، ستظهر لهم رسالة خطأ كما هو موضح أدناه.

تجاوز سياسة التنفيذ بالكامل
كما ذكرت سابقًا، فإن سياسة التنفيذ ليست بالضرورة تدابير أمنية. لماذا؟ لأنه يمكنك تجاوزها تمامًا إذا رغبت في ذلك ببضع طرق مختلفة.
باستخدام -ExecutionPolicy Bypass
المعامل
بالاختلاف عن سياسات التنفيذ الأخرى، سياسة “تجاوز” عادة ما تُعيَّن ليس في وحدة التحكم PowerShell بل يتم تمريرها إلى محرك “powershell.exe” الذي يتم تشغيله كمسؤول.
على سبيل المثال، لتشغيل سكربت يسمى “Hello World.ps1” وتجاوز أي سياسة تنفيذ، استدعِ “powershell.exe” واستخدم معامل “تجاوز” وحدد مسار الملف كما هو موضح أدناه.

قراءة السكربتات وتنفيذ رمز غير مُعالج
يمكنك أيضًا تجاوز أي سياسة تنفيذ عن طريق قراءة محتويات السكربت أولاً ثم تمرير تلك المحتويات مباشرة إلى محرك PowerShell. عند القيام بذلك، يتم تشغيل كل أمر بشكل فردي وليس كسكربت كامل في آن واحد.
كما يمكن ملاحظة أن سياسة التنفيذ مُعينة على “مقيد”، ولكن بقراءة السكربت وتمريره إلى “powershell.exe”، فإنه لا يزال يعمل.
هذه الطريقة مشابهة لفتح سكربت في محرر PowerShell مثل PowerShell ISE أو Visual Studio Code وتحديد سطر ثم الضغط على F8.

الاستنتاج
الآن يجب أن تكون على دراية بكل ما يتعلق بسياسات تنفيذ PowerShell. على الرغم من أنها ليست إجراء أمان تقنيًا، يجب عليك لا تزال إدارتها في منظمتك وفقًا للسياسات المؤسسية.