9Sep

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

click fraud protection

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

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

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

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

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

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

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

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

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

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

PowerShell.exe -Sommand "&'% ~ 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' -Value '[ZoneTransfer] `nZoneId = 3"Stream 'Zone. Identifier'

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

נקה תוכן, נתיב 'D: \ סקריפט Lab \ MyScript.ps1' -Stream 'Zone. Identifier'

שלב 2: להסתובב ExecutionPolicy.

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

PowerShell.exe -ExecutionPolicy לעקוף-Commommand "&" ~ dpn0.ps1 '"

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

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

אם( ([Security. Principal. WindowsPrincipal] [Security. Principal. WindowsIdentity]: : GetCurrent() ). ההודעה( ISRLole)( [Security. Principal. WindowsBuiltInRole] "Administrator"))( כתיבת פלט '' מנהל מערכת '!}} אחר{ כתיבת פלט' הפעלה מוגבלת! '} השהה

תוכלו גם לשים לב שיש עכשיו שני"השהה" של פעולות בסקריפט פלט - אחד מתוך סקריפט 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" "' -VerbRunAs} "

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

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

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

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

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

PowerShell.exe -NoProfile-Commommand "&{ Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy עקיפת -File"% ~ dpn0.ps1 "" '-Verb RunAs} "

הוספת הפרמטר -NoProfile לשני המופעים של PowerShell שהושקעו על-ידי ה- script, פירושה שתסריט הפרופיל של המשתמש יהיה מופרד לחלוטין בשני השלבים והסקריפט 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 מקובץ אצווה - בלוג תכנות של דניאל Schroder
  • בדיקת הרשאות מנהל ב- PowerShell - היי, Scripting גיא!בלוג