האם אי פעם הורדת סקריפט PowerShell, הפעלת אותו, ונתקלת בהודעת שגיאה השגורה למטה? אם כן, תצטרך את פקודת ה-Set-ExecutionPolicy ואת המדריך הזה!

בפוסט זה, תלמד על מדיניות ביצוע PowerShell ואיך לנהל אותם עם פקודת ה-Set-ExecutionPolicy. עד סיום הפוסט הזה, תדע לא רק להפעיל סקריפטים אלא גם כיצד להשתמש במדיניות ביצועים!
המדריך הזה נכתב עם חשיבות על PowerShell של Windows בדעת, וכל הדגמים נעשו עם PowerShell של Windows. מדיניות הביצועים אינן ייחודיות ל-PowerShell של Windows, והן פועלות בדרך דומה מאוד ב-PowerShell 6+. אבל, אם אתה עובד עם PowerShell 6+, יתכן שתמצא הבדלים קטנים בהתנהגות.
מהו מדיניות הביצועים?
אם נתקלת כבר בשגיאה שתוארה למעלה, נתקלת במדיניות ביצוע. מדיניות הביצוע ב- PowerShell היא מנגנון אבטחה להגנת המערכת שלך מסקריפטים זדוניים. מדיניות ביצוע לא מונעת ממך להפעיל קוד PowerShell בקונסול כמעט כמו מפריע, אך היא מונעת ביצוע של סקריפטים.
Microsoft אומרת שמדיניות ביצוע אינה טכנית "אבטחה" ממש אלא יותר שער שאתה יכול לפתוח ולסגור. אחרי הכל, תוכל לעקוף מדיניות ביצוע מוגדרת בקלות, כפי שתלמד מאוחר יותר.
המדיניות הפעולה מבוססת על אמון. אם אתה סומך על סקריפט, יש סיכוי שהוא לא זדוני. מדיניות הביצוע בדרך כלל אינה מונעת באופן סטנדרטי את ביצוע הסקריפטים של כל. מטרתם העיקרית (ובעיקר כאשר הם מוגדרים בצורה יותר הגברתית) היא לוודא שסקריפט הפעולה שאתה מפעיל הוא חתום באמצעות אישור קריפטוגרפי.
קטגוריות מדיניות ביצוע
כפי שלמדת, מדיניות ביצוע מגבילה את ביצוע הסקריפטים, אך PowerShell יכול לבצע סקריפטים בהקשרים שונים רבים. PowerShell מפעיל סקריפטים בהקשר של משתמש מחובר או בהקשר של מחשב גלובלי, דרך משימות מתוזמנות שרצות כ-SYSTEM או בתחום של קונסולת PowerShell פתוחה יחידה.
כדי להתאים לכל ההקשרים אלו, יש ל-PowerShell חמישה הקשרים שונים או טווחים שבהם תוכל להגדיר מדיניות ביצוע.
- MachinePolicy – הטווח הזה מוגבל למחשב יחיד. זה משפיע על כל המשתמשים המתחברים למחשב זה, ואובייקט מדיניות קבוצת 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 של משתמש יחיד. הטווח הזה הוא הטווח הכי דק של מדיניות ביצוע שאפשר להגדיר. להבחנה ממדיניות ביצוע אחרות, מדיניות זו נשמרת במשתנה סביבה בשם
PSExecutionPolicyPreference
במקום ברישום.
סוגי מדיניות ביצוע
הפעולות מזהות "רמות אבטחה" שונות. רמות אלו קובעות כמה נחוצה יהיה מדיניות הביצוע. לדוגמה, ניתן להגדיר מדיניות ביצוע המעצילה; היא מושבתת, אך לעומת זאת, מדיניות ביצוע יכולה לנטרל לחלוטין את הביצוע של סקריפטים.
בואו נדבר על כל הדרכים שבהן ניתן להגדיר את רמת האבטחה של מדיניות ביצוע מהפחות להגבר.
לא מוגבל
המדיניות הפחות מוגבלת היא זו שאינה משפיעה כלל; היא לא מוגבלת. מדיניות ביצוע מסוג זה מושבתת לחלוטין. משתמשים יכולים להפעיל את כל הסקריפטים ללא קשר לאמינותם כאשר מדובר במדיניות ביצוע שהיא לא מוגבלת.
עקיפה
כמו מסוג לא מוגבלת, מדיניות ביצוע המוגדרת כ-עקיפה אינה חוסמת כלום.
אף שיש למדיניות עקיפה ולמדיניות לא מוגבלת את אותו ההשפעה, מדיניות הביצוע מסוג עקיפה אינה סוג במובן הטכני. היא דולקת על מדיניות ביצוע מוגדרת באופן שלם.
לא מוגדר
אף שלא נהוג להשתמש בה, אפשר להסיר בעצם מדיניות ביצוע על ידי הגדרתה כ-לא מוגדר. כאשר מגדירים מדיניות ביצוע כ-לא מוגדרת, PowerShell מסירה לחלוטין את כל מדיניות הביצוע המוקצתת מהטווח המוקצה.
על מחשבים שאינם מפעילים מערכת הפעלה Windows, מדיניות הביצוע מוגדרת תמיד כ-לא מוגבלת ולא ניתן לשנות אותה.
כאשר כל הטווחים מוגדרים כלא מוגדרים, PowerShell טופלת את כל הטווחים כמוגבלים.
חתומה מרחוק
כפי שקראת קודם, מדיניות הביצוע מתייחסת לאמון שנרכש דרך חתימה דיגיטלית על קובצי סקריפטים. PowerShell גם מתחשב במקום ממנו הגיע הסקריפט. האם נוצר על המחשב המקומי שלך או מאדם אקראי באינטרנט?
סקריפטים שנבנו במקום אחר מחוץ למחשב המקומי שלך לא צריכים להיות באופן מובנה מהימנים. זו הסיבה שבפועל PowerShell מספק את מדיניות הביצוע RemoteSigned. מדיניות הביצוע RemoteSigned מכפילה כי כל הסקריפטים מועתקים ממקום אחר למחשב שלך חייבים להיות מחותמים בצורה קריפטוגרפית.
ניתן לעקוף מדיניות זו במידה מסוימת עבור קבצים שהורדו מהאינטרנט באמצעות הפקודה
Unblock-File
cmdlet. עוד מידע על התנהגות זו תוכל למצוא מעט מאוחר יותר בחלק איך מדיניות ה RemoteSigned פועלת.
עבור שרתי Windows, RemoteSigned מוקצה כמדיניות ברירת המחדל.
AllSigned
אם ברצונך לוודא שכל הסקריפטים ב- PowerShell מחותמים בצורה קריפטוגרפית, יש להגדיר את מדיניות הביצוע ל- AllSigned. כמו RemoteSigned, מדיניות זו מגבירה את דרישת החתימה ומכפילה כי כל הסקריפטים חייבים להיות מחותמים לפני הביצוע.
גם אם מדיניות הביצוע שלך היא AllSigned, ניתן עדיין לעקוף אותה באמצעות השימוש בהשבתה, כפי שתלמד מאוחר יותר.
Restricted
המדיניות הקפדנית ביותר לביצוע היא מוגבל. כאשר מדיניות הביצוע היא מוגבלת, אף סקריפט לא יכול להתבצע; בלתי תלוי באם הם מובילים או לא. מדיניות זו בעצם מנטרת את ביצוע סקריפטים באופן מוחלט.
גם, לעומת סוגי המדיניות הפחות הקפדניים, הסוג מוגבל מבטיח שקבצי עיצוב והגדרה של PowerShell (PS1XML), קבצי סקריפט מודול (PSM1) ופרופילים של PowerShell לא יוכלו להתבצע.
כל הלקוחות של Windows, כברירת מחדל, מוגדרים למדיניות ביצוע מוגבלת.
מבחינה טכנית, מיקרוסופט מגדירה מדיניות ביצוע שביעית נקראת ברירת מחדל, אך הסוג בעצם מהווה תו נוסף ל־RemoteSigned (ב-Windows Server) ול־Restricted (בלקוחות Windows).
כיצד מדיניות ה־RemoteSigned פועלת
סצינריו מסוים לציין הוא כיצד מדיניות הביצוע RemoteSigned פועלת. מדיניות ביצוע זו (כפי שלמדת) מונעת מסקריפטים לרוץ שנוצרו במקום אחר מאשר במחשב המקומי שלך.
אך איך PowerShell יודע שהסקריפט נוצר במקום אחר? זרמי נתונים.
הבנת ושאילתת נתוני NTFS
כל פעם שאתה יוצר קובץ במערכת הקבצים של NTFS, NTFS מחייב תכונת זרם נתונים חלופי (ADS) לקובץ. ל-ADS יש שתי תכונות קובץ: $Data ו־zone.Identifier. PowerShell משתמש בתכונת zone.Identifier כדי לזהות אם קובץ סקריפט של PowerShell נוצר במקום אחר.
לעומת מאפיינים אחרים כמו דחוס או לקריאה בלבד, מאפייני ADS מוסתרים בסייר הקבצים. אך, באמצעות PowerShell, ניתן לבדוק את נתוני הזרמים הללו.
הפעל את הפקודה Get-Item
עם הנתיב לתסריט והפרמטר Stream
כפי שמוצג למטה. בדוגמה זו, נכתב "Hello World.ps1" במחשב המקומי. שים לב שהמאפיין היחיד המשויך למאפיין Stream
הוא $DATA
. אין שום מאפיין ADS.

עכשיו, הפעל את אותה פקודה על תסריט שהורד מהאינטרנט. שים לב שעכשיו Get-Item
מחזיר אובייקט אחר לחלוטין עם זרם של Zone.Identifier
.

כשאתה יודע שיש לקובץ את ADS, תוכל להשתמש בפקודה Get-Content
כדי לגלות את האזור. האזור מגדיר מאין הקובץ נשלח.
Get-Content
יחזיר ערך של ZoneId
שמייצג את האזור ממנו הקובץ התקבל.

ערכי האזור האפשריים הם:
תדירות המדיניות של הפעלה
כפי שכוסבר לעיל, ישנן תדירויות הפעלה שונות שפועלות בו זמנית. כל מדיניות הפעלה אלו, כאשר משולבות, מקבעות את ההגדרות של ההפעלה הנוכחית שלך. כאשר יש לך מדיניות הפעלה מרובה בתוקף, יש להם תדירות.
תדירות המדיניות היא הסדר שבו PowerShell מחיל תדירויות שונות שהוגדרו בטווחים שונים. ישנן מדיניות הפעלה שיש להן עדיפות גבוהה מאחרות.
כאשר אתה מפעיל את הפקודה Get-ExecutionPolicy -List
, תמצא את כל מדיניות הביצוע הפעילות כרגע ממוינת מהנמוכה ביותר לגבוהה ביותר. לדוגמה, מאחר שיש ל-MachinePolicy עדיפות נמוכה יותר, מדיניות LocalMachine ו־CurrentUser יחליפו אותה.

עבודה עם מדיניות ביצוע
לאחר שהבנת את הרקע של מדיניות הביצוע, בוא נחקור איך לעבוד עם הם! כדי לעבוד עם מדיניות הביצוע של PowerShell, יש לך שתי פקודות לרשותך: Get-ExecutionPolicy
לגילוי של מדיניות מוגדרת כרגע ו־Set-ExecutionPolicy
להגדרת מדיניות חדשה.
קבלת מדיניות שהוקצתה כרגע
לפני שתוכל להתחיל לשנות מדיניות ביצוע, עליך ללמוד איזה מדיניות יש לך. כדי לעשות זאת, יש לך את הפקודה Get-ExecutionPolicy
. הפקודה הזו מפרטת את כל המדיניות המוקצות כרגע במחשב.
כאשר אתה מפעיל ישירות את הפקודה Get-ExecutionPolicy
בקונסול PowerShell ללא פרמטרים, היא תציג את מדיניות הביצוע שמוגדרת עבור הסשן הנוכחי שלך.

כדי לראות את מדיניות הביצוע שהוגדרה לטווח, ציין את הפרמטר Scope
באמצעות שם הטווח שתרצה לראות תוצאות עבורו.

כדי לראות את כל הטווחים והמדיניות שלהם, השתמש בפרמטר List
כמצוין למטה.

שינוי מדיניות ביצוע
פעם אחת שאתה יודע מה המדיניות של ביצוע כרגע מוקצות, אתה יכול לשנות אותן גם. כדי לשנות את המדיניות במחשב יחיד, יש לך את הפקודה Set-ExecutionPolicy
לרשותך. אך, אם אתה בארגון, תרצה לשנות מדיניות בכמות. אם זה המקרה, תמיד יש לך מדיניות קבוצה אם אתה בתחום של פעולת ספריית פעילים.
שימוש ב־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, או Undefined).
התוווה ערך מחרוזת נוסף באותו מפתח בשם Path. הערך מחרוזת של Path מייצג את נתיב מנוע הכוח של PowerShell. ודא שערך המחרוזת של Path הוא C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe אשר מצביע על מנוע הכוח של Windows PowerShell.

מדיניות הביצוע של CurrentUser מחמירה על מדיניות של LocalMachine. אם יש לך מדיניות של CurrentUser שמוגדרת ברגיסטר ואתה מנסה לשנות את מדיניות הביצוע דרך Set-ExecutionPolicy
, שבאופן ברירת מחדל מגדירה את המדיניות בתחום של LocalMachine, PowerShell יחזיר שגיאה המוצגת למטה.

הגדרת מדיניות ביצוע של PowerShell דרך קבוצת מדיניות
אם אתה נמצא בארגון עם Active Directory, אתה לא רוצה להתקרב לכל המכונות של Windows שלך ולהפעיל את הפקודה Set-ExecutionPolicy
. במקום זאת, אתה יכול לנהל מדיניות בצובר עם מדיניות קבוצתית.
כדי לנהל מדיניות ביצוע דרך GPO:
צור את אובייקט מדיניות הקבוצה
- פתח את יישום ניהול מדיניות הקבוצה בשרת רשות השולחן או בתחנת העבודה המצורפת לדומיין שלך.

2. הרחב Domains —> <your Active Directory forest> —> Group Policy Objects.

3. לחץ ימינה על Group Policy Objects ולחץ על New.
4. תן שם ל-GPO שלך. במדריך זה, ה-GPO נקרא מדיניות ביצוע PowerShell.

5. לחץ ימנית על ה-GPO שנוצר לאחרונה ולחץ על עריכה.
6. נווט אל תצורת מחשב\מדיניות\תבניות מנהל\רכיבי Windows\Windows PowerShell.

7. פתח את ההגדרה בחלון הימני, פתח את ההגדרה הפעלת ביצוע סקריפט.

8. בתיבת ה-הפעלת ביצוע סקריפט, בחר באפשרות Enabled. כעת תוכל לבחור אחת מהאפשרויות הבאות:
9. שנה כעת את מדיניות הביצוע שלך למדיניות הרצויה.
- להרשות רק סקריפטים מחותמים – מאפשר את ביצוע כל הסקריפטים כאשר הוצאו לאור על ידי מוציא רשיון מהימן.
- להרשות סקריפטים מקומיים וסקריפטים מרוחקים מחותמים – מאפשר ריצת סקריפטים מקומיים אך סקריפטים שהורדו מהאינטרנט צריכים להיות מחותמים על ידי מוציא רשיון מהימן.
- להרשות את כל הסקריפטים – מאפשר את ביצוע כל הסקריפטים.

הקצאת עצם מדיניות הקבוצה
לאחר שיצרת את ה-GPO, הגיע הזמן להקצות אותו למחשבי היעד שלך. כדי לעשות זאת, עליך להקצות את ה-GPO ליחידת ארגון של פעילות פעילה (OU) ב-Director הפעיל.
אם, במקום ליצור GPO חדש, ערכת GPO קיים, זה כבר ישמע שה-GPO הוקצה כבר ל-OU.
- ב-ניהול מדיניות קבוצה, נווט אל תיקיית ה OU שלך על ידי המעבר ל-דומיינים —> <יער הפעולה שלך ב-Active Directory> —> <ה OU שלך>.
2. לחץ ימינה על ה OU ובחר קישור ל-GPO קיים…

3. בחר ב-GPO שנוצר כעת (מדיניות ביצוע PowerShell) ולחץ אישור.

עכשיו תראה את ה-GPO שמשויך ל-OU כמו שמוצג למטה.

בנקודה זו, תוכל לחכות למערכת הרענון של מדיניות קבוצה המוגדרת, או להריץ את הפקודה gpupdate על מחשב יעד כדי לכפות רענון.
נעילת שינויים במדיניות מקומית
פעם שה-GPO פעיל שמשנה את מדיניות הביצוע, משתמשים מקומיים לא יכולים עוד לשנות את המדיניות דרך מקום הפקודות של PowerShell. אם ינסו, הם יקבלו שגיאה, כפי שמוצג למטה.

עובר על מדיניות הביצוע לחלוטין
כפי שאמור לפני כן, מדיניות הביצוע אינה בהכרח משמשת כהגנה. למה? כי אפשר לעבור עליה לחלוטין בכמה דרכים שונות.
שימוש בפרמטר -ExecutionPolicy Bypass
לעומת מדיניות הביצועים האחרות, מדיניות ה-Bypass נקבעת בדרך כלל לא במסוף PowerShell אלא מועברת למנוע ההרצה של powershell.exe הרץ בתור מנהל.
לדוגמה, כדי להריץ סקריפט בשם Hello World.ps1 ולדלג על כל מדיניות הביצועים, עליך לקרוא powershell.exe, להשתמש בפרמטר Bypass
ולספק את נתיב הקובץ כפי שמוצג למטה.

קריאת סקריפטים וביצוע קוד גולמי
ניתן גם לעבור על כל מדיניות הביצועים על ידי קריאת תוכן הסקריפט ואז להעביר את התוכן הזה ישירות למנוע ההרצה של PowerShell. בכך, כל פקודה מורצת בנפרד ולא כסקריפט שלם בו זמנית.
כפי שניתן לראות למטה, מדיניות הביצועים מוגדרת כ-Restricted, אך על ידי קריאת הסקריפט והעברתו ל-powershell.exe, הכל עדיין פועל.
הגישה הזו דומה לפתיחת סקריפט בעורך PowerShell כגון PowerShell ISE או Visual Studio Code, בחירת שורה ולחיצה על F8.

מסקנה
עכשיו אתה אמור לדעת הכל על מדיניות הביצועים של PowerShell. אף על פי שהן לא מדייניות אבטחה ממשית, עדיין עליך לנהל אותן בארגון שלך לפי מדיניות ארגונית.