Làm cách nào để kích hoạt thực thi tập lệnh PowerShell?


260

Khi tôi cố thực thi tập lệnh PowerShell, tôi gặp lỗi này:

Tệp C: \ Common \ Sc scripts \ hello.ps1 không thể được tải vì việc thực thi tập lệnh bị vô hiệu hóa trên hệ thống này. Vui lòng xem "get-help about_signing" để biết thêm chi tiết.
Tại dòng: 1 char: 13
+. \ Hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullQualifiedErrorId: RuntimeException

Câu trả lời:


399
  1. Khởi động Windows PowerShell với tùy chọn "Chạy với tư cách quản trị viên". Chỉ các thành viên của nhóm Quản trị viên trên máy tính có thể thay đổi chính sách thực thi.

  2. Cho phép chạy các tập lệnh không dấu bằng cách nhập:

    set-executionpolicy remotesigned
    

Điều này sẽ cho phép chạy các tập lệnh không dấu mà bạn viết trên máy tính cục bộ và các tập lệnh đã ký từ Internet.

Xem thêm Chạy tập lệnh tại Thư viện Microsoft TechNet.


3
Điều này sẽ thay đổi chính sách vĩnh viễn hay tôi phải làm điều này mỗi khi tôi khởi động lại máy tính?
Ray

1
@Ray Điều này sẽ thay đổi chính sách vĩnh viễn.
Pavel Chuchuva

1
@Ray Xem tài liệu . Theo mặc định, nó đặt nó cho LocalMachine. Để đặt cho các phạm vi khác ( CurrentUserhoặc Process), hãy chuyển -Scopemột cách rõ ràng.
jpmc26

@PavelChuchuva tôi có nên thêm dòng này lên trên kịch bản của tôi không
FabioSpaghetti

@FabioSpaghetti Không cần thêm bất cứ điều gì vào tập lệnh của bạn. Chỉ cần thực hiện lệnh đó một lần bằng cách làm theo các bước.
Pavel Chuchuva

74

Chính sách thực thi mặc định được đặt thành hạn chế, bạn có thể thấy nó bằng cách nhập:

Get-ExecutionPolicy

Bạn nên gõ như sau để chuyển sang chế độ không giới hạn:

Set-ExecutionPolicy unrestricted

Hi vọng điêu nay co ich


13
Việc ký yêu cầu có ý nghĩa nếu bạn mong muốn người dùng sao chép và dán các tập lệnh độc hại từ internet. Nếu bạn cho rằng người dùng không ngu ngốc thì "từ xa" sẽ không thêm bất kỳ bảo mật nào và làm cho cuộc sống trở nên khó khăn.
Guss

@Guss: Khi kiểm tra điều này, tôi thấy rằng RemoteSign không còn yêu cầu các tệp .ps1 được tạo cục bộ phải được ký và nó xử lý kiểm soát nguồn git như một nguồn cục bộ.
Joshua

@Joshua - vâng, quan điểm của tôi chính xác. Nếu RemoteSignedkhông chặn sao chép và dán, không chặn git hoặc các phương thức tải xuống không phải IE khác, vậy thì nó tốt cho cái gì? Nói với tôi: "hoàn toàn không có gì!". Tôi nghĩ rằng việc yêu cầu các tập lệnh được ký với chứng chỉ ký mã 100 đô la là vô ích, ngu ngốc và phủ nhận tất cả những điều tốt đẹp mà một ngôn ngữ kịch bản tốt có thể làm cho Windows. Điều đó đang được nói, nếu con đường phía trước là để người dùng hiểu những gì họ đang làm để sử dụng các tập lệnh PS, thì chúng ta có thể sẽ quá ... Nahhhh, điều đó sẽ không bao giờ hoạt động ;-)
Guss

@Guss: Tôi đã có một ngôn ngữ kịch bản tốt trên Windows. Cygwin hoạt động tuyệt vời trên Windows 10; giống như nghĩa đen tốt hơn nhiều so với bất kỳ phiên bản Windows trước nào. Tôi chỉ muốn chạy thánh thư mà người khác đã viết.
Joshua

61

Trên máy của tôi mà tôi sử dụng để phát triển các tập lệnh, tôi sẽ sử dụng giới hạn như trên. Tuy nhiên, khi triển khai các tập lệnh của tôi, đến một máy người dùng cuối, tôi sẽ chỉ gọi powershell bằng công tắc -executpolicy:

powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1

2
Bạn có thể muốn kết hợp thủ thuật này với thủ thuật polyglot trong tệp .CMD. Xem stackoverflow.com/a/8597794/5314
Jay Bazuzi

Đẹp! Tôi đã triển khai sfx được tạo bởi winrar rarlabs.com
MDMoore313

1
Thủ thuật đó cho phép tôi chạy tập lệnh powershell từ Git Bash (MINGW32 bash)
Kamil Szot

16

Chúng ta có thể nhận trạng thái của ExecutPolicy hiện tại bằng lệnh bên dưới:

Get-ExecutionPolicy;

Theo mặc định, nó bị hạn chế . Để cho phép thực thi Tập lệnh PowerShell, chúng ta cần đặt ExecutPolicy này dưới dạng Bỏ qua hoặc Không giới hạn .

Chúng tôi có thể đặt chính sách cho Người dùng hiện tại là Bypasshoặc Unrestrictedbằng cách sử dụng bất kỳ lệnh PowerShell nào dưới đây:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force;

Chính sách không hạn chế tải tất cả các tệp cấu hình và chạy tất cả các tập lệnh. Nếu bạn chạy một tập lệnh không dấu được tải xuống từ Internet, bạn sẽ được nhắc cho phép trước khi nó chạy.

Trong khi đó trong chính sách Bỏ qua , không có gì bị chặn và không có cảnh báo hoặc lời nhắc nào trong khi thực thi tập lệnh. Bypass ExecutPolicy thoải mái hơn Không bị giới hạn.


5

Tùy thuộc vào phiên bản và cấu hình Windows, bạn có thể có cảnh báo sau, ngay cả trong Unrestrictedchế độ:

Security warning
Run only scripts that you trust. While scripts from the internet can be useful, this
script can potentially harm your computer. If you trust this script, use the 
Unblock-File cmdlet to allow the script to run without this warning message. 
Do you want to run?
[D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D")

Giải pháp là sử dụng chính sách "bỏ qua", được kích hoạt bằng lệnh sau:

Set-ExecutionPolicy Bypass

Từ tài liệu :

Bỏ qua: Không có gì bị chặn và không có cảnh báo hoặc lời nhắc.

Điều này rõ ràng là không an toàn, xin vui lòng hiểu những rủi ro liên quan.


đây là cách duy nhất tôi có thể khiến tập lệnh của mình chạy trong môi trường RƯỢU với powershell 2.0. Cảm ơn bạn.
Wyatt8740

@ Wyatt8740: Bởi vì rượu trình bày tất cả các ổ đĩa là ổ đĩa mạng.
Joshua

@Joshua Mình không có ý kiến. bạn có thể cho tôi một nguồn cho tuyên bố đó? Tôi đã thử một google bình thường, nhưng rõ ràng là tôi đang nhìn sai.
Wyatt8740

@ Wyatt8740: Nguồn: Hộp thoại chung Wine OpenFileName. Nhìn một biểu tượng ổ đĩa.
Joshua

@Joshua Ý tôi là một nguồn mã nguồn; các biểu tượng có thể tùy ý. Nhưng tôi không nghĩ về điều đó; Tôi đoán đó là một nơi tốt để bắt đầu (chỉnh sửa: không giống như họ đang ở đây .)
Wyatt8740

2

Khóa reg với:
Windows Registry Editor Phiên bản 5,00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Chính sách \ Microsoft \ Windows \ PowerShell] "EnableScripts" = dword: 00000001 "ExecutPolicy" = "Bypass"

và:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell]
"EnableScripts"=dword:00000001 "ExecutionPolicy"="Unrestricted"

công việc thực sự quá.


1

Vì một số lý do, lệnh ghép ngắn PowerShell không cho phép thực thi cục bộ trên toàn cầu, chỉ dành cho bối cảnh người dùng cục bộ. Ví dụ, nếu tôi cố khởi động tập lệnh Powershell từ dấu nhắc bash của CygWin, chạy trong ngữ cảnh người dùng của chính nó, nó sẽ không chạy, gây ra lỗi "không được ký điện tử". Câu trả lời là vào Trình chỉnh sửa chính sách nhóm cục bộ -> Chính sách máy tính cục bộ -> Mẫu quản trị -> Thành phần Windows -> Windows PowerShell và nhấp đúp vào 'Bật thực thi tập lệnh'. Điều này sau đó cho phép tôi thay đổi nó thành 'Đã bật' và sau đó thực hiện chính sách "Cho phép tập lệnh cục bộ và tập lệnh được ký từ xa" và để nó hoạt động trên toàn cầu bất kể bối cảnh người dùng.


0

Câu trả lời được chấp nhận là đúng, nhưng sửa đổi chính sách chỉ có sẵn cho phiên bản hiện tại của Powershell, nghĩa là một khi phiên bản của Powershell bị tắt. Chính sách sẽ được thiết lập lại. Nếu người dùng mở lại một phiên bản khác của Powershell, chính sách mặc định sẽ được áp dụngRestricted

Đối với tôi, tôi cần sử dụng bảng điều khiển VisualStudio Code và g ++ từ cygwin để xây dựng mọi thứ. Bảng điều khiển đang sử dụng Powershell, với chính sách mặc định, không có gì có thể được thực hiện. Một giải pháp là thay đổi chính sách mỗi khi bảng điều khiển được kích hoạt trong bảng điều khiển VisualStudio Code, có thể là tập lệnh thay đổi chính sách.

Tôi lười biếng, vì vậy một giải pháp khác là khi tôi chạy Powershell ở chế độ quản trị viên, tương tự như câu trả lời được chấp nhận. nhưng với một tham số phụ làm thay đổi giá trị trong bảng Registry. Một khi nó đã được thực hiện. Các phiên bản khác của Powershell sẽ sử dụng RemoteSignedchính sách theo mặc định.

set-executionpolicy remotesigned -Scope CurrentUser


0

Đặt chính sách (chính xác) là lựa chọn tốt nhất nhưng trên các hệ thống được quản lý của tôi, tôi không có khả năng thay đổi chính sách đó.

Đối với tôi, cách đơn giản nhất để thay đổi chính sách là mở tập lệnh trong "PowerShell ISE" , tô sáng mã (hoặc một phần của mã) để thực thi và sau đó nhấp vào nút "Chạy lựa chọn" (hoặc sử dụng F8 đường tắt).

Đây không phải là giải pháp tốt nhất và ít để tự động hóa các tác vụ, nhưng nó cho phép tôi sử dụng & tiện ích của PowerShell trong khi không chạy afoul của bộ phận IS.


-2

Lý do mà khóa reg hoạt động là bởi vì nó đang thực hiện chính xác những gì các lệnh PS làm. Các lệnh viết các thay đổi cho các phím reg. Các lệnh nhanh hơn và dễ dàng hơn nhiều so với việc tạo khóa reg hoặc đào sâu vào sổ đăng ký.


1
Điều đó là sai: các khóa được đề cập trong các câu trả lời khác thay đổi chính sách thực thi quyền hạn, sau đó cho phép tập lệnh powershell chạy.
Patrick R.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.