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



Πώς και γιατί τα Windows και το PowerShell εμποδίζουν την εκτέλεση σεναρίου.

Το PowerShell είναι ουσιαστικά το κέλυφος εντολών και η γλώσσα δέσμης ενεργειών που προορίζονται να αντικαταστήσουν τα σενάρια CMD και δέσμες ενεργειών σε συστήματα Windows. Ως εκ τούτου, ένα σενάριο PowerShell μπορεί σχεδόν να ρυθμιστεί ώστε να κάνει οτιδήποτε μπορείτε να κάνετε με μη αυτόματο τρόπο από τη γραμμή εντολών. Αυτό ισοδυναμεί με την πραγματοποίηση σχεδόν οποιασδήποτε αλλαγής στο σύστημά σας, μέχρι τους περιορισμούς που ισχύουν στον λογαριασμό χρήστη σας. Έτσι, αν μπορούσατε απλώς να κάνετε διπλό κλικ σε ένα σενάριο PowerShell και να το εκτελέσετε με πλήρη δικαιώματα διαχειριστή, ένα απλό one-liner όπως αυτό θα μπορούσε πραγματικά να καταστρέψει τη μέρα σας:

Get-ChildItem '$env:SystemDrive' -Recurse -ErrorAction SilentlyContinue | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue

ΜΗΝ εκτελέσετε την παραπάνω εντολή!

Αυτό απλώς περνά από το σύστημα αρχείων και διαγράφει ό,τι μπορεί. Είναι ενδιαφέρον ότι αυτό μπορεί να μην καταστήσει το σύστημα μη λειτουργικό τόσο γρήγορα όσο νομίζετε – ακόμα και όταν εκτελείται από ανυψωμένη συνεδρία. Αλλά αν κάποιος σας καλέσει μετά την εκτέλεση αυτού του σεναρίου, επειδή ξαφνικά δεν μπορεί να βρει τα αρχεία του ή να εκτελέσει κάποια προγράμματα, η απενεργοποίηση και η εκ νέου ενεργοποίηση πιθανότατα θα τον οδηγήσουν στο Windows Startup Repair όπου θα του πουν ότι δεν υπάρχει τίποτα μπορεί να γίνει για να διορθωθεί το πρόβλημα. Αυτό που θα μπορούσε να είναι χειρότερο είναι ότι, αντί να λάβετε ένα σενάριο που απλώς απορρίπτει το σύστημα αρχείων του, ο φίλος σας μπορεί να εξαπατηθεί και να τρέξει ένα που κατεβάζει και εγκαθιστά ένα keylogger ή μια υπηρεσία απομακρυσμένης πρόσβασης. Στη συνέχεια, αντί να σας κάνουν ερωτήσεις σχετικά με το Startup Repair, μπορεί να καταλήξουν να κάνουν στην αστυνομία μερικές ερωτήσεις σχετικά με τραπεζική απάτη!

Μέχρι στιγμής θα πρέπει να είναι προφανές γιατί χρειάζονται ορισμένα πράγματα για την προστασία των τελικών χρηστών από τον εαυτό τους, ούτως ειπείν. Ωστόσο, οι ισχυροί χρήστες, οι διαχειριστές συστήματος και άλλοι geeks είναι γενικά (αν και υπάρχουν εξαιρέσεις) λίγο πιο επιφυλακτικοί με αυτές τις απειλές, γνωρίζοντας πώς να τις εντοπίζουν και να τις αποφεύγουν εύκολα και απλώς θέλουν να συνεχίσουν με την ολοκλήρωση της δουλειάς τους. Για να γίνει αυτό, θα πρέπει είτε να απενεργοποιήσουν είτε να δουλέψουν γύρω από μερικά οδοφράγματα:

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

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

Αλλαγή της συσχέτισης αρχείων .PS1.

Το πρώτο, και ίσως το κυριότερο, ενόχληση είναι η προεπιλεγμένη συσχέτιση για τα αρχεία .PS1. Η συσχέτιση αυτών των αρχείων με οτιδήποτε άλλο εκτός από το PowerShell.exe έχει νόημα για την αποτροπή της τυχαίας εκτέλεσης ανεπιθύμητων σεναρίων. Όμως, λαμβάνοντας υπόψη ότι το PowerShell διαθέτει ένα ολοκληρωμένο περιβάλλον δέσμης ενεργειών (ISE) το οποίο έχει σχεδιαστεί ειδικά για την επεξεργασία σεναρίων PowerShell, γιατί να θέλουμε να ανοίξουμε αρχεία .PS1 στο Σημειωματάριο από προεπιλογή; Ακόμα κι αν δεν είστε έτοιμοι να μεταβείτε πλήρως στην ενεργοποίηση της λειτουργίας διπλού κλικ για εκτέλεση, πιθανότατα θα θέλετε να τροποποιήσετε αυτές τις ρυθμίσεις.

Διαφήμιση

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

Οι ρυθμίσεις μητρώου που ελέγχουν τον τρόπο ανοίγματος των σεναρίων PowerShell αποθηκεύονται στην ακόλουθη τοποθεσία:

HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1Shell

Για να εξερευνήσετε αυτές τις ρυθμίσεις προτού προχωρήσουμε στην αλλαγή τους, ρίξτε μια ματιά σε αυτό το κλειδί και τα δευτερεύοντα κλειδιά του Regedit . Το κλειδί Shell θα πρέπει να έχει μόνο μία τιμή, (Προεπιλογή), η οποία έχει οριστεί σε Άνοιγμα. Αυτός είναι ένας δείκτης στην προεπιλεγμένη ενέργεια για διπλό κλικ στο αρχείο, την οποία θα δούμε στα δευτερεύοντα κλειδιά.

Αναπτύξτε το κλειδί Shell και θα δείτε τρία δευτερεύοντα κλειδιά. Καθένα από αυτά αντιπροσωπεύει μια ενέργεια που μπορείτε να εκτελέσετε και η οποία είναι συγκεκριμένη για τα σενάρια PowerShell.

Μπορείτε να επεκτείνετε κάθε κλειδί για να εξερευνήσετε τις τιμές μέσα, αλλά βασικά ισοδυναμούν με τις ακόλουθες προεπιλογές:

  • 0 – Εκτέλεση με PowerShell. Το Run with PowerShell είναι στην πραγματικότητα το όνομα μιας επιλογής που βρίσκεται ήδη στο μενού περιβάλλοντος για τα σενάρια PowerShell. Το κείμενο απλώς τραβιέται από άλλη θέση αντί να χρησιμοποιείται το όνομα του κλειδιού όπως τα άλλα. Και εξακολουθεί να μην είναι η προεπιλεγμένη ενέργεια διπλού κλικ.
  • Επεξεργασία – Άνοιγμα στο PowerShell ISE. Αυτό είναι πολύ πιο λογικό από το Σημειωματάριο, αλλά πρέπει να κάνετε δεξί κλικ στο αρχείο .PS1 για να το κάνετε από προεπιλογή.
  • Άνοιγμα – Άνοιγμα στο Σημειωματάριο. Σημειώστε ότι αυτό το όνομα κλειδιού είναι επίσης η συμβολοσειρά που είναι αποθηκευμένη στην τιμή (Προεπιλογή) του κλειδιού Shell. Αυτό σημαίνει ότι κάνοντας διπλό κλικ στο αρχείο θα το ανοίξει και αυτή η ενέργεια έχει κανονικά ρυθμιστεί να χρησιμοποιεί το Σημειωματάριο.
Διαφήμιση

Εάν θέλετε να παραμείνετε με τις ήδη διαθέσιμες προκατασκευασμένες συμβολοσειρές εντολών, μπορείτε απλώς να αλλάξετε την τιμή (Προεπιλογή) στο κλειδί Shell για να ταιριάζει με το όνομα του κλειδιού που ταιριάζει με αυτό που θέλετε να κάνετε ένα διπλό κλικ. Αυτό μπορεί να γίνει εύκολα μέσα από το Regedit ή μπορείτε να χρησιμοποιήσετε τα διδάγματα που αντλήθηκαν από το σεμινάριο μας εξερευνώντας το μητρώο με το PowerShell (συν ένα μικρό tweak PSDrive) για να ξεκινήσετε τη δημιουργία ενός επαναχρησιμοποιήσιμου σεναρίου που μπορεί να διαμορφώσει τα συστήματά σας για εσάς. Οι παρακάτω εντολές πρέπει να εκτελούνται από μια ανυψωμένη περίοδο λειτουργίας PowerShell, παρόμοια με εκτέλεση του CMD ως διαχειριστής .

Αρχικά, θα θελήσετε να διαμορφώσετε ένα PSDrive για HKEY_CLASSES_ROOT, καθώς αυτό δεν έχει ρυθμιστεί από προεπιλογή. Η εντολή για αυτό είναι:

New-PSDrive HKCR Registry HKEY_CLASSES_ROOT

Τώρα μπορείτε να πλοηγηθείτε και να επεξεργαστείτε τα κλειδιά και τις τιμές μητρώου στο HKEY_CLASSES_ROOT όπως ακριβώς θα κάνατε στα κανονικά HKCU και HKLM PSDrives.

Για να διαμορφώσετε το διπλό κλικ για να εκκινήσετε απευθείας τα σενάρια PowerShell:

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1Shell '(Default)' 0

Για να διαμορφώσετε κάνοντας διπλό κλικ για να ανοίξετε σενάρια PowerShell στο PowerShell ISE:

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1Shell '(Default)' 'Edit'

Για να επαναφέρετε την προεπιλεγμένη τιμή (ρυθμίζει το διπλό κλικ για να ανοίξετε τα σενάρια PowerShell στο Σημειωματάριο):

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1Shell '(Default)' 'Open'

Αυτά είναι μόνο τα βασικά για την αλλαγή της προεπιλεγμένης ενέργειας διπλού κλικ. Θα αναφερθούμε σε περισσότερες λεπτομέρειες σχετικά με την προσαρμογή του τρόπου χειρισμού των σεναρίων PowerShell όταν ανοίγονται στο PowerShell από τον Explorer στην επόμενη ενότητα. Εχε στο νου σου οτι Η οριοθέτηση αποτρέπει τη διατήρηση των μονάδων PSD σε όλες τις περιόδους λειτουργίας . Έτσι, πιθανότατα θα θέλετε να συμπεριλάβετε τη γραμμή New-PSDrive στην αρχή οποιουδήποτε σεναρίου διαμόρφωσης που δημιουργείτε για αυτόν τον σκοπό, ή προσθέστε το στο προφίλ σας στο PowerShell . Διαφορετικά, θα χρειαστεί να εκτελέσετε αυτό το bit χειροκίνητα πριν προσπαθήσετε να κάνετε αλλαγές με αυτόν τον τρόπο.

Αλλαγή της ρύθμισης PowerShell ExecutionPolicy.

Το PowerShell's ExecutionPolicy είναι ένα άλλο επίπεδο προστασίας από την εκτέλεση κακόβουλων σεναρίων. Υπάρχουν πολλές επιλογές για αυτό και μερικοί διαφορετικοί τρόποι μπορεί να ρυθμιστεί. Από τις περισσότερες έως τις λιγότερο ασφαλείς, οι διαθέσιμες επιλογές είναι:

  • Περιορισμένη – Δεν επιτρέπεται η εκτέλεση σεναρίων. (Προεπιλεγμένη ρύθμιση για τα περισσότερα συστήματα.) Αυτό θα αποτρέψει ακόμη και την εκτέλεση του σεναρίου του προφίλ σας.
  • AllSigned – Όλα τα σενάρια πρέπει να υπογράφονται ψηφιακά από έναν αξιόπιστο εκδότη για να εκτελούνται χωρίς να ζητείται από τον χρήστη. Σενάρια υπογεγραμμένα από εκδότες που ορίζονται ρητά ως μη αξιόπιστα ή σενάρια που δεν έχουν καθόλου ψηφιακή υπογραφή, δεν θα εκτελούνται. Το PowerShell θα ζητήσει από τον χρήστη επιβεβαίωση εάν ένα σενάριο υπογραφεί από έναν εκδότη που δεν έχει ακόμη οριστεί ως αξιόπιστο ή μη αξιόπιστο. Εάν δεν έχετε υπογράψει ψηφιακά το σενάριο του προφίλ σας και δεν έχετε δημιουργήσει εμπιστοσύνη σε αυτήν την υπογραφή, δεν θα μπορεί να εκτελεστεί. Προσέξτε ποιους εκδότες εμπιστεύεστε, καθώς μπορείτε να καταλήξετε να τρέχετε κακόβουλα σενάρια εάν εμπιστεύεστε το λάθος.
  • RemoteSigned – Για σενάρια κατεβάσει από το Διαδίκτυο , είναι ουσιαστικά το ίδιο με το AllSigned. Ωστόσο, τα σενάρια που δημιουργούνται τοπικά ή εισάγονται από πηγές άλλες εκτός του Διαδικτύου επιτρέπεται να εκτελούνται χωρίς καμία ερώτηση επιβεβαίωσης. Εδώ, θα πρέπει επίσης να προσέχετε ποιες ψηφιακές υπογραφές εμπιστεύεστε, αλλά ακόμη πιο προσεκτικοί με τα μη υπογεγραμμένα σενάρια που επιλέγετε να εκτελέσετε. Αυτό είναι το υψηλότερο επίπεδο ασφάλειας κάτω από το οποίο μπορείτε να έχετε ένα σενάριο προφίλ που λειτουργεί χωρίς να χρειάζεται να το υπογράψετε ψηφιακά.
  • Χωρίς περιορισμούς – Επιτρέπεται η εκτέλεση όλων των σεναρίων, αλλά θα απαιτείται μια προτροπή επιβεβαίωσης για σενάρια από το Διαδίκτυο. Από αυτό το σημείο και μετά, εξαρτάται αποκλειστικά από εσάς να αποφύγετε την εκτέλεση αναξιόπιστων σεναρίων.
  • Παράκαμψη – Όλα λειτουργούν χωρίς προειδοποίηση. Να είστε προσεκτικοί με αυτό.
  • Undefined – Δεν ορίζεται πολιτική στο τρέχον εύρος. Αυτό χρησιμοποιείται για να επιτρέψει την επιστροφή στις πολιτικές που ορίζονται σε χαμηλότερα πεδία (περισσότερες λεπτομέρειες παρακάτω) ή στις προεπιλογές του λειτουργικού συστήματος.
Διαφήμιση

Όπως προτείνεται από την περιγραφή του Undefined, οι παραπάνω πολιτικές μπορούν να οριστούν σε ένα ή περισσότερα πεδία. Μπορείτε να χρησιμοποιήσετε το Get-ExecutionPolicy, με την παράμετρο -List, για να δείτε όλα τα πεδία και την τρέχουσα διαμόρφωσή τους.

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

  • Η MachinePolicy αντιπροσωπεύει α Πολιτική ομάδας σε ισχύ σε επίπεδο Υπολογιστών. Αυτό ισχύει γενικά μόνο σε έναν τομέα , αλλά μπορεί να γίνει και τοπικά.
  • Το UserPolicy αντιπροσωπεύει μια πολιτική ομάδας που ισχύει για τον χρήστη. Αυτό συνήθως χρησιμοποιείται μόνο σε εταιρικά περιβάλλοντα.
  • Η διαδικασία είναι ένα εύρος που είναι συγκεκριμένο για αυτήν την παρουσία του PowerShell. Οι αλλαγές στην πολιτική σε αυτό το πεδίο δεν θα επηρεάσουν άλλες διεργασίες του PowerShell που εκτελούνται και θα είναι αναποτελεσματικές μετά τον τερματισμό αυτής της περιόδου λειτουργίας. Αυτό μπορεί να ρυθμιστεί από την παράμετρο -ExecutionPolicy κατά την εκκίνηση του PowerShell ή μπορεί να οριστεί με τη σωστή σύνταξη Set-ExecutionPolicy μέσα από τη συνεδρία.
  • Το CurrentUser είναι ένα πεδίο που έχει ρυθμιστεί στο τοπικό μητρώο και ισχύει για τον λογαριασμό χρήστη που χρησιμοποιείται για την εκκίνηση του PowerShell. Αυτό το εύρος μπορεί να τροποποιηθεί με το Set-ExecutionPolicy.
  • Το LocalMachine είναι ένα πεδίο που έχει ρυθμιστεί στο τοπικό μητρώο και εφαρμόζεται σε όλους τους χρήστες του συστήματος. Αυτό είναι το προεπιλεγμένο εύρος που αλλάζει εάν το Set-ExecutionPolicy εκτελείται χωρίς την παράμετρο -Scope. Καθώς ισχύει για όλους τους χρήστες του συστήματος, μπορεί να αλλάξει μόνο από ανυψωμένη περίοδο λειτουργίας.

Δεδομένου ότι αυτό το άρθρο αφορά κυρίως την αντιμετώπιση της ασφάλειας για τη διευκόλυνση της χρηστικότητας, ανησυχούμε απλώς για τα τρία κατώτερα πεδία. Οι ρυθμίσεις MachinePolicy και UserPolicy είναι πραγματικά χρήσιμες μόνο εάν θέλετε να επιβάλετε μια περιοριστική πολιτική που δεν παρακάμπτεται τόσο απλά. Διατηρώντας τις αλλαγές μας σε επίπεδο Διαδικασίας ή χαμηλότερο, μπορούμε εύκολα να χρησιμοποιήσουμε οποιαδήποτε ρύθμιση πολιτικής θεωρούμε κατάλληλη για μια δεδομένη κατάσταση ανά πάσα στιγμή.

Για να διατηρήσετε κάποια ισορροπία μεταξύ ασφάλειας και χρηστικότητας, η πολιτική που εμφανίζεται στο στιγμιότυπο οθόνης είναι ίσως η καλύτερη. Η ρύθμιση της πολιτικής LocalMachine σε Περιορισμένη γενικά αποτρέπει την εκτέλεση σεναρίων από οποιονδήποτε άλλο εκτός από εσάς. Φυσικά, αυτό μπορεί να παρακαμφθεί από χρήστες που ξέρουν τι κάνουν χωρίς μεγάλη προσπάθεια. Ωστόσο, θα πρέπει να εμποδίσει τους χρήστες που δεν είναι γνώστες της τεχνολογίας να ενεργοποιήσουν κατά λάθος κάτι καταστροφικό στο PowerShell. Η ρύθμιση του CurrentUser (δηλαδή: εσείς) ως Unrestricted σάς επιτρέπει να εκτελείτε χειροκίνητα σενάρια από τη γραμμή εντολών όπως θέλετε, αλλά διατηρεί μια υπενθύμιση προσοχής για σενάρια που λαμβάνονται από το Διαδίκτυο. Η ρύθμιση RemoteSigned στο επίπεδο Διεργασίας θα πρέπει να γίνει σε μια συντόμευση για το PowerShell.exe ή (όπως θα κάνουμε παρακάτω) στις τιμές του Μητρώου που ελέγχουν τη συμπεριφορά των σεναρίων PowerShell. Αυτό θα επιτρέψει την εύκολη λειτουργία διπλού κλικ για εκτέλεση για όλα τα σενάρια που γράφετε, ενώ θα δημιουργήσει ένα ισχυρότερο εμπόδιο ενάντια στην ακούσια εκτέλεση (δυνητικά κακόβουλων) σεναρίων από εξωτερικές πηγές. Θέλουμε να το κάνουμε αυτό εδώ, καθώς είναι πολύ πιο εύκολο να κάνετε κατά λάθος διπλό κλικ σε ένα σενάριο παρά να το καλέσετε με μη αυτόματο τρόπο από μια διαδραστική περίοδο λειτουργίας.

Για να ορίσετε τις πολιτικές CurrentUser και LocalMachine όπως στο παραπάνω στιγμιότυπο οθόνης, εκτελέστε τις ακόλουθες εντολές από μια ανυψωμένη περίοδο λειτουργίας PowerShell:

Set-ExecutionPolicy Restricted Set-ExecutionPolicy Unrestricted -Scope CurrentUser
Διαφήμιση

Για να επιβάλουμε την πολιτική RemoteSigned σε σενάρια που εκτελούνται από τον Explorer, θα πρέπει να αλλάξουμε μια τιμή μέσα σε ένα από τα κλειδιά μητρώου που εξετάσαμε νωρίτερα. Αυτό είναι ιδιαίτερα σημαντικό επειδή, ανάλογα με την έκδοση PowerShell ή Windows, η προεπιλεγμένη ρύθμιση παραμέτρων μπορεί να είναι η παράκαμψη όλων των ρυθμίσεων ExecutionPolicy εκτός από το AllSigned. Για να δείτε ποια είναι η τρέχουσα διαμόρφωση για τον υπολογιστή σας, μπορείτε να εκτελέσετε αυτήν την εντολή (φροντίζοντας πρώτα να αντιστοιχιστεί το HKCR PSDrive):

Get-ItemProperty HKCR:Microsoft.PowerShellScript.1ShellCommand | Select-Object '(Default)'

Η προεπιλεγμένη σας διαμόρφωση θα είναι πιθανώς μία από τις ακόλουθες δύο συμβολοσειρές ή κάτι αρκετά παρόμοιο:

(Βλέπεται σε Windows 7 SP1 x64, με PowerShell 2.0)

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-file' '%1'

(Βλέπεται σε Windows 8.1 x64, με PowerShell 4.0)

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-Command' 'if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1''

Το πρώτο δεν είναι πολύ κακό, καθώς το μόνο που κάνει είναι να εκτελεί το σενάριο κάτω από τις υπάρχουσες ρυθμίσεις ExecutionPolicy. Θα μπορούσε να βελτιωθεί, επιβάλλοντας αυστηρότερους περιορισμούς για μια ενέργεια πιο επιρρεπής σε ατυχήματα, αλλά δεν προοριζόταν αρχικά να ενεργοποιηθεί με διπλό κλικ ούτως ή άλλως και η προεπιλεγμένη πολιτική είναι συνήθως Περιορισμένη τελικά. Η δεύτερη επιλογή, ωστόσο, είναι μια πλήρης παράκαμψη οποιασδήποτε Πολιτικής Εκτέλεσης που είναι πιθανό να εφαρμόσετε – ακόμη και Περιορισμένη. Δεδομένου ότι η παράκαμψη θα εφαρμοστεί στο εύρος της διαδικασίας, επηρεάζει μόνο τις περιόδους λειτουργίας που ξεκινούν όταν εκτελούνται σενάρια από την Εξερεύνηση. Ωστόσο, αυτό σημαίνει ότι θα μπορούσατε να καταλήξετε να λανσάρετε σενάρια που διαφορετικά θα περιμένατε (και θα θέλατε) να απαγορεύσει η πολιτική σας.

Για να ορίσετε την Πολιτική εκτέλεσης σε επίπεδο διεργασίας για σενάρια που ξεκινούν από τον Explorer, σύμφωνα με το παραπάνω στιγμιότυπο οθόνης, θα χρειαστεί να τροποποιήσετε την ίδια τιμή μητρώου που μόλις ζητήσαμε. Μπορείτε να το κάνετε χειροκίνητα στο Regedit, αλλάζοντας το σε αυτό:

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-ExecutionPolicy' 'RemoteSigned' '-file' '%1'

Μπορείτε επίσης να αλλάξετε τη ρύθμιση από το PowerShell εάν προτιμάτε. Θυμηθείτε να το κάνετε αυτό από μια ανυψωμένη περίοδο λειτουργίας, με αντιστοιχισμένο το HKCR PSDrive.

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1ShellCommand '(Default)' ''C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-ExecutionPolicy' 'RemoteSigned' '-file' '%1''

Εκτελέστε σενάρια PowerShell ως διαχειριστής.

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

Διαφήμιση

Για να το κάνετε αυτό στο Regedit, επιστρέψτε στο κλειδί Shell, στη διεύθυνση:

HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1Shell

Εκεί, δημιουργήστε ένα νέο δευτερεύον κλειδί. Ονομάστε το Εκτέλεση με PowerShell (Διαχειριστής). Κάτω από αυτό, δημιουργήστε ένα άλλο δευτερεύον κλειδί που ονομάζεται Command. Στη συνέχεια, ορίστε την τιμή (Προεπιλογή) κάτω από το Command σε αυτό:

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-Command' ''& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -File '%1'' -Verb RunAs}'

Κάνοντας το ίδιο στο PowerShell θα χρειαστούν στην πραγματικότητα τρεις γραμμές αυτή τη φορά. Ένα για κάθε νέο κλειδί και ένα για να ορίσετε την τιμή (Προεπιλογή) για το Command. Μην ξεχνάτε την ανύψωση και τη χαρτογράφηση HKCR.

New-Item 'HKCR:Microsoft.PowerShellScript.1ShellRun with PowerShell (Admin)' New-Item 'HKCR:Microsoft.PowerShellScript.1ShellRun with PowerShell (Admin)Command' Set-ItemProperty 'HKCR:Microsoft.PowerShellScript.1ShellRun with PowerShell (Admin)Command' '(Default)' ''C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-Command' ''& {Start-Process PowerShell.exe -ArgumentList ''-ExecutionPolicy RemoteSigned -File '%1''' -Verb RunAs}''

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

Τώρα θα πρέπει να έχετε μια νέα καταχώρηση στο μενού περιβάλλοντος για σενάρια PowerShell, που ονομάζεται Εκτέλεση με PowerShell (Διαχειριστής).

Η νέα επιλογή θα δημιουργήσει δύο διαδοχικές παρουσίες PowerShell. Η πρώτη είναι απλώς μια εκκίνηση για τη δεύτερη, η οποία χρησιμοποιεί το Start-Process με την παράμετρο -Verb RunAs για να ζητήσει ανύψωση για τη νέα συνεδρία. Από εκεί, το σενάριό σας θα πρέπει να μπορεί να εκτελείται με δικαιώματα διαχειριστή αφού κάνετε κλικ στη γραμμή εντολών UAC.

Τελευταίες πινελιές.

Υπάρχουν μόνο μερικές ακόμη προσαρμογές σε αυτό που μπορούν να σας βοηθήσουν να κάνετε τη ζωή λίγο πιο εύκολη. Για ένα, τι θα λέγατε να απαλλαγείτε εντελώς από τη λειτουργία Σημειωματάριο; Απλώς αντιγράψτε την τιμή (Προεπιλογή) από το πλήκτρο Command κάτω από το Edit (κάτω), στην ίδια θέση κάτω από το Open.

'C:WindowsSystem32WindowsPowerShellv1.0powershell_ise.exe' '%1'
Διαφήμιση

Εναλλακτικά, μπορείτε να χρησιμοποιήσετε αυτό το κομμάτι του PowerShell (φυσικά με Admin & HKCR):

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1ShellOpenCommand '(Default)' ''C:WindowsSystem32WindowsPowerShellv1.0powershell_ise.exe' '%1''

Μια ακόμη μικρή ενόχληση είναι η συνήθεια της κονσόλας να εξαφανίζεται μόλις ολοκληρωθεί ένα σενάριο. Όταν συμβεί αυτό, δεν έχουμε καμία ευκαιρία να ελέγξουμε την έξοδο του σεναρίου για σφάλματα ή άλλες χρήσιμες πληροφορίες. Αυτό μπορείτε να το φροντίσετε βάζοντας μια παύση στο τέλος κάθε σεναρίου σας, φυσικά. Εναλλακτικά, μπορούμε να τροποποιήσουμε τις τιμές (Προεπιλογή) για τα πλήκτρα εντολών για να συμπεριλάβουμε την παράμετρο -NoExit. Ακολουθούν οι τροποποιημένες τιμές.

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

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-NoExit' '-ExecutionPolicy' 'RemoteSigned' '-file' '%1'

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

'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-Command' ''& {Start-Process PowerShell.exe -ArgumentList '-NoExit -ExecutionPolicy RemoteSigned -File '%1'' -Verb RunAs}'

Και φυσικά, θα σας δώσουμε και αυτές στις εντολές του PowerShell. Τελευταία υπενθύμιση: Elevation & HKCR!

(Μη Διαχειριστής)

Set-ItemProperty HKCR:Microsoft.PowerShellScript.1ShellCommand '(Default)' ''C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-NoExit' '-ExecutionPolicy' 'RemoteSigned' '-file' '%1''

(Διαχειριστής)

Set-ItemProperty 'HKCR:Microsoft.PowerShellScript.1ShellRun with PowerShell (Admin)Command' '(Default)' ''C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-Command' ''& {Start-Process PowerShell.exe -ArgumentList ''-NoExit -ExecutionPolicy RemoteSigned -File '%1''' -Verb RunAs}''

Παίρνοντάς το για μια περιστροφή.

Για να το δοκιμάσουμε αυτό, θα χρησιμοποιήσουμε ένα σενάριο που μπορεί να μας δείξει τις ρυθμίσεις ExecutionPolicy και εάν το σενάριο ξεκίνησε ή όχι με δικαιώματα διαχειριστή. Το σενάριο θα ονομάζεται MyScript.ps1 και θα αποθηκευτεί στο D:Script Lab στο δείγμα του συστήματος μας. Ο κωδικός είναι παρακάτω, για αναφορά.

if(([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {Write-Output 'Running as Administrator!'} else {Write-Output 'Running Limited!'} Get-ExecutionPolicy -List

Χρήση της ενέργειας Εκτέλεση με PowerShell:

Χρησιμοποιώντας την ενέργεια Εκτέλεση με PowerShell (Διαχειριστής), αφού κάνετε κλικ στο UAC:

Διαφήμιση

Για να δείξουμε την πολιτική εκτέλεσης σε δράση στο πεδίο της διαδικασίας, μπορούμε να κάνουμε τα Windows να πιστεύουν ότι το αρχείο προήλθε από το Διαδίκτυο με αυτό το κομμάτι κώδικα PowerShell:

Add-Content -Path 'D:Script LabMyScript.ps1' -Value '[ZoneTransfer]`nZoneId=3' -Stream 'Zone.Identifier'

Ευτυχώς, είχαμε ενεργοποιημένο το -NoExit. Διαφορετικά, αυτό το σφάλμα θα είχε μόλις αναβοσβήσει και δεν θα το γνωρίζαμε!

Το Zone.Identifier μπορεί να αφαιρεθεί με αυτό:

Clear-Content -Path 'D:Script LabMyScript.ps1' -Stream 'Zone.Identifier'

Χρήσιμες αναφορές:

ΔΙΑΒΑΣΤΕ ΤΗ ΣΥΝΕΧΕΙΑ