9Sep
Για διάφορους λόγους, τα σενάρια PowerShell που σχετίζονται κυρίως με την ασφάλεια δεν είναι τόσο εύκολα φορητά και μπορούν να χρησιμοποιηθούν ως δέσμες ενεργειών δέσμης.Ωστόσο, μπορούμε να συνδέσουμε δέσμη ενεργειών δέσμης ενεργειών με τα σενάρια PowerShell για να επιλύσουμε αυτά τα ζητήματα.Εδώ, θα σας παρουσιάσουμε μερικούς από αυτούς τους προβληματικούς τομείς και πώς να φτιάξετε ένα δέσμη ενεργειών δέσμης για να τα ξεπεράσετε.
Γιατί δεν μπορώ να αντιγράψω το αρχείο. PS1 μου σε άλλο υπολογιστή και να το εκτελέσω;
Αν το σύστημα προορισμού δεν έχει ρυθμιστεί εκ των προτέρων για να επιτρέψει την εκτέλεση αυθαίρετων σεναρίων, με τα απαιτούμενα προνόμια και με τη χρήση των σωστών ρυθμίσεων, πιθανότατα θα αντιμετωπίσετε κάποια προβλήματα όταν προσπαθήσετε να το κάνετε αυτό.
- Το PowerShell δεν συσχετίζεται με την επέκταση αρχείου. PS1 από προεπιλογή.
Το έφερα αρχικά στη σειρά PowerShell Geek School.Τα Windows συσχετίζουν αρχεία. PS1 με το Σημειωματάριο από προεπιλογή, αντί να τα στέλνουν στον διερμηνέα εντολών PowerShell.Αυτό γίνεται για να αποφευχθεί τυχαία εκτέλεση κακόβουλων σεναρίων απλά κάνοντας διπλό κλικ σε αυτά.Υπάρχουν τρόποι για να αλλάξετε αυτήν τη συμπεριφορά, αλλά πιθανώς δεν είναι κάτι που θέλετε να κάνετε σε κάθε υπολογιστή στον οποίο μεταφέρετε τα σενάρια σας - ειδικά αν ορισμένοι από αυτούς τους υπολογιστές δεν είναι δικοί σας.Το - PowerShell δεν επιτρέπει την εκτέλεση εξωτερικής δέσμης ενεργειών από προεπιλογή.
Η ρύθμιση ExecutionPolicy στο PowerShell εμποδίζει την εκτέλεση εξωτερικών σεναρίων από προεπιλογή σε όλες τις εκδόσεις των Windows.Σε ορισμένες εκδόσεις των Windows, η προεπιλογή δεν επιτρέπει καθόλου εκτέλεση δέσμης ενεργειών.Σας παρουσιάσαμε πώς να αλλάξετε αυτήν τη ρύθμιση στην ενότητα Πώς να επιτρέψετε την εκτέλεση των ενεργειών PowerShell στα Windows 7. Ωστόσο, αυτό είναι κάτι που δεν θέλετε να κάνετε σε οποιονδήποτε υπολογιστή. - Ορισμένα σενάρια PowerShell δεν θα λειτουργήσουν χωρίς δικαιώματα διαχειριστή.
Ακόμη και η εκτέλεση με λογαριασμό σε επίπεδο διαχειριστή, εξακολουθείτε να χρειαστεί να περάσετε από τον έλεγχο λογαριασμού χρήστη( UAC) για να εκτελέσετε ορισμένες ενέργειες.Δεν θέλουμε να το απενεργοποιήσουμε, αλλά είναι ακόμα ωραίο όταν μπορούμε να το κάνουμε λίγο πιο εύκολο να το αντιμετωπίσουμε. - Μερικοί χρήστες ενδέχεται να έχουν προσαρμοσμένα περιβάλλοντα PowerShell.
Πιθανότατα δεν θα τρέξετε σε αυτό συχνά, αλλά όταν το κάνετε μπορεί να κάνει το τρέξιμο και την αντιμετώπιση προβλημάτων των σεναρίων σας λίγο απογοητευτικό.Ευτυχώς, μπορούμε να το πετύχουμε χωρίς να κάνουμε μόνιμες αλλαγές.
Βήμα 1: Κάντε διπλό κλικ για εκτέλεση.
Ας αρχίσουμε με την αντιμετώπιση του πρώτου προβλήματος - συσχετίσεις αρχείων. PS1.Δεν μπορείτε να κάνετε διπλό κλικ για να εκτελέσετε αρχεία. PS1, αλλά μπορείτε να εκτελέσετε ένα αρχείο. BAT με αυτόν τον τρόπο.Έτσι, θα γράψουμε ένα αρχείο δέσμης για να καλέσουμε τη δέσμη ενεργειών PowerShell από τη γραμμή εντολών για εμάς.
Δεν χρειάζεται να ξαναγράψουμε το αρχείο δέσμης για κάθε δέσμη ενεργειών ή κάθε φορά που μετακινούμε ένα σενάριο, θα χρησιμοποιήσει μια μεταβλητή αυτοαναφοράς για να δημιουργήσει τη διαδρομή του αρχείου για το σενάριο PowerShell.Για να γίνει αυτό το έργο, το αρχείο δέσμης θα πρέπει να τοποθετηθεί στον ίδιο φάκελο με το σενάριο PowerShell και να έχει το ίδιο όνομα αρχείου.Έτσι, αν το script σας PowerShell ονομάζεται "MyScript.ps1", θα θελήσετε να ονομάσετε το αρχείο δέσμης "MyScript.bat" και βεβαιωθείτε ότι είναι στον ίδιο φάκελο.Στη συνέχεια, βάλτε αυτές τις γραμμές στο δέσμη δέσμης ενεργειών:
@ECHO OFF PowerShell.exe -Command "& '% ~ dpn0.ps1'" PAUSEΑν δεν υπήρχαν οι υπόλοιποι περιορισμοί ασφάλειας στη θέση του, αυτό θα ήταν πραγματικάχρειάζεται για να εκτελέσετε μια δέσμη ενεργειών PowerShell από ένα αρχείο δέσμης.Στην πραγματικότητα, η πρώτη και η τελευταία γραμμή είναι κυρίως θέμα προτίμησης - είναι η δεύτερη γραμμή που κάνει πραγματικά την δουλειά.Ακολουθεί η ανάλυση:
@ECHO OFF απενεργοποιεί την εντολή echoing.Αυτό ακριβώς κρατά τις άλλες εντολές σας να εμφανίζονται στην οθόνη όταν τρέχει το αρχείο δέσμης.Αυτή η γραμμή κρύβεται από τη χρήση του συμβόλου στο( @) μπροστά της.
PowerShell.exe -Command "&'% ~ Dpn0.ps1' "Το τρέχει πραγματικά το σενάριο PowerShell.Το PowerShell.exe μπορεί φυσικά να καλείται από οποιοδήποτε παράθυρο CMD ή αρχείο δέσμης για να εκκινήσει το PowerShell σε μια γυμνή κονσόλα όπως συνήθως.Μπορείτε επίσης να το χρησιμοποιήσετε για την εκτέλεση εντολών απευθείας από ένα αρχείο δέσμης, συμπεριλαμβάνοντας την παράμετρο -Command και τα κατάλληλα επιχειρήματα.Ο τρόπος με τον οποίο χρησιμοποιείται αυτό το αρχείο. PS1 είναι με την ειδική μεταβλητή% ~ dpn0.Εκτελέστε από ένα αρχείο δέσμης, το% ~ dpn0 αξιολογεί το γράμμα της μονάδας δίσκου, τη διαδρομή φακέλου και το όνομα αρχείου( χωρίς επέκταση) του αρχείου δέσμης.Επειδή το αρχείο δέσμης και η δέσμη ενεργειών PowerShell θα βρίσκονται στον ίδιο φάκελο και θα έχουν το ίδιο όνομα, το% ~ dpn0.ps1 θα μεταφραστεί στη διαδρομή πλήρους αρχείου του script PowerShell.
PAUSE απλά διακόπτει την εκτέλεση παρτίδας και περιμένει την είσοδο του χρήστη.Αυτό είναι γενικά χρήσιμο να υπάρχει στο τέλος των αρχείων δέσμης, έτσι ώστε να έχετε την ευκαιρία να ελέγξετε οποιαδήποτε έξοδο εντολών πριν εξαφανιστεί το παράθυρο.Καθώς δοκιμάζουμε κάθε βήμα, η χρησιμότητα αυτού θα γίνει πιο προφανής.
Έτσι, το βασικό αρχείο δέσμης έχει ρυθμιστεί.Για λόγους επίδειξης, αυτό το αρχείο αποθηκεύεται ως "D: \ Script Lab \ MyScript.bat" και υπάρχει "MyScript.ps1" στον ίδιο φάκελο.Ας δούμε τι συμβαίνει όταν διπλό κλικ στο MyScript.bat.
Προφανώς το σενάριο PowerShell δεν εκτελέστηκε, αλλά αυτό αναμένεται - τελικά, έχουμε ασχοληθεί μόνο με το πρώτο από τα τέσσερα μας προβλήματα.Ωστόσο, υπάρχουν ορισμένα σημαντικά κομμάτια που παρουσιάζονται εδώ:
- Ο τίτλος παραθύρου δείχνει ότι η δέσμη ενεργειών δέσμης ενεργειών ξεκίνησε με επιτυχία το PowerShell.
- Η πρώτη γραμμή εξόδου δείχνει ότι χρησιμοποιείται ένα προσαρμοσμένο προφίλ PowerShell.Αυτό είναι πιθανό πρόβλημα # 4, που παρατίθεται παραπάνω.
- Το μήνυμα σφάλματος αποδεικνύει ότι ισχύουν οι περιορισμοί εκτέλεσης πολιτικής.Αυτό είναι το πρόβλημα μας # 2.
- Το υπογραμμισμένο τμήμα του μηνύματος σφάλματος( το οποίο γίνεται με εγγενή έξοδο σφάλματος του PowerShell) δείχνει ότι η δέσμη δέσμης ενεργειών στόχευε σωστά το σχεδιαζόμενο σενάριο PowerShell( D: \ Script Lab \ MyScript.ps1).Έτσι τουλάχιστον γνωρίζουμε ότι πολλά λειτουργούν σωστά.
Το προφίλ, στην περίπτωση αυτή, είναι ένα απλό σενάριο μιας γραμμής που χρησιμοποιείται για αυτήν την επίδειξη για να παράγει αποτελέσματα όταν το προφίλ είναι ενεργό.Μπορείτε να προσαρμόσετε το δικό σας προφίλ PowerShell για να το κάνετε αυτό, αν θέλετε να δοκιμάσετε οι ίδιοι τα σενάρια αυτά.Απλά προσθέστε την ακόλουθη γραμμή στο προφίλ σας script:
Write-Output 'Προσαρμοσμένο προφίλ PowerShell σε ισχύ!'Η ExecutionPolicy στο σύστημα δοκιμής εδώ έχει οριστεί ως RemoteSigned.Αυτό επιτρέπει την εκτέλεση σεναρίων που δημιουργήθηκαν τοπικά( όπως το σενάριο προφίλ), ενώ μπλοκάρονται δέσμες ενεργειών από εξωτερικές πηγές, εκτός εάν υπογράφονται από αξιόπιστη αρχή.Για λόγους επίδειξης, χρησιμοποιήθηκε η ακόλουθη εντολή για να επισημάνετε ότι η MyScript.ps1 προέρχεται από μια εξωτερική πηγή:
Add-Content -Path 'D: \ Lab Script \ MyScript.ps1' -Value "[ZoneTransfer] 'nZoneId = 3"Stream 'Zone. Identifier'Ορίζει την εναλλακτική ροή δεδομένων Zone. Identifier στο MyScript.ps1 έτσι ώστε τα Windows να πιστεύουν ότι το αρχείο προέρχεται από το Internet.Μπορεί να αντιστραφεί εύκολα με την ακόλουθη εντολή:
Clear-Content -Path 'D: \ Lab Script \ MyScript.ps1' -Stream 'Zone. Identifier'Βήμα 2: Γνωρίστε την ExecutionPolicy.
Η περιήγηση στη ρύθμιση ExecutionPolicy, από το CMD ή από ένα σενάριο δέσμης, είναι πραγματικά πολύ εύκολη.Απλώς τροποποιούμε τη δεύτερη γραμμή της δέσμης ενεργειών για να προσθέσουμε μια ακόμα παράμετρο στην εντολή PowerShell.exe.
PowerShell.exe -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'"Η παράμετρος -ExecutionPolicy μπορεί να χρησιμοποιηθεί για να τροποποιήσει το ExecutionPolicy που χρησιμοποιείται όταν δημιουργείτε μια νέα συνεδρία PowerShell.Αυτό δεν θα συνεχιστεί πέρα από αυτή τη σύνοδο, οπότε μπορούμε να τρέξουμε το PowerShell όπως αυτό όποτε χρειαζόμαστε χωρίς να εξασθενήσουμε τη γενική στάση ασφαλείας του συστήματος.Τώρα που έχουμε διορθώσει αυτό, ας το κάνουμε άλλο:
Τώρα που το σενάριο έχει εκτελεστεί σωστά, μπορούμε να δούμε τι πραγματικά κάνει.Μας ενημερώνει ότι εκτελούμε το σενάριο ως περιορισμένος χρήστης.Το σενάριο εκτελείται στην πραγματικότητα από έναν λογαριασμό με δικαιώματα διαχειριστή, αλλά ο έλεγχος λογαριασμού χρήστη παρακωλύει.Αν και λεπτομέρειες σχετικά με το πώς ελέγχει η δέσμη ενεργειών για πρόσβαση διαχειριστή είναι πέρα από το πεδίο εφαρμογής αυτού του άρθρου, εδώ είναι ο κώδικας που χρησιμοποιείται για επίδειξη:
if( ([Security. Principal. WindowsPrincipal] [Security. Principal. WindowsIdentity]: : GetCurrent(){ IsInRole( [Security. Principal. WindowsBuiltInRole] "Administrator")){ Write-Output 'Εκτέλεση ως διαχειριστής!'} Else{ Write-Output 'Running Limited!'} ΠαύσηΘα παρατηρήσετε επίσης ότι υπάρχουν δύοΟι λειτουργίες "Παύση" στην έξοδο δέσμης ενεργειών - μία από τη δέσμη ενεργειών PowerShell και μία από το αρχείο δέσμης.Ο λόγος για αυτό θα είναι πιο εμφανής στο επόμενο βήμα.
Βήμα 3: Λήψη πρόσβασης διαχειριστή.
Εάν το σενάριο σας δεν εκτελεί εντολές που απαιτούν ανύψωση και είστε σίγουροι ότι δεν θα χρειαστεί να ανησυχείτε για τα προσωπικά προφίλ κάποιου που παρεμβάλλονται, μπορείτε να παραλείψετε το υπόλοιπο.Εάν εκτελείτε ορισμένα cmdlet σε επίπεδο διαχειριστή, θα χρειαστείτε αυτό το κομμάτι.
Δυστυχώς, δεν υπάρχει τρόπος να ενεργοποιηθεί το UAC για ανύψωση από ένα αρχείο δέσμης ή μια συνεδρία CMD.Ωστόσο, το PowerShell μας επιτρέπει να το κάνουμε αυτό με τη διαδικασία "Έναρξη".Όταν χρησιμοποιείται με "-Verb RunAs" στα επιχειρήματά της, το Start-Process θα προσπαθήσει να ξεκινήσει μια εφαρμογή με δικαιώματα διαχειριστή.Εάν η περίοδος λειτουργίας PowerShell δεν είναι ήδη αυξημένη, αυτό θα ενεργοποιήσει μια προτροπή UAC.Για να το χρησιμοποιήσετε από το αρχείο δέσμης για την εκκίνηση του σεναρίου μας, θα καταλήξουμε να δημιουργήσουμε δύο διαδικασίες PowerShell - μία για να πυροδοτήσουμε την Start-Process και μία άλλη, που ξεκίνησε από το Start-Process, για να εκτελέσει το σενάριο.Η δεύτερη γραμμή του αρχείου δέσμης πρέπει να αλλάξει σε αυτό:
PowerShell.exe -Command "&{ Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' -VerbRunAs} "Όταν εκτελείται το αρχείο δέσμης, η πρώτη γραμμή εξόδου που θα δούμε είναι από το σενάριο προφίλ PowerShell.Στη συνέχεια, θα υπάρξει μια προτροπή UAC όταν το Start-Process προσπαθεί να εκκινήσει το MyScript.ps1.
Αφού κάνετε κλικ στην εντολή UAC, θα εμφανιστεί μια νέα παράσταση PowerShell.Επειδή πρόκειται για μια νέα εμφάνιση, βέβαια, θα δούμε και πάλι την ειδοποίηση δέσμης ενεργειών προφίλ.Στη συνέχεια, το MyScript.ps1 τρέχει και βλέπουμε ότι είμαστε πράγματι σε αυξημένη συνεδρία.
Και υπάρχει ο λόγος για τον οποίο έχουμε και δύο παύσεις εδώ.Αν όχι για το σενάριο του PowerShell, δεν θα δούμε ποτέ την έξοδο του σεναρίου - το παράθυρο PowerShell θα εμφανιστεί και θα εξαφανιστεί μόλις ολοκληρωθεί η εκτέλεση της δέσμης ενεργειών.Και χωρίς την παύση στο αρχείο παρτίδας, δεν θα μπορούσαμε να δούμε αν υπήρξαν σφάλματα που ξεκίνησαν το PowerShell στην πρώτη θέση.
Βήμα 4: Εισαγωγή προσαρμοσμένων προφίλ PowerShell.
Ας απαλλαγούμε από αυτή τη δυσάρεστη ειδοποίηση προφίλ προσαρμοσμένου προφίλ τώρα, εμείς;Εδώ, δεν είναι καθόλου ενοχλητική, αλλά αν το προφίλ PowerShell ενός χρήστη αλλάξει προεπιλεγμένες ρυθμίσεις, μεταβλητές ή λειτουργίες με τρόπους που ίσως δεν έχετε προβλέψει με το σενάριό σας, μπορεί να είναι πραγματικά ενοχλητικό.Είναι πολύ πιο εύκολο να εκτελέσετε το σενάριό σας χωρίς το προφίλ εξ ολοκλήρου, ώστε να μην χρειάζεται να ανησυχείτε για αυτό.Για να γίνει αυτό, πρέπει να αλλάξουμε τη δεύτερη γραμμή του αρχείου δέσμης μία ακόμη φορά:
PowerShell.exe -NoProfile -Command "&{ Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -Φάκελος" "% ~ dpn0.ps1 "" '-Verb RunAs} "Η προσθήκη της παράμετρος -NoProfile και στις δύο παρουσίες του PowerShell που ξεκινούν από το script, σημαίνει ότι το script προφίλ του χρήστη θα ξεπεραστεί εντελώς και στα δύο βήματα και το script του PowerShell θα εκτελεστείένα αρκετά προβλέψιμο, προεπιλεγμένο περιβάλλον.Εδώ, μπορείτε να δείτε ότι δεν υπάρχει ειδοποίηση προσαρμοσμένου προφίλ σε κανένα από τα γεννημένα κοχύλια.
Εάν δεν χρειάζεστε δικαιώματα διαχειριστή στη δέσμη ενεργειών PowerShell και έχετε παραλείψει το βήμα 3, μπορείτε να το κάνετε χωρίς τη δεύτερη περίπτωση PowerShell και η δεύτερη γραμμή του αρχείου δέσμης πρέπει να έχει την εξής μορφή:
PowerShell.exe -NoProfile -ΕκτέλεσηPolicy Bypass -Mommand "& '% ~ dpn0.ps1'"Η έξοδος θα φαίνεται ως εξής:
( Φυσικά για μη-Administrator scripts, θα μπορούσατε να κάνετε χωρίς παύση λήξης script στο PowerShell scriptσε αυτό το σημείο πάρα πολύ δεδομένου ότι τα πάντα καταγράφονται στο ίδιο παράθυρο της κονσόλας και θα κρατηθούν εκεί από την παύση στο τέλος του αρχείου δέσμης ούτως ή άλλως.)
Ολοκληρώθηκαν αρχεία δέσμης.
Ανάλογα με το αν χρειάζεστε ή όχι δικαιώματα διαχειριστή για το PowerShell script σας( και πραγματικά δεν θα πρέπει να τους ζητάτε εάν δεν το κάνετε), το τελικό αρχείο δέσμης θα πρέπει να μοιάζει με ένα από τα δύο παρακάτω.
Χωρίς πρόσβαση διαχειριστή:
@ECHO OFF PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'" PAUSEΜε πρόσβαση διαχειριστή:
@ECHO OFF PowerShell.exe -NoProfile -Command "&{Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""% ~ dpn0.ps1 ""' -Verb RunAs} "PAUSEΘυμηθείτε να βάλετε το αρχείο δέσμης στον ίδιο φάκελο με το σενάριο PowerShell που θέλετενα το χρησιμοποιήσετε και να του δώσετε το ίδιο όνομα.Στη συνέχεια, ανεξάρτητα από το σύστημα στο οποίο λαμβάνετε αυτά τα αρχεία, θα μπορείτε να εκτελέσετε το σενάριο PowerShell χωρίς να χρειαστεί να χτυπήσετε γύρω σας με οποιαδήποτε από τις ρυθμίσεις ασφαλείας στο σύστημα.Θα μπορούσατε να κάνετε αυτές τις αλλαγές με μη αυτόματο τρόπο κάθε φορά, αλλά αυτό σας εξοικονομεί αυτό το πρόβλημα και δεν θα χρειαστεί να ανησυχείτε για την επιστροφή των αλλαγών αργότερα.
Αναφορές:
- Εκτέλεση σεναρίων PowerShell από ένα αρχείο δέσμης - Blog Προγραμματισμού του Daniel Schroeder
- Έλεγχος για δικαιώματα διαχειριστή στο PowerShell - Hey, Scripting Guy! Blog