דף הבית » איך ל » כיצד להשתמש קובץ אצווה לעשות PowerShell סקריפטים קל יותר לרוץ

    כיצד להשתמש קובץ אצווה לעשות PowerShell סקריפטים קל יותר לרוץ

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

    למה אני לא יכול פשוט להעתיק את .PS1 הקובץ למחשב אחר ולהפעיל אותו?

    אלא אם כן מערכת היעד הוגדרה מראש כדי לאפשר הפעלה של סקריפטים שרירותיים, עם הרשאות הנדרשות, ושימוש בהגדרות הנכונות, רוב הסיכויים שאתה עומד להיתקל בבעיות מסוימות כאשר תנסה לעשות זאת.

    1. PowerShell אינו משויך לסיומת הקובץ .PS1 כברירת מחדל.
      הבאנו את זה בהתחלה שלנו PowerShell חנון בסדרה הספר. Windows מקשר קובצי .PS1 לפנקס Notepad כברירת מחדל, במקום לשלוח אותם למתורגמן הפקודה PowerShell. זה כדי למנוע ביצוע מקרי של סקריפטים זדוניים פשוט על ידי לחיצה כפולה עליהם. ישנן דרכים שבהן אתה יכול לשנות את ההתנהגות הזו, אבל זה כנראה לא משהו שאתה רוצה לעשות על כל מחשב אתה נושא את הסקריפטים מסביב - במיוחד אם חלק מהמחשבים האלה הם לא שלך.
    2. PowerShell אינו מאפשר ביצוע סקריפט חיצוני כברירת מחדל.
      ההגדרה ExecutionPolicy ב- PowerShell מונעת ביצוע של סקריפטים חיצוניים כברירת מחדל בכל הגירסאות של Windows. בגירסאות מסוימות של Windows, ברירת המחדל אינה מאפשרת ביצוע Script כלל. הראינו לך כיצד לשנות הגדרה זו ב כיצד לאפשר ביצוע של סקריפטים PowerShell ב- Windows 7. עם זאת, זה גם משהו שאתה לא רוצה לעשות רק על כל מחשב.
    3. חלק מהסקריפטים של PowerShell לא יפעלו ללא הרשאות מנהל.
      גם אם אתה משתמש בחשבון ברמת מנהל המערכת, עדיין עליך לעבור את בקרת חשבון המשתמש (UAC) כדי לבצע פעולות מסוימות. אנחנו לא רוצים להשבית את זה, אבל זה עדיין נחמד כאשר אנחנו יכולים לעשות את זה קצת יותר קל להתמודד עם.
    4. ייתכן שחלק מהמשתמשים התאימו לסביבות PowerShell מותאמות אישית.
      אתה כנראה לא ייתקל זה לעתים קרובות, אבל כאשר אתה עושה את זה יכול לעשות ריצה ופתרון בעיות סקריפטים שלך קצת מתסכל. למרבה המזל, אנחנו יכולים לעקוף את זה בלי לעשות שום שינויים קבועים גם כן.

    שלב 1: לחץ פעמיים כדי להפעיל.

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

    אז אנחנו לא צריכים לכתוב מחדש את קובץ אצווה עבור כל סקריפט, או בכל פעם שאנחנו מעבירים סקריפט מסביב, זה הולך לעשות שימוש במשתנה התייחסות עצמית לבנות את נתיב הקובץ עבור סקריפט PowerShell. כדי לבצע את העבודה, קובץ האצווה יצטרך להיות ממוקם באותה תיקיה כמו script PowerShell שלך ויש להם את אותו שם קובץ. אז אם התסריט PowerShell שלך נקרא "MyScript.ps1", אתה רוצה שם הקובץ אצווה שלך "MyScript.bat" ולוודא שזה באותה תיקייה. לאחר מכן, שים את השורות האלה בתסריט אצווה:

    @ECHO OFF PowerShell.exe -Command "& '% ~ dpn0.ps1' 'PAUSE

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

    @ OFFO OFF כיבוי הפקודה מהדהדת. זה פשוט שומר פקודות אחרות שלך מלהופיע על המסך כאשר קובץ אצווה פועל. קו זה עצמו מוסתר על ידי שימוש בסמל (@) לפניו.

    PowerShell.exe -Command "& '% ~ dpn0.ps1'" למעשה מפעיל את הסקריפט PowerShell. PowerShell.exe יכול כמובן להיקרא מכל חלון CMD או קובץ אצווה להשיק PowerShell לקונסולה חשופה כמו הרגיל. ניתן גם להשתמש בו להפעלת פקודות ישירות מקובץ אצווה, על ידי הכללת הפרמטר -Command והארגומנטים המתאימים. האופן שבו הוא משמש למקד לקובץ .PS1 שלנו הוא עם המשתנה% ~ dpn0. הפעל מקובץ אצווה,% ~ dpn0 מעריך את אות הכונן, נתיב התיקיה ושם הקובץ (ללא הרחבה) של קובץ האצווה. מאחר שקובץ האצווה וסקריפט PowerShell יהיו באותה תיקיה ויש להם אותו שם,% ~ dpn0.ps1 יתורגם לנתיב הקובץ המלא של הסקריפט PowerShell.

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

    אז, קובץ אצווה בסיסי מוגדר. למטרות הדגמה, קובץ זה נשמר כ- "D: \ Script Lab \ MyScript.bat" ויש "MyScript.ps1" באותה תיקייה. בוא נראה מה קורה כאשר אנו לוחצים פעמיים על MyScript.bat.

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

    1. כותרת החלון מראה שתצורת האצווה השיקה בהצלחה את PowerShell.
    2. השורה הראשונה של הפלט מראה שפרופיל PowerShell מותאם לשימוש. זוהי בעיה פוטנציאלית # 4, המפורטות לעיל.
    3. הודעת השגיאה מדגימה את הגבלות ExecutionPolicy בתוקף. זו הבעיה שלנו # 2.
    4. החלק המסומן בקו תחתון של הודעת השגיאה (שנעשה באופן מקורי על-ידי פלט השגיאה של PowerShell) מראה את סקריפט האצווה במיקוד נכון של סקריפט PowerShell המיועד (D: \ Script Lab \ MyScript.ps1). אז אנחנו לפחות יודעים כי הרבה עובד כראוי.

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

    כתוב פלט 'פרופיל PowerShell מותאם אישית למעשה!'

    ExecutionPolicy על מערכת הבדיקה כאן מוגדר RemoteSigned. הדבר מאפשר ביצוע של סקריפטים שנוצרו באופן מקומי (כגון סקריפט הפרופיל), תוך חסימת סקריפטים ממקורות חיצוניים, אלא אם הם חתומים על ידי רשות מהימנה. למטרות הדגמה, נעשה שימוש בפקודה הבאה כדי לסמן את MyScript.ps1 כמקור חיצוני:

    Add-Content -Path 'D: \ Script Lab \ MyScript.ps1' -שיעור '' [ZoneTransfer] 'nZoneId = 3' -Stream 'Zone.Identifier'

    זה קובע את זרם הנתונים הזרים של Zone.Identifier ב- MyScript.ps1, כך ש- Windows יחשוב שהקובץ הגיע מהאינטרנט. זה יכול להיות הפוך בקלות עם הפקודה הבאה:

    Clear-Content -Path 'D: \ Script Lab \ MyScript.ps1' -Stream 'Zone.Identifier'

    שלב 2: התמצאות ExecutionPolicy.

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

    PowerShell.exe -ExecutionPolicy עקיפת -הסדר '&' '~ dpn0.ps1' '

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

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

    (). () [Security.Principal.WindowsBuiltInRole] "מנהל")) (כתיבת פלט '' מנהל מערכת ') אחר Write-Output 'Runing Limited!' השהה

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

    שלב 3: קבלת גישה למנהל המערכת.

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

    למרבה הצער, אין דרך להפעיל UAC לגובה מתוך קובץ אצווה או הפעלה CMD. עם זאת, PowerShell מאפשרת לנו לעשות זאת עם Start-Process. כאשר משתמשים ב- "RunAs Verb" בארגומנטים שלה, Start-Process ינסה להפעיל יישום עם הרשאות מנהל. אם הפעלת PowerShell אינה מורמת כבר, פעולה זו תפעיל הנחיה של UAC. כדי להשתמש בו מתוך קובץ האצווה להפעלת הסקריפט שלנו, אנו בסופו של דבר להפיץ שני תהליכים PowerShell - אחד לירות את Start-Process ועוד, שהושק על ידי Start-Process, כדי להפעיל את התסריט. השורה השנייה של קובץ האצווה צריכה להשתנות כך:

    PowerShell.exe -Command "& Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy עקיפת הקובץ" "% ~ dpn0.ps1" "-Verb RunAs"

    כאשר קובץ האצווה מופעל, השורה הראשונה של הפלט שנראה מהסקריפט של PowerShell. לאחר מכן, תוצג בקשת UAC כאשר Start-Process מנסה להפעיל את MyScript.ps1.

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

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

    שלב 4: התמצאות בפרופילי PowerShell מותאמים אישית.

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

    PowerShell.exe -NoProfile-Commommand "& Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy עקיפת הקובץ" "% ~ dpn0.ps1" "-Verb RunAs"

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

    אם אינך זקוק לזכויות מנהל מערכת בסקריפט PowerShell שלך, ואתה דילג על שלב 3, באפשרותך לבצע את המופע השני של PowerShell והשורה השנייה של קובץ האצווה שלך אמורה להיראות כך:

    PowerShell.exe -NoProfile -ExecutionPolicy עקיפת- Commommand & '' ~ dpn0.ps1 ''

    הפלט ייראה כך:

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

    הושלמו קבצי אצווה.

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

    ללא גישה למנהל המערכת:

    @ECHO OFF PowerShell.exe -NoProfile -ExecutionPolicy עוקף -הסכם & "'~ dpn0.ps1' 'PAUSE

    עם גישה למנהל המערכת:

    @ECHO OFF PowerShell.exe -NoProfile-Commommand "& Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy עקיפת הקובץ" "% ~ dpn0.ps1" "-Verb RunAs" PAUSE

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


    הפניות:

    • הפעלת סקריפטים של PowerShell מקובץ אצווה - בלוג התכנות של דניאל שרדר
    • בדיקת הרשאות מנהל ב- PowerShell - היי, Scripting Guy! בלוג