Tại sao tập lệnh được tạo cục bộ của tôi không được phép chạy theo chính sách thực thi RemoteSigned?


98

Vì câu hỏi này tiếp tục thu hút các câu trả lời bị nội dung câu hỏi bác bỏ hoặc không giải quyết được vấn đề thực tế, vui lòng đọc bản tóm tắt đơn giản này về những điều bạn cần biết:

  • Đây không phải là "Tại sao cài đặt mặc định PowerShell của tôi không chạy tập lệnh?" câu hỏi.
  • Đây không phải là "Tại sao cài đặt PowerShell của tôi không chạy các tập lệnh được tải xuống từ internet?" câu hỏi.
  • Câu hỏi đặt ra là tại sao RemoteSignedchính sách thực thi lại ngăn chặn việc thực thi tập lệnh khi không nên.
  • RemoteSignedlà chính sách thực thi duy nhất mà tôi muốn sử dụng. Tôi biết rằng có các chính sách khác, ít hạn chế hơn. Nếu những chính sách đó là những sản phẩm thay thế được chấp nhận, tôi sẽ chỉ sử dụng chúng thay thế và câu hỏi này sẽ không tồn tại.
  • Chính sách thực thi đã được đặt thành RemoteSigned. Thay đổi nó từ RemoteSignedthành RemoteSignedkhông phải là một giải pháp.
  • Tệp script được tạo và lưu trữ cục bộ.
  • Tệp script không bị chặn. Tệp script không bao giờ bị chặn (xem phần trước).
  • Không thể bỏ chặn tệp script vì không có gì để bỏ chặn (xem phần trước).
  • Tệp script được quản trị viên (cố gắng thực hiện).
  • Windows PowerShelllà ứng dụng duy nhất liên quan. Không Windows PowerShell ISEhoặc Command Promptbất kỳ công cụ hoặc trình chỉnh sửa nào khác có liên quan.
  • Nguyên nhân của vấn đề đã được xác định (xem câu trả lời được chấp nhận). Sau gần 8 năm, tôi nghĩ rằng tất cả các giải thích rõ ràng khác, dù có thể áp dụng hay không, cũng đã được đăng tải. Nếu bạn nghĩ khác thì vui lòng đọc toàn bộ câu hỏi và câu trả lời hiện có trước khi thêm câu trả lời của bạn.

Tôi đang sử dụng Windows PowerShell 2.0 trên Windows 7 Professional 64-bit. Tôi có một tập lệnh trên Desktopđó gây ra lỗi sau khi tôi cố chạy nó:

File C:\Users\UserName\Desktop\Script.ps1 cannot be loaded. The file C:\Users\UserName\Desktop\Script.ps1 is not digitally signed. The script will not execute on the system.  Please see "get-help about_signing" for more details..
At line:1 char:54
+ C:\Users\UserName\Desktop\TestGetWindowsUpdateLog.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

Tôi vừa là quản trị viên miền vừa là quản trị viên cục bộ và nếu tôi chạy Get-ExecutionPolicy -List, tôi có thể thấy rằng Group Policy Objecttôi đã tạo để định cấu hình PowerShell đang áp dụng RemoteSignedchính sách thực thi ở cấp máy một cách chính xác :

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy    RemoteSigned
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

Tôi đã tự tạo tập lệnh Notepadvà sử dụng tiện ích của SysinternalsstreamsPropertieshộp thoại tệp để xác nhận rằng tập lệnh không được coi là đến từ internet. Nếu tôi sao chép tập lệnh vào mạng chia sẻ trên máy chủ miền, thì tập lệnh đó được phép thực thi. Nếu tôi chạy Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachinethì tập lệnh cục bộ vẫn không được phép thực thi, điều này có ý nghĩa vì chính sách thực thi tại MachinePolicyphạm vi sẽ được ưu tiên.

Theo tài liệu của about_Execution_Policies( hiện tại ; tại thời điểm câu hỏi ), RemoteSignedchính sách có nghĩa là:

  • Tập lệnh có thể chạy.

  • Yêu cầu chữ ký điện tử từ một nhà xuất bản đáng tin cậy trên các tập lệnh và tệp cấu hình được tải xuống từ Internet (bao gồm các chương trình e-mail và nhắn tin tức thì).

  • Không yêu cầu chữ ký điện tử trên các tập lệnh bạn đã chạy và bạn đã viết trên máy tính cục bộ (không phải tải xuống từ Internet).

  • Rủi ro khi chạy các tập lệnh chưa được ký từ các nguồn khác ngoài Internet và các tập lệnh đã ký nhưng độc hại.

Tập lệnh của tôi không được ký, nhưng vì nó vừa được tạo và thực thi cục bộ, nên nó sẽ đáp ứng dấu đầu dòng thứ ba ở trên. Vì thế...

  • Tại sao tập lệnh của tôi không được phép chạy?
  • Tại sao PowerShell phàn nàn rằng tập lệnh của tôi "không được ký điện tử" khi yêu cầu đó chỉ áp dụng cho các tệp từ Internet?
  • Tại sao PowerShell không còn quan tâm đến việc tập lệnh không được ký khi nó chạy từ một mạng chia sẻ?

1
@Downvoter: quan tâm để đưa ra lý do tại sao?
BACON

Câu trả lời:


125

Tệp có bị chặn không? Tôi gặp sự cố tương tự và có thể giải quyết nó bằng cách nhấp chuột phải vào tệp .PS1, Thuộc tính và chọn Bỏ chặn.


1
Như tôi đã giải thích, tập lệnh đang được tạo trực tiếp trên ổ cứng của tôi (không được tải xuống từ bất kỳ đâu) và tôi xác nhận rằng không có luồng thay thế nào xác định nó có nguồn gốc từ một vùng khác (như Internet Explorer và các trình duyệt web khác tạo). Nếu tôi chạy, 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;tôi vẫn gặp lỗi rằng tập lệnh không được ký điện tử và nó không được thực thi. Nếu tôi mở hộp thoại Thuộc tính cho tệp mới tạo thì không có gì để bỏ chặn.
BACON

48
Ý bạn là gì ~ " Thuộc tính và chọn Bỏ chặn "?
IgorGanapolsky

1
@IgorGanapolsky ý họ là trong Explorer, tìm ps1tệp, nhấp chuột phải vào tệp đó để xuất hiện menu ngữ cảnh và chọn Properties, trên tab đầu tiên gần cuối nó sẽ thông báo tệp bị chặn và cho phép bạn đánh dấu vào hộp kiểm để bỏ chặn.
Lankymart

1
Lưu ý rằng nếu bạn đã tải xuống tệp zip, bạn nên mở khóa tệp zip trước khi giải nén để tránh việc bỏ chặn hàng loạt tất cả các tệp bên trong nó.
Ohad Schneider

14
@Lankymart Windows 10, đã thử điều này, không nói rằng nó bị chặn.
Alan Baljeu

119

Một số điều cần kiểm tra:

Bạn có thể thay đổi thành không hạn chế?

Set-ExecutionPolicy Unrestricted

Chính sách nhóm có được thiết lập không?

  • Computer Configuration\Administrative Templates\Windows Components\Windows PowerShell
  • User Configuration\Administrative Templates\Windows Components\Windows PowerShell

Ngoài ra, bạn đang gọi Script.ps1 như thế nào?

Điều này có cho phép nó chạy không?

powershell.exe -executionpolicy bypass -file .\Script.ps1

Giá trị mặc định cho Scopetham số là LocalMachine, vì vậy Set-ExecutionPolicy Unrestrictedthực sự giống với giá trị Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachinetôi đã thử. Có, Turn on Script Executionchính sách được kích hoạt cho Computer Configuration. PowerShellmở ra C:\Users\UserName, vì vậy tôi chỉ chạy .\Desktop\Script.ps1theo lời nhắc. Sử dụng đường dẫn tuyệt đối dẫn đến lỗi tương tự, cũng như việc gọi tập lệnh qua powershell.exe.
BACON

Bạn đã thử tắt cài đặt chính sách nhóm và làm mới bằng gpupdate /forcechưa? (Khởi chạy lại PowerShell.exe sau)
Andy Arismendi

Chà, trong một thời gian dài tôi đã chạy như UnrestrictedLocalMachinephạm vi, nhưng khi tôi bắt đầu viết tập lệnh, tôi muốn chạy từ các máy tính khác, tôi đã đặt LocalMachinelại Undefinedvà thêm Chính sách nhóm hiện tại để đặt RemoteSignedMachinePolicyphạm vi. Đây chỉ là một kịch bản thử nghiệm một lần và thực sự không có vấn đề gì lớn nếu chạy nó từ mạng, tôi chỉ muốn biết tại sao nó không hoạt động cục bộ. Rốt cuộc, một tập lệnh được tạo cục bộ nên được phép thực thi bên dưới RemoteSigned, phải không? Tôi chỉ nghĩ rằng phải có điều gì đó mà tôi đang thiếu hoặc không hiểu.
BACON

@BACON Bạn nói đúng về việc RemoteSignedlưu Write-Host hibằng notepad vào màn hình của bạn sẽ chạy tốt. Cấu hình của bạn cũng có vẻ ổn ... Có điều gì đó với tôi dường như bị hỏng ... đó là lý do tại sao tôi đề xuất xóa chính sách nhóm để xem nó có hữu ích không.
Andy Arismendi

1
Để phát triển, chúng tôi chỉ sử dụng -executionpolicy bypassđể tạm thời vượt qua vấn đề được thiết kế từ xa ... và điều đó cho phép chúng tôi phát hiện và gỡ lỗi các vấn đề khác (không liên quan, yêu cầu chúng tôi nâng cấp PowerShell).
Doug_Ivison

13

Cuối cùng tôi đã theo dõi điều này đến Bảo mật truy cập mã .NET . Tôi có một số mô-đun nhị phân được phát triển nội bộ được lưu trữ và thực thi từ một mạng chia sẻ. Để .NET 2.0 / PowerShell 2.0 tải chúng, tôi đã thêm quy tắc URL vào Intranetnhóm mã để tin cậy thư mục đó:

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -listgroups
Microsoft (R) .NET Framework CasPol 2.0.50727.5420
Copyright (c) Microsoft Corporation.  All rights reserved.

Security is ON
Execution checking is ON
Policy change prompt is ON

Level = Machine

Code Groups:

1.  All code: Nothing
    1.1.  Zone - MyComputer: FullTrust
        1.1.1.  StrongName - ...: FullTrust
        1.1.2.  StrongName - ...: FullTrust
    1.2.  Zone - Intranet: LocalIntranet
        1.2.1.  All code: Same site Web
        1.2.2.  All code: Same directory FileIO - 'Read, PathDiscovery'
        1.2.3.  Url - file://Server/Share/Directory/WindowsPowerShell/Modules/*: FullTrust
    1.3.  Zone - Internet: Internet
        1.3.1.  All code: Same site Web
    1.4.  Zone - Untrusted: Nothing
    1.5.  Zone - Trusted: Internet
        1.5.1.  All code: Same site Web

Lưu ý rằng, tùy thuộc vào phiên bản .NET được cài đặt và đó là Windows 32 hay 64 bit, caspol.execó thể tồn tại ở các vị trí sau, mỗi vị trí có cấu hình bảo mật riêng ( security.config):

  • $Env:SystemRoot\Microsoft.NET\Framework\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework\v4.0.30319\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v4.0.30319\

Sau khi xóa nhóm 1.2.3....

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -remgroup 1.2.3.
Microsoft (R) .NET Framework CasPol 2.0.50727.9136
Copyright (c) Microsoft Corporation.  All rights reserved.

The operation you are performing will alter security policy.
Are you sure you want to perform this operation? (yes/no)
yes
Removed code group from the Machine level.
Success

... Tôi chỉ còn lại cấu hình CAS mặc định và các tập lệnh cục bộ hiện hoạt động trở lại. Đã được một thời gian kể từ khi tôi tìm hiểu CAS và tôi không chắc tại sao quy tắc của tôi dường như gây trở ngại cho những người cấp FullTrustcho MyComputer, nhưng vì CAS không được chấp nhận kể từ .NET 4.0 (dựa trên PowerShell 3.0), tôi đoán đó là một điểm tranh luận bây giờ.


Bạn đã thêm quy tắc URL như thế nào? Tôi đã gặp vấn đề tương tự và hy vọng điều này có thể giúp tôi giải quyết nó. Cảm ơn.
OptimusPrime ngày

Đã rất lâu kể từ khi tôi làm việc với caspol.exe, nhưng sau khi chạy, caspol.exe -machine -addgroup 1.2 -url file://Server/Share/Directory/WindowsPowerShell/Modules/* FullTrusttôi đã kết thúc với cùng một 1.2.3.quy tắc được thấy trong câu trả lời này. Tôi đang sử dụng file://URL để tham chiếu đến một thư mục trên chia sẻ SMB, mặc dù tôi thấy trong tài liệu, một trong những -addgroup ví dụ sử dụng đường dẫn UNC.
BACON ngày

11

Tôi đã phát hiện ra khi chạy tệp PS1 cho ổ đĩa được Ánh xạ tới Dropbox rằng tôi luôn gặp lỗi này. Khi mở thuộc tính cho PS1, không có "Bỏ chặn".

Điều duy nhất phù hợp với tôi là

powershell.exe -executionpolicy bypass -file. \ Script.ps1


1
Bạn nói rằng tập lệnh của bạn được lưu trữ trên một ổ đĩa được ánh xạ tới một mạng chia sẻ? Hay script tạo một ổ đĩa được ánh xạ? Nếu trước đó, như đã nêu trong phần nội dung và tiêu đề của câu hỏi, tập lệnh được tạo và lưu trữ cục bộ, vì vậy nguồn gốc / vùng của tập lệnh sẽ không phải là một yếu tố. Dù bằng cách nào, việc sử dụng Bypasschính sách thực thi đã được đề xuất hơn năm năm trước và gần đây là năm tháng trước . Vui lòng đọc câu hỏi và câu trả lời hiện có trước khi trả lời.
BACON

6

Nếu tệp được sao chép từ một vị trí mạng, tức là một máy tính khác, Windows có thể đã chặn tệp đó. Nhấp chuột phải vào tệp và nhấp vào nút bỏ chặn và xem nó có hoạt động hay không.


2
Như tôi đã giải thích trong cả câu hỏi và nhận xét của tôi về câu trả lời của @ O-Dogg, tập lệnh đang được tạo trực tiếp trên ổ cứng của tôi (không phải tải xuống từ bất kỳ đâu) và tôi xác nhận rằng không có luồng thay thế nào xác định nó có nguồn gốc từ một khu vực khác (như Internet Explorer và các trình duyệt web khác tạo). Nếu tôi chạy, 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;tôi vẫn gặp lỗi rằng tập lệnh không được ký điện tử và nó không được thực thi. Nếu tôi mở hộp thoại Thuộc tính cho tệp mới tạo thì không có gì để bỏ chặn.
BACON

Đáng kiểm tra rằng bạn không tạo và chạy nó trên một ổ đĩa được ánh xạ. Trên máy chủ của chúng tôi, ví dụ, thư mục chính cho mỗi người dùng là một ổ đĩa được ánh xạ tới thư mục cá nhân của họ.
Caltor

0

Đây là một vấn đề IDE. Thay đổi cài đặt trong PowerShell GUI. Chuyển đến tab Công cụ và chọn Tùy chọn, sau đó chọn Tùy chọn gỡ lỗi . Sau đó, chọn hộp Tắt yêu cầu đối với tập lệnh được ký . Làm xong.


OP rõ ràng không muốn các tập lệnh chạy không có dấu và không tham chiếu đến IDE.
kfsone

1
Không có trong Powershell ISE
Josh Noe

0

Điều phù hợp với tôi là nhấp chuột phải vào tệp .ps1 và sau đó là thuộc tính. Nhấp vào nút "UNBLOCK". Hoạt động tuyệt vời làm tôi cảm thấy hứng thú sau hàng giờ cố gắng thay đổi các chính sách.


1
Đã có hai câu trả lời bỏ qua những gì được nêu trong câu hỏi và đề xuất giải pháp tương tự không thể áp dụng này. Tôi đã viết rất rõ ràng "Tôi ... đã sử dụng tiện ích luồng của Sysinternals và hộp thoại Thuộc tính tệp để xác nhận rằng tập lệnh không được coi là đến từ Internet" và sau đó "nó được tạo và thực thi cục bộ". Nó thậm chí còn nói ngay trong tiêu đề rằng tập lệnh được "tạo cục bộ". Không có gì để bỏ chặn. Nếu việc bỏ chặn tập lệnh giải quyết được vấn đề của bạn thì bạn đã không gặp phải vấn đề tương tự như tôi gặp phải vì như đã nêu, tập lệnh của tôi không bị chặn. -1.
BACON

1
@BACON công bằng mà nói, tôi cũng có các triệu chứng giống như bạn đã làm và đối với tôi, việc bỏ chặn đã hoạt động. Ngay cả khi nghĩ rằng tập lệnh của tôi đã được tạo cục bộ, tôi phải mở khóa nó mỗi lần sau khi lưu nó.
SQB

Đây là có thể là một công việc xung quanh nhưng không phải là giải pháp đúng đầy đủ
Mo Zaatar

0

Vui lòng tạo bản sao lưu cho tệp script.bs1

Điều phù hợp với tôi là xóa tệp script.bs1 và chạy lệnh thực thi.


1
Thông báo lỗi bạn nhận được đã được giải quyết bằng cách thực hiện việc này là gì?
BACON

Tôi đã trải qua lỗi này 2 lần khác nhau và sửa nó theo cùng một cách. Có vẻ như chạy lệnh thực thi từ CMD sẽ chạy ngay lập tức trên tệp khác có cùng tên nhưng có phần mở rộng (.cmd).
Tóm tắt đơn giản

Không thể tải tệp C: \ Users \ UserName \ Desktop \ Script.ps1. Tệp C: \ Users \ UserName \ Desktop \ Script.ps1 không được ký điện tử. Tập lệnh sẽ không thực thi trên hệ thống. ((Lỗi script.ps1 không được ký điện tử))
Simple Abstraction

Tôi hiểu rồi. Và những gì được trả lại khi bạn chạy Get-ExecutionPolicy -List?
BACON

MachinePolicy AllSigned, UserPolicy Undefined, Process Undefined, CurrentUser RemoteSigned, LocalMachine Bypass
Simple Abstraction

-1

Chọn dòng lệnh Terminal của bạn Command Prompt thay vì Power shell. Cần làm việc.


2
Điều này thậm chí còn có ý nghĩa gì? Chọn nó ở đâu? Mục tiêu là chạy một tập lệnh PowerShell trong PowerShell, vì vậy việc sử dụng bất kỳ thứ gì khác ngoài PowerShell sẽ không hoạt động.
BACON

-1

Khi bạn chạy tập lệnh .ps1 PowerShell, bạn có thể nhận được thông báo cho biết “.ps1 không được ký điện tử. Tập lệnh sẽ không thực thi trên hệ thống ”. Để khắc phục, bạn phải chạy lệnh bên dưới để chạy Set-ExecutionPolicy và thay đổi cài đặt Chính sách thực thi.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Một câu trả lời khác đã đề xuất sử dụng Bypasschính sách thực thi. Dù sao, sử dụng một chính sách khác cũng không hữu ích và không giải quyết được vấn đề thực tế nếu RemoteSignedthực sự là điều cần thiết. Cuối cùng, thông báo lỗi bạn tham chiếu không giống như trong câu hỏi.
BACON

-2

Tôi đang gặp sự cố tương tự và đã khắc phục nó bằng cách thay đổi chương trình mặc định để mở tệp .ps1 thành PowerShell. Nó đã được đặt thành Notepad .


Bạn đã có cùng một vấn đề này? Hoặc khi bạn nhấp đúp vào .ps1tệp, tệp đó sẽ mở trong Notepad thay vì thực thi tập lệnh trong PowerShell?
BACON

-2

Thử chạy GUI Powershell với tư cách Quản trị viên


3
Như đã nêu trong câu hỏi I am both a domain administrator and a local administrator,. Chạy PowerShell nâng cao sẽ không tạo ra sự khác biệt vì tập lệnh được phép chạy không được giải quyết khi được lưu trữ trên một mạng chia sẻ.
BACON

-4

Chạy 2 lệnh dưới đây trong cửa sổ PowerShell

  1. Set-ExecutionPolicy không hạn chế

  2. Bỏ chặn-Tệp-Đường dẫn D: \ PowerShell \ Script.ps1


2
Rõ ràng là bạn đã không đọc câu hỏi hoặc các câu trả lời lâu đời khác đề xuất các biến thể của cùng một giải pháp không thể áp dụng này hoặc nhận xét của tôi nói đi nói lại rằng đây không phải là câu trả lời. Tôi sẽ -10 điều này nếu tôi có thể, nhưng thay vào đó tôi sẽ phải giải quyết cho -1.
BACON
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.