Αρχική σελίδα » πως να » Πώς να χρησιμοποιήσετε ένα αρχείο δέσμης για να κάνετε τα scripts PowerShell πιο εύκολο να εκτελεστούν

    Πώς να χρησιμοποιήσετε ένα αρχείο δέσμης για να κάνετε τα scripts PowerShell πιο εύκολο να εκτελεστούν

    Για διάφορους λόγους, τα σενάρια PowerShell που σχετίζονται κυρίως με την ασφάλεια δεν είναι τόσο εύκολα φορητά και μπορούν να χρησιμοποιηθούν ως δέσμες ενεργειών δέσμης. Ωστόσο, μπορούμε να συνδέσουμε ένα σενάριο παρτίδας με τα σενάρια PowerShell για να επιλύσουμε αυτά τα θέματα. Εδώ θα σας παρουσιάσουμε μερικούς από αυτούς τους προβληματικούς τομείς και πώς να φτιάξετε ένα δέσμη ενεργειών δέσμης για να τα περιηγηθείτε.

    Γιατί δεν μπορώ να αντιγράψω το αρχείο .PS1 μου σε άλλο υπολογιστή και να το εκτελέσω?

    Εάν το σύστημα προορισμού δεν έχει ρυθμιστεί εκ των προτέρων για να επιτρέψει την εκτέλεση αυθαίρετων σεναρίων, με τα απαιτούμενα προνόμια και με τη χρήση των σωστών ρυθμίσεων, πιθανότατα θα αντιμετωπίσετε κάποια προβλήματα όταν προσπαθείτε να το κάνετε αυτό.

    1. Το PowerShell δεν συσχετίζεται με την επέκταση αρχείου .PS1 από προεπιλογή.
      Το έφερα αρχικά στη σειρά PowerShell Geek School. Τα Windows συσχετίζουν τα αρχεία .PS1 με το Σημειωματάριο από προεπιλογή, αντί να τα στέλνουν στον διερμηνέα εντολών PowerShell. Αυτό γίνεται για να αποφευχθεί τυχαία εκτέλεση κακόβουλων σεναρίων απλά κάνοντας διπλό κλικ σε αυτά. Υπάρχουν τρόποι που μπορείτε να αλλάξετε αυτήν τη συμπεριφορά, αλλά πιθανώς δεν είναι κάτι που θέλετε να κάνετε σε κάθε υπολογιστή που μεταφέρετε τα σενάρια γύρω σας - ειδικά αν ορισμένοι από αυτούς τους υπολογιστές δεν είναι δικοί σας.
    2. Το PowerShell δεν επιτρέπει την εκτέλεση εξωτερικής δέσμης ενεργειών από προεπιλογή.
      Η ρύθμιση ExecutionPolicy στο PowerShell εμποδίζει την εκτέλεση εξωτερικών σεναρίων από προεπιλογή σε όλες τις εκδόσεις των Windows. Σε ορισμένες εκδόσεις των Windows, η προεπιλογή δεν επιτρέπει καθόλου εκτέλεση δέσμης ενεργειών. Σας παρουσιάσαμε πώς να αλλάξετε αυτήν τη ρύθμιση στην ενότητα Πώς να επιτρέψετε την εκτέλεση των ενεργειών PowerShell στα Windows 7. Ωστόσο, αυτό είναι κάτι που δεν θέλετε να κάνετε σε οποιονδήποτε υπολογιστή.
    3. Ορισμένα σενάρια PowerShell δεν θα λειτουργήσουν χωρίς δικαιώματα διαχειριστή.
      Ακόμα και να τρέχετε με ένα λογαριασμό διαχειριστή, εξακολουθείτε να χρειαστεί να περάσετε από τον έλεγχο λογαριασμού χρήστη (UAC) για να εκτελέσετε ορισμένες ενέργειες. Δεν θέλουμε να το απενεργοποιήσουμε, αλλά είναι ακόμα ωραίο όταν μπορούμε να το κάνουμε λίγο πιο εύκολο.
    4. Ορισμένοι χρήστες ενδέχεται να έχουν προσαρμοσμένα περιβάλλοντα PowerShell.
      Πιθανότατα δεν θα τρέξετε σε αυτό συχνά, αλλά όταν το κάνετε μπορεί να κάνει το τρέξιμο και την αντιμετώπιση προβλημάτων των σεναρίων σας λίγο απογοητευτικό. Ευτυχώς, μπορούμε να το πετύχουμε χωρίς να κάνουμε μόνιμες αλλαγές.

    Βήμα 1: Κάντε διπλό κλικ για εκτέλεση.

    Ας αρχίσουμε με την αντιμετώπιση του πρώτου προβλήματος - συσχετίσεων αρχείων .PS1. Δεν μπορείτε να κάνετε διπλό κλικ για να εκτελέσετε αρχεία .PS1, αλλά μπορείτε να εκτελέσετε ένα αρχείο .BAT με αυτόν τον τρόπο. Έτσι, θα γράψουμε ένα αρχείο δέσμης για να καλέσουμε τη δέσμη ενεργειών PowerShell από τη γραμμή εντολών για εμάς.

    Επομένως, δεν χρειάζεται να ξαναγράψουμε το αρχείο δέσμης για κάθε δέσμη ενεργειών ή κάθε φορά που μεταφέρουμε ένα σενάριο, θα χρησιμοποιήσει μια μεταβλητή αυτοαναφοράς για να δημιουργήσει τη διαδρομή αρχείου για το σενάριο PowerShell. Για να γίνει αυτό το έργο, το αρχείο δέσμης θα πρέπει να τοποθετηθεί στον ίδιο φάκελο με τη δέσμη ενεργειών PowerShell και να έχει το ίδιο όνομα αρχείου. Έτσι, εάν το script σας PowerShell ονομάζεται "MyScript.ps1", θα θελήσετε να ονομάσετε το αρχείο δέσμης "MyScript.bat" και βεβαιωθείτε ότι είναι στον ίδιο φάκελο. Στη συνέχεια, βάλτε αυτές τις γραμμές στο δέσμη δέσμης ενεργειών:

    @CHO OFF PowerShell.exe -Μηχανισμός "&"% ~ dpn0.ps1 '"PAUSE

    Αν δεν υπήρχαν οι άλλοι περιορισμοί ασφάλειας στη θέση του, αυτό θα ήταν πραγματικά το μόνο που χρειάζεται για να εκτελέσετε μια δέσμη ενεργειών PowerShell από ένα αρχείο δέσμης. Στην πραγματικότητα, η πρώτη και η τελευταία γραμμή είναι κυρίως θέμα προτίμησης - είναι η δεύτερη γραμμή που κάνει πραγματικά το έργο. Εδώ είναι η κατανομή:

    @ OFF OFF απενεργοποιεί την εντολή echoing. Αυτό ακριβώς κρατά τις άλλες εντολές σας να εμφανίζονται στην οθόνη όταν τρέχει το αρχείο δέσμης. Αυτή η γραμμή κρυμμένη από τη χρήση του συμβόλου στο (@) μπροστά της.

    PowerShell.exe -Command "&"% ~ dpn0.ps1 "" τρέχει πραγματικά το σενάριο PowerShell. Το PowerShell.exe μπορεί φυσικά να καλείται από οποιοδήποτε παράθυρο CMD ή αρχείο δέσμης για να εκκινήσει το PowerShell σε μια γυμνή κονσόλα όπως συνήθως. Μπορείτε επίσης να το χρησιμοποιήσετε για την εκτέλεση εντολών απευθείας από ένα αρχείο δέσμης, συμπεριλαμβάνοντας την παράμετρο -Command και τα κατάλληλα επιχειρήματα. Ο τρόπος με τον οποίο αυτή χρησιμοποιείται για να στοχεύσετε το αρχείο .PS1 είναι με την ειδική μεταβλητή% ~ dpn0. Εκτελέστε από ένα αρχείο δέσμης, το% ~ dpn0 αξιολογεί το γράμμα της μονάδας δίσκου, τη διαδρομή φακέλου και το όνομα αρχείου (χωρίς επέκταση) του αρχείου δέσμης. Επειδή το αρχείο δέσμης και η δέσμη ενεργειών PowerShell θα βρίσκονται στον ίδιο φάκελο και θα έχουν το ίδιο όνομα, το% ~ dpn0.ps1 θα μεταφραστεί στη διαδρομή πλήρους αρχείου του script PowerShell.

    ΠΑΥΣΗ απλά παύει την εκτέλεση της παρτίδας και περιμένει την είσοδο του χρήστη. Αυτό είναι γενικά χρήσιμο να υπάρχει στο τέλος των αρχείων δέσμης, έτσι ώστε να έχετε την ευκαιρία να αναθεωρήσετε οποιαδήποτε έξοδο εντολών πριν εξαφανιστεί το παράθυρο. Καθώς δοκιμάζουμε κάθε βήμα, η χρησιμότητα αυτού θα γίνει πιο προφανής.

    Έτσι, το βασικό αρχείο δέσμης έχει ρυθμιστεί. Για σκοπούς επίδειξης, αυτό το αρχείο αποθηκεύεται ως "D: \ Script Lab \ MyScript.bat" και υπάρχει ένας "MyScript.ps1" στον ίδιο φάκελο. Ας δούμε τι συμβαίνει όταν κάνετε διπλό κλικ στο MyScript.bat.

    Προφανώς, το σενάριο PowerShell δεν εκτελέστηκε, αλλά αυτό είναι αναμενόμενο - έχουμε σκεφτεί μόνο το πρώτο από τα τέσσερα μας προβλήματα. Ωστόσο, υπάρχουν κάποια σημαντικά κομμάτια που παρουσιάστηκαν εδώ:

    1. Ο τίτλος παραθύρου δείχνει ότι η δέσμη ενεργειών δέσμης ενεργειών ξεκίνησε με επιτυχία το PowerShell.
    2. Η πρώτη γραμμή εξόδου δείχνει ότι χρησιμοποιείται ένα προσαρμοσμένο προφίλ PowerShell. Αυτό είναι πιθανό πρόβλημα # 4, που παρατίθεται παραπάνω.
    3. Το μήνυμα σφάλματος καταδεικνύει τους περιορισμούς εκτέλεσης πολιτικής που ισχύουν. Αυτό είναι το πρόβλημά μας # 2.
    4. Το υπογραμμισμένο τμήμα του μηνύματος σφάλματος (το οποίο γίνεται με εγγενή έξοδο σφάλματος του PowerShell) δείχνει ότι η δέσμη δέσμης ενεργειών στόχευσε σωστά το σχεδιαζόμενο σενάριο PowerShell (D: \ Script Lab \ MyScript.ps1). Έτσι τουλάχιστον γνωρίζουμε ότι πολλά λειτουργούν σωστά.

    Το προφίλ, στην περίπτωση αυτή, είναι ένα απλό σενάριο γραμμής που χρησιμοποιείται για αυτή την επίδειξη για να παράγει αποτελέσματα όταν το προφίλ είναι ενεργό. Μπορείτε να προσαρμόσετε το δικό σας προφίλ PowerShell για να το κάνετε αυτό, αν θέλετε να δοκιμάσετε μόνοι σας αυτές τις δέσμες ενεργειών. Απλά προσθέστε την ακόλουθη γραμμή στο προφίλ σας:

    Write-Output 'Προσαρμοσμένο προφίλ PowerShell σε ισχύ!'

    Το ExecutionPolicy στο δοκιμαστικό σύστημα εδώ έχει οριστεί ως RemoteSigned. Αυτό επιτρέπει την εκτέλεση σεναρίων που δημιουργήθηκαν τοπικά (όπως το σενάριο προφίλ), ενώ μπλοκάρονται δέσμες ενεργειών από εξωτερικές πηγές, εκτός εάν υπογράφονται από μια αξιόπιστη αρχή. Για λόγους επίδειξης, η ακόλουθη εντολή χρησιμοποιήθηκε για να επισημάνει ότι το MyScript.ps1 προέρχεται από εξωτερική πηγή:

    Add-Content -Path 'D: \ Εργαστήριο Script \ MyScript.ps1' -Value "[ΖώνηTransfer] 'nZoneId = 3" -Στομέας' Zone.Identifier '

    Αυτό θέτει την εναλλακτική ροή δεδομένων Zone.Identifier στο MyScript.ps1 έτσι ώστε τα Windows να πιστεύουν ότι το αρχείο προέρχεται από το Internet. Μπορεί εύκολα να αντιστραφεί με την ακόλουθη εντολή:

    Clear-Content -Διαδρομή "D: \ Εργαστήριο Script \ MyScript.ps1 '-Stream' Zone.Identifier '

    Βήμα 2: Γνωρίστε την Εκτελεστική Πολιτική.

    Η περιήγηση στη ρύθμιση ExecutionPolicy, από το CMD ή από ένα σενάριο δέσμης, είναι πραγματικά εύκολη. Απλά τροποποιούμε τη δεύτερη γραμμή της δέσμης ενεργειών για να προσθέσουμε μια ακόμα παράμετρο στην εντολή PowerShell.exe.

    PowerShell.exe-ΕκτέλεσηΠροστασία πολιτικής -Κάντια "&"% ~ dpn0.ps1 '"

    Η παράμετρος -ExecutionPolicy μπορεί να χρησιμοποιηθεί για να τροποποιήσει το ExecutionPolicy που χρησιμοποιείται όταν δημιουργείτε μια νέα συνεδρία PowerShell. Αυτό δεν θα συνεχιστεί πέρα ​​από αυτή τη σύνοδο, οπότε μπορούμε να τρέξουμε το PowerShell όπως αυτό όποτε χρειαζόμαστε χωρίς να εξασθενήσουμε τη γενική στάση ασφαλείας του συστήματος. Τώρα που έχουμε το διορθώσει αυτό, ας το κάνουμε άλλο:

    Τώρα που το σενάριο έχει εκτελεστεί σωστά, μπορούμε να δούμε τι πραγματικά κάνει. Μας ενημερώνει ότι εκτελούμε το σενάριο ως περιορισμένος χρήστης. Το σενάριο εκτελείται στην πραγματικότητα από έναν λογαριασμό με δικαιώματα διαχειριστή, αλλά ο έλεγχος λογαριασμού χρηστών καθυστερεί. Αν και λεπτομέρειες για το πώς ελέγχει το σενάριο για πρόσβαση διαχειριστή είναι πέρα ​​από το πεδίο εφαρμογής αυτού του άρθρου, εδώ είναι ο κώδικας που χρησιμοποιείται για επίδειξη:

    εάν [([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()) IsInRole ([Security.Principal.WindowsBuiltInRole] "Administrator")) Γράφημα-Έξοδος 'Εκτέλεση ως Διαχειριστής! Write-Output 'Running Limited!' Παύση

    Θα παρατηρήσετε επίσης ότι τώρα υπάρχουν δύο λειτουργίες "Pause" στην έξοδο δέσμης ενεργειών - μία από τη δέσμη ενεργειών PowerShell και μία από το αρχείο δέσμης. Ο λόγος για αυτό θα είναι πιο εμφανής στο επόμενο βήμα.

    Βήμα 3: Λήψη πρόσβασης διαχειριστή.

    Εάν το σενάριό σας δεν εκτελεί εντολές που απαιτούν ανύψωση και είστε σίγουροι ότι δεν θα πρέπει να ανησυχείτε για τα προσωπικά προφίλ κάποιου που παρεμποδίζουν την πρόοδο, μπορείτε να παραλείψετε το υπόλοιπο. Εάν εκτελείτε ορισμένα cmdlet σε επίπεδο Administrator, θα χρειαστείτε αυτό το κομμάτι.

    Δυστυχώς, δεν υπάρχει τρόπος για να ενεργοποιήσετε το UAC για ανύψωση από ένα αρχείο δέσμης ή μια συνεδρία CMD. Ωστόσο, το PowerShell μας επιτρέπει να το κάνουμε αυτό με τη διαδικασία "Έναρξη". Όταν χρησιμοποιείται με "-Verb RunAs" στα επιχειρήματά της, το Start-Process θα προσπαθήσει να ξεκινήσει μια εφαρμογή με δικαιώματα διαχειριστή. Εάν η περίοδος λειτουργίας PowerShell δεν είναι ήδη αυξημένη, αυτό θα ενεργοποιήσει μια προτροπή UAC. Για να το χρησιμοποιήσετε από το αρχείο παρτίδας για την εκκίνηση του σεναρίου μας, θα καταλήξουμε να δημιουργήσουμε δύο διαδικασίες PowerShell - μία για να εκτοξεύσουμε την Start-Process και μία άλλη, που ξεκίνησε από το Start-Process, για να εκτελέσει το σενάριο. Η δεύτερη γραμμή του αρχείου δέσμης πρέπει να αλλάξει σε αυτό:

    PowerShell.exe -Command "& Έναρξη-Διαδικασία PowerShell.exe -ArgumentList'-ΕκτέλεσηPolicy Bypass -File" "% ~ dpn0.ps1" "-Verb RunAs"

    Όταν εκτελείται το αρχείο παρτίδας, η πρώτη γραμμή εξόδου που θα δούμε είναι από το σενάριο προφίλ PowerShell. Στη συνέχεια, θα εμφανιστεί μια ερώτηση UAC όταν η εφαρμογή Start-Process προσπαθεί να εκκινήσει το MyScript.ps1.

    Αφού κάνετε κλικ στην εντολή UAC, θα δημιουργηθεί μια νέα παράσταση PowerShell. Επειδή πρόκειται για νέα περίπτωση, βέβαια, θα δούμε και πάλι την ειδοποίηση δέσμης ενεργειών προφίλ. Στη συνέχεια, το MyScript.ps1 τρέχει και βλέπουμε ότι είμαστε πράγματι σε μια ανυψωμένη συνεδρία.

    Και υπάρχει ο λόγος για τον οποίο έχουμε και δύο παύσεις εδώ. Εάν όχι για το σενάριο PowerShell, δεν θα δούμε ποτέ την έξοδο του σεναρίου - το παράθυρο PowerShell θα εμφανιστεί και θα εξαφανιστεί μόλις ολοκληρωθεί η εκτέλεση του σεναρίου. Και χωρίς την παύση στο αρχείο παρτίδας, δεν θα είχαμε τη δυνατότητα να δούμε αν υπήρξαν σφάλματα στην εκκίνηση του PowerShell στην πρώτη θέση.

    Βήμα 4: Γνωρίστε προσαρμοσμένα προφίλ PowerShell.

    Ας ξεφορτωθούμε τώρα αυτή τη δυσάρεστη ειδοποίηση προφίλ προσαρμοσμένου προφίλ, εμείς; Εδώ, δεν είναι καθόλου ενοχλητικό, αλλά αν το προφίλ PowerShell ενός χρήστη αλλάξει προεπιλεγμένες ρυθμίσεις, μεταβλητές ή λειτουργίες με τρόπους που ίσως δεν έχετε προβλέψει με το σενάριό σας, μπορεί να είναι πραγματικά ενοχλητικό. Είναι πολύ πιο εύκολο να εκτελέσετε το σενάριό σας χωρίς το προφίλ εξ ολοκλήρου, ώστε να μην χρειάζεται να ανησυχείτε για αυτό. Για να γίνει αυτό, πρέπει να αλλάξουμε τη δεύτερη γραμμή του αρχείου παρτίδας μια φορά:

    PowerShell.exe -NoProfile -Κάντε κλικ "& Έναρξη διαδικασίας PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "-Verb RunAs"

    Η προσθήκη της παράμετρος -NoProfile και στις δύο περιπτώσεις του PowerShell που ξεκινούν από το σενάριο σημαίνει ότι το σενάριο προφίλ του χρήστη θα ξεπεραστεί εντελώς και στα δύο βήματα και το script PowerShell θα τρέξει σε ένα αρκετά προβλέψιμο, προεπιλεγμένο περιβάλλον. Εδώ, μπορείτε να δείτε ότι δεν υπάρχει καμία ειδοποίηση προσαρμοσμένου προφίλ σε κανένα από τα γεννημένα κοχύλια.

    Εάν δεν χρειάζεστε δικαιώματα διαχειριστή στη δέσμη ενεργειών PowerShell και έχετε παραλείψει το βήμα 3, μπορείτε να το κάνετε χωρίς τη δεύτερη παρουσία PowerShell και η δεύτερη γραμμή του αρχείου δέσμης πρέπει να είναι όπως αυτή:

    PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "&"% ~ dpn0.ps1 '"

    Η έξοδος θα φαίνεται ως εξής:

    (Φυσικά, για σενάρια χωρίς διαχειριστή, θα μπορούσατε να κάνετε χωρίς παύση λήξης σεναρίου PowerShell σε αυτό το σημείο πάρα πολύ, αφού όλα καταγράφονται στο ίδιο παράθυρο της κονσόλας και θα κρατηθούν εκεί από την παύση στο τέλος το αρχείο παρτίδας ούτως ή άλλως.)

    Ολοκληρώθηκαν αρχεία δέσμης.

    Ανάλογα με το αν χρειάζεστε ή όχι δικαιώματα διαχειριστή για το PowerShell script (και πραγματικά δεν πρέπει να τους ζητάτε εάν δεν το κάνετε), το τελικό αρχείο δέσμης θα πρέπει να μοιάζει με ένα από τα δύο παρακάτω.

    Χωρίς πρόσβαση διαχειριστή:

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

    Με πρόσβαση διαχειριστή:

    @CHO OFF PowerShell.exe -NoProfile -Κάντε κλικ "& Έναρξη-Διαδικασία PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "-Verb RunAs" PAUSE

    Θυμηθείτε να βάλετε το αρχείο παρτίδας στον ίδιο φάκελο με το σενάριο PowerShell για το οποίο θέλετε να το χρησιμοποιήσετε και να του δώσετε το ίδιο όνομα. Στη συνέχεια, ανεξάρτητα από το σύστημα στο οποίο λαμβάνετε αυτά τα αρχεία, μπορείτε να εκτελέσετε το σενάριο PowerShell χωρίς να χρειαστεί να μετακομίσετε με οποιαδήποτε από τις ρυθμίσεις ασφαλείας στο σύστημα. Μπορείτε σίγουρα να κάνετε αυτές τις αλλαγές με το χέρι κάθε φορά, αλλά αυτό σας εξοικονομεί αυτό το πρόβλημα και δεν θα πρέπει να ανησυχείτε για την επιστροφή των αλλαγών αργότερα.


    Βιβλιογραφικές αναφορές:

    • Εκτέλεση σεναρίων PowerShell από ένα αρχείο δέσμης - Blog Προγραμματισμού του Daniel Schroeder
    • Έλεγχος για δικαιώματα διαχειριστή στο PowerShell - Hey, Scripting Guy! Blog