web-dev-qa-db-ja.com

ローカルで作成されたスクリプトがRemoteSigned実行ポリシーで実行できないのはなぜですか?

64ビットでWindows PowerShell 2.0を使用しています Windows 7 Professional 。デスクトップにスクリプトを実行すると、次のエラーが発生します。

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

私はドメイン管理者でもローカル管理者でもあり、Get-ExecutionPolicy -Listを実行すると、PowerShellを構成するために作成したGroup Policy ObjectがマシンレベルでRemoteSigned実行ポリシーを正しく適用していることがわかります。

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

自分で Notepad でスクリプトを作成し、 Sysinternals ' streams ユーティリティとファイルPropertiesダイアログを使用して、スクリプトがインターネットから来たものとして扱われていません。ドメインサーバー上のネットワーク共有にスクリプトをコピーすると、実行が許可されます。 Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachineを実行すると、ローカルスクリプトの実行はまだ許可されません。これは、MachinePolicyスコープの実行ポリシーが優先されるため、意味があります。

about_Execution_Policies で文書化されているように、RemoteSignedポリシーの意味は次のとおりです。

  • スクリプトを実行できます。

  • インターネットからダウンロードされたスクリプトおよび構成ファイル(電子メールおよびインスタントメッセージングプログラムを含む)に対して、信頼できる発行元からのデジタル署名が必要です。

  • 実行したスクリプトやローカルコンピューター(インターネットからダウンロードしたものではない)に記述したスクリプトにデジタル署名を必要としません。

  • インターネット以外のソースから署名されていないスクリプト、および署名されているが悪意のあるスクリプトを実行するリスク。

私のスクリプトは署名されていませんが、ローカルで作成および実行されるため、上記の3番目の箇条書きを満たす必要があります。では、なぜ実行が許可されていないのですか? PowerShellが、その要件がインターネットからのファイルにのみ適用されるべきなのに、私のスクリプトが「デジタル署名されていない」と文句を言うのはなぜですか?そして、なぜネットワーク共有から実行されたときにスクリプトが署名されないことを気にしないのですか?

47
BACON

最終的にこれを 。NETコードアクセスセキュリティ に追跡しました。ネットワーク共有に保存され、ネットワーク共有から実行される、内部的に開発されたバイナリモジュールがいくつかあります。 .NET 2.0/PowerShell 2.0をロードしてそれらをロードするために、そのディレクトリを信頼するIntranetコードグループにURLルールを追加しました。

PS C:\Users\UserName> & "$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

.NETのどのバージョンがインストールされているか、32ビットまたは64ビットWindowsのいずれであるかに応じて、caspol.exeは次の場所に存在でき、それぞれ独自のセキュリティ構成(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\

グループ1.2.3(CASのデフォルト構成のままにしておきます)を削除した後、ローカルスクリプトが再び機能するようになりました。 CASをいじくり始めてからしばらく経ちますが、FullTrustからMyComputerを付与するルールに私のルールが干渉するように見える理由はわかりませんが、 CASは非推奨です.NET 4. (PowerShell 3.0のベース)であるため、今は議論の余地があると思います。

7
BACON

ファイルはブロックされていますか?私は同じ問題を抱えていたので、.PS1ファイルを右クリックして[プロパティ]を選択し、[ブロックを解除]を選択することで解決できました。

82
O-Dogg

確認すること:

無制限に変更できますか?

Set-ExecutionPolicy Unrestricted

グループポリシーは設定されていますか?

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

また、Script.ps1をどのように呼び出していますか?

これで実行できますか?

powershell.exe -executionpolicy bypass -file .\Script.ps1
47
Andy Arismendi

ファイルがネットワーク上の場所、つまり別のコンピューターからコピーされた場合、Windowsはそのファイルをブロックしている可能性があります。ファイルを右クリックし、ブロック解除ボタンをクリックして、機能するかどうかを確認します。

5
shyam

これはIDE問題です。 PowerShell GUIで設定を変更します。 ツールタブに移動し、オプションを選択してからデバッグオプションを選択します。次に、ボックススクリプトの署名の要件をオフにするをオンにします。できた.

1
bdubb

Powershell GUIを管理者として実行してみてください

0
Pauline

DropboxにマップされたドライブのPS1ファイルを実行すると、このエラーが常に発生することがわかりました。 PS1のプロパティを開くとき、「ブロック解除」はありません。

私のために働く唯一のものは

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

0
GeekMustHave