PowerShellスクリプトの実行を有効にする方法


260

PowerShellスクリプトを実行しようとすると、次のエラーが表示されます。

このシステムではスクリプトの実行が無効になっているため、ファイルC:\ Common \ Scripts \ hello.ps1をロードできません。詳細については、「get-help about_signing」を参照してください。
1行目:char:13
+。\ hello.ps1 <<<<
+ CategoryInfo:NotSpecified:(:) []、PSSecurityException
+ FullyQualifiedErrorId:RuntimeException

回答:


400
  1. [管理者として実行]オプションを使用してWindows PowerShellを起動します。コンピューターのAd​​ministratorsグループのメンバーのみが実行ポリシーを変更できます。

  2. 次を入力して、署名されていないスクリプトの実行を有効にします。

    set-executionpolicy remotesigned
    

これにより、ローカルコンピューターで作成した署名されていないスクリプトと、インターネットからの署名されたスクリプトを実行できます。

Microsoft TechNet Libraryのスクリプトの実行も参照してください。


3
これによりポリシーが永続的に変更されますか、またはコンピューターを再起動するたびにこれを行う必要がありますか?
レイ

2
@Rayこれはポリシーを永続的に変更します。
パベルチュチュヴァ

1
@Ray ドキュメントを参照してください。デフォルトでは、に設定しますLocalMachine。他のスコープ(CurrentUserまたはProcess)を設定するには、-Scope明示的に渡します。
jpmc26

@PavelChuchuvaは、意図したスクリプトの上にこの行を追加する必要があります
FabioSpaghetti

@FabioSpaghettiスクリプトに何かを追加する必要はありません。手順に従って、このコマンドを1回実行するだけです。
パベルチュチュヴァ

74

デフォルトの実行ポリシーは制限付きに設定されています。次のように入力して確認できます。

Get-ExecutionPolicy

無制限モードにするには、次を入力する必要があります。

Set-ExecutionPolicy unrestricted

お役に立てれば


13
ユーザーがインターネットから悪意のあるスクリプトをコピーして貼り付けることを期待している場合、署名が必要です。ユーザーが愚かではないと仮定すると、「リモート署名」はセキュリティを追加せず、生活を難しくします。
グス

@Guss:これをテストすると、RemoteSignedはローカルで生成された.ps1ファイルに署名する必要がなくなり、gitソース管理をローカルソースとして扱います。
ジョシュア

@ジョシュア-はい、私のポイントは正確に。RemoteSignedコピーと貼り付けをブロックしない場合、gitまたはその他のIE以外のダウンロードメソッドをブロックしない場合、何に適していますか?「絶対に何もない!」と言ってください。100ドルのコード署名証明書でスクリプトに署名することは無用であり、愚かで、まともなスクリプト言語がWindowsで実行できるすべての利点を無効にしていると思います。進むべき道が;-)働くことは決してありませんよう、Nahhhh ...その後、我々はあまりにもかなった上であってもよいし、ユーザーがPSスクリプトを使用するためにやっているのかを理解してもらうのであればそれは、言われている
GUSS

@Guss:私はすでにWindowsで優れたスクリプト言語を入手しています。CygwinはWindows 10でうまく機能します。文字通り、以前のバージョンのWindowsよりもずっと優れているように。他の誰かがすでに書いたスクリプトを実行したいだけです。
ジョシュア

61

スクリプトの開発に使用するマシンでは、上記のように-unrestrictedを使用します。ただし、エンドユーザーマシンにスクリプトを展開するときは、-executionpolicyスイッチを使用してpowershellを呼び出すだけです。

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

2
このトリックを.CMDファイルのポリグロットトリックと組み合わせることができます。参照してくださいstackoverflow.com/a/8597794/5314
ジェイBazuzi

いいね!winrar rarlabs.com
1

1
このトリックにより、Git Bash(MINGW32 bash)からpowershellスクリプトを実行できました
Kamil Szot 14

16

以下のコマンドで現在のExecutionPolicyのステータスを取得できます。

Get-ExecutionPolicy;

デフォルトではRestrictedです。PowerShellスクリプトの実行を許可するには、このExecutionPolicyをBypassまたはUnrestrictedに設定する必要があります。

以下のPowerShellコマンドのいずれBypassUnrestrictedを使用して、または現在のユーザーのポリシーを設定できます。

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

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

無制限のポリシーは、すべての構成ファイルをロードし、すべてのスクリプトを実行します。インターネットからダウンロードした未署名のスクリプトを実行すると、実行する前に許可を求めるプロンプトが表示されます。

一方、バイパスポリシーでは、何もブロックされず、スクリプトの実行中に警告やプロンプトは表示されません。バイパス実行ポリシーは、無制限よりも緩和されています。


5

Windowsのバージョンと構成によっては、Unrestrictedモードであっても次の警告が表示される場合があります。

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")

解決策は、次のコマンドで有効にされた「バイパス」ポリシーを使用することです。

Set-ExecutionPolicy Bypass

ドキュメントから:

バイパス:何もブロックされず、警告もプロンプトもありません。

これは明らかに安全ではありません。関連するリスクを理解してください。


これは、PowerShell 2.0を使用してWINE環境でスクリプトを実行できる唯一の方法でした。ありがとうございました。
Wyatt8740

@ Wyatt8740:wineはすべてのドライブをネットワークドライブとして提示するためです。
ジョシュア

@ジョシュア私は知らなかった。その声明の出典を教えてもらえますか?私はカジュアルなグーグルを試しましたが、明らかに間違っているようです。
Wyatt8740

@ Wyatt8740:ソース:Wine OpenFileNameコモンダイアログボックス。ドライブのアイコンを見てください。
ジョシュア

@Joshua私はソースコードのソースを意味していました。アイコンはおそらく任意です。しかし、私はそれを考えていませんでした。始めるのに良い場所だと思います(編集:ここにいるようには見えません
Wyatt8740

2

次の
レジストリキー:Windowsレジストリエディターバージョン5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows \ PowerShell] "EnableScripts" = dword:00000001 "ExecutionPolicy" = "バイパス"

そして:

Windows Registry Editor Version 5.00

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

確かに動作します。


1

何らかの理由で、PowerShellコマンドレットは、ローカルユーザーコンテキストに対してのみローカル実行をグローバルに有効にしませんでした。たとえば、独自のユーザーコンテキストで実行されるCygWinのbashプロンプト内からPowershellスクリプトを開始しようとすると、実行されず、「デジタル署名されていません」というエラーが表示されます。答えは、ローカルグループポリシーエディター->ローカルコンピューターポリシー->管理用テンプレート-> Windowsコンポーネント-> Windows PowerShellに移動し、「スクリプトの実行を有効にする」をダブルクリックすることでした。次に、これを「有効」に変更してから、「ローカルスクリプトとリモート署名済みスクリプトを許可する」の実行ポリシーを変更し、ユーザーコンテキストに関係なくグローバルに動作させます。


0

受け入れられた答えは正しいですが、ポリシーの変更は、Powershellの現在実行中のインスタンス、つまりPowershellのインスタンスがシャットダウンされた場合にのみ利用可能です。ポリシーがリセットされます。ユーザーがPowershellの別のインスタンスを再度開くと、デフォルトポリシーが適用されます。Restricted

私にとっては、VisualStudio Codeコンソールとcygwinのg ++​​を使用してビルドする必要があります。コンソールはPowershellを使用しており、デフォルトポリシーでは何も実行できません。1つの解決策は、VisualStudio Codeコンソールでコンソールが起動されるたびにポリシーを変更することです。おそらく、ポリシーを変更するスクリプトです。

私は怠zyなので、別の解決策は、Powershellを管理モードで実行するときです。受け入れられた答えと同じです。ただし、レジストリテーブルの値を変更する追加のパラメーターを使用します。完了したら。Powershellの他のインスタンスはRemoteSigned、デフォルトでポリシーを使用します。

set-executionpolicy remotesigned -Scope CurrentUser


0

ポリシーを(正しく)設定することが最良の選択ですが、管理対象システムでは、そのポリシーを変更する機能がありません。

私にとって、ポリシーを変更する最も簡単な回避策は、「PowerShell ISE」でスクリプトを開き、 実行するコード(またはコードの一部)を強調表示して、「選択を実行」ボタンをクリックすることです(またはF8ショートカット)。

これは最適なソリューションではなく、タスクの自動化にはほとんど役立ちませんが、IS部門とは別に実行することなく、PowerShellの使用とユーティリティを許可します。


-2

regキーが機能する理由は、PSコマンドが行うことを正確に行っているためです。コマンドは、変更をregキーに書き込みます。コマンドは、regキーを作成したり、レジストリに掘り込んだりするよりもはるかに迅速かつ簡単です。


1
それは間違っています:他の回答で言及されたキーは、powershells実行ポリシーを変更し、powershellスクリプトを実行できるようにします。
パトリックR.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.