目次:
- WindowsとPowerShellがスクリプトの実行を妨げる理由とその理由
- .PS1ファイルの関連付けを変更する。
- PowerShell ExecutionPolicy設定の変更
- PowerShellスクリプトを管理者として実行します。
- 仕上げ。
- それをスピンのために取る。


WindowsとPowerShellがスクリプトの実行を妨げる理由とその理由
PowerShellは事実上、Windowsシステム上のCMDとバッチスクリプトを置き換えるコマンドシェルとスクリプト言語です。そのため、PowerShellスクリプトはコマンドラインから手作業で行うことができるように設定することができます。これは、システム上で実際にユーザーアカウント上の制限まで、あらゆる変更を可能にすることに相当します。ですから、PowerShellスクリプトをダブルクリックして管理者権限で実行するだけであれば、このようなシンプルな1つのライナーは本当にあなたの日を壊すことになります。
Get-ChildItem '$env:SystemDrive' -Recurse -ErrorAction SilentlyContinue | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
上記のコマンドを実行しないでください!
それは単にファイルシステムを通過し、可能な限り削除します。興味深いことに、これにより、たとえ昇格したセッションから実行されたとしても、システムが思うように素早く動作不能になることはありません。しかし、このスクリプトを実行した後に誰かがあなたに電話をかけた場合、突然ファイルを見つけられない、またはプログラムを実行することができないため、「それをもう一度やり直す」とすれば、Windows Startup Repair問題を解決するためには何もできません。悪化するのは、ファイルシステムを切り捨てるスクリプトを入手する代わりに、あなたの友人がキーロガーやリモートアクセスサービスをダウンロードしてインストールすることに騙される可能性があるということです。その後、スタートアップ修理について質問するのではなく、銀行詐欺に関するいくつかの質問を警察に依頼することになります。
今のところ、エンドユーザーを自分自身から守るためには、何かが必要なのは明らかです。しかし、パワーユーザー、システム管理者、その他のオタクは、これらの脅威に少し気を付け、例外を見つけて簡単に回避する方法を知っていて、通常は作業を完了したいと思っています。これを行うには、いくつかの道路ブロックを無効にするか、回避する必要があります。
- PowerShellでは、既定で外部スクリプトの実行は許可されません。 PowerShellのExecutionPolicy設定は、デフォルトでWindowsのすべてのバージョンで外部スクリプトの実行を防ぎます。一部のWindowsバージョンでは、デフォルトではスクリプトの実行がまったく許可されていません。 Windows 7でのPowerShellスクリプトの実行を許可する方法でこの設定を変更する方法を説明しましたが、ここでもいくつかのレベルで説明します。
- PowerShellはデフォルトで.PS1ファイル拡張子に関連付けられていません。 これをPowerShell Geek Schoolシリーズで始めました。 Windowsでは、PowerShellコマンドインタープリタに送信するのではなく、.PS1ファイルの既定の動作をメモ帳で開くように設定します。悪質なスクリプトを単にダブルクリックするだけで偶発的に実行されるのを防ぐためです。
- 一部のPowerShellスクリプトは、管理者権限なしでは動作しません。 管理者レベルのアカウントで実行している場合でも、特定の操作を実行するには、ユーザーアカウント制御(UAC)を実行する必要があります。コマンドラインツールでは、これは少し難しいかもしれません。私たちはUACを無効にしたくはありませんが、対処が簡単にできればいいです。
これらの同じ問題は、バッチファイルを使用してPowerShellスクリプトを実行しやすくする方法、バッチファイルを作成して一時的に回避する方法について説明しています。ここでは、より長期的なソリューションでシステムを設定する方法を説明します。排他的に使用されていないシステムでは、これらの変更を一般的に行うべきではないことに注意してください。そうしないと、他のユーザーがこれらの機能を阻止するのと同じ問題にぶつかるリスクが高くなります。
.PS1ファイルの関連付けを変更する。
最初に、そしておそらく最も重要なことは、回避することです.PS1ファイルのデフォルトの関連付けです。 PowerShell.exe以外のファイルにこれらのファイルを関連付けることは、望ましくないスクリプトが誤って実行されるのを防ぐのに役立ちます。 PowerShellには、PowerShellスクリプトの編集用に特別に設計されたISE(Integrated Scripting Environment)が付属しているため、デフォルトでメモ帳で.PS1ファイルを開く必要があるのはなぜですか?ダブルクリック・ツー・ラン機能を有効にする準備が整っていない場合でも、これらの設定を調整することをお勧めします。
.PS1ファイルの関連付けは、デフォルトプログラムのコントロールパネルで任意のプログラムに変更できますが、直接レジストリを掘り下げることで、ファイルのオープン方法をさらに細かく制御できます。これにより、.PS1ファイルのコンテキストメニューで利用できる追加のオプションを設定または変更することもできます。これを行う前に、レジストリのバックアップを作成することを忘れないでください!
PowerShellスクリプトのオープン方法を制御するレジストリ設定は、次の場所に格納されます。
HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1Shell
これらの設定を変更する前にこれらの設定を調べるには、そのキーとそのサブキーをRegeditで見てください。シェルキーには、 "Open"に設定されている "(デフォルト)"という値が1つだけあります。これは、ファイルをダブルクリックするためのデフォルトのアクションへのポインタです。サブキーに表示されます。
Shellキーを展開すると、3つのサブキーが表示されます。これらのそれぞれは、PowerShellスクリプトに固有の動作を実行できます。
各キーを展開して値を調べることができますが、基本的には次のデフォルト値と同じです。
- 0 - PowerShellで実行します。 "Run with PowerShell"は、実際にPowerShellスクリプトのコンテキストメニューに既にあるオプションの名前です。テキストは、他の場所と同じようにキー名を使用する代わりに、別の場所から引っ張られます。それはまだデフォルトのダブルクリックアクションではありません。
- 編集 - PowerShell ISEで開きます。これはメモ帳よりはるかに理にかなっていますが、デフォルトで.PS1ファイルを右クリックする必要があります。
- 開く - メモ帳で開く。このキー名は、シェルキーの "(デフォルト)"値に格納されている文字列でもあることに注意してください。これは、ファイルをダブルクリックすると開くことを意味し、その操作は通常メモ帳を使用するように設定されています。
すでに用意されている既成のコマンド文字列を使用したい場合は、Shellキーの "(Default)"値を変更して、ダブルクリックするキーに一致するキーの名前と一致させることができます。これはRegeditの中から簡単に行うことができます。また、PowerShellのレジストリを調べるためのチュートリアルのレッスンや小さなPSDriveを使って、システムを構成できる再利用可能なスクリプトを作成することもできます。以下のコマンドは、管理者としてCMDを実行するのと同様に、昇格したPowerShellセッションから実行する必要があります。
まず、デフォルトでは設定されていないため、PSDriveをHKEY_CLASSES_ROOT用に設定する必要があります。このコマンドは次のとおりです。
New-PSDrive HKCR Registry HKEY_CLASSES_ROOT
通常のHKCUとHKLM PSDrivesの場合と同じように、HKEY_CLASSES_ROOTのレジストリキーと値をナビゲートして編集できます。
PowerShellスクリプトを直接起動するようにダブルクリックを設定するには:
Set-ItemProperty HKCR:Microsoft.PowerShellScript.1Shell '(Default)' 0
PowerShell ISEでPowerShellスクリプトを開くためのダブルクリックを設定するには:
Set-ItemProperty HKCR:Microsoft.PowerShellScript.1Shell '(Default)' 'Edit'
既定値を復元するには(メモ帳でPowerShellスクリプトを開くにはダブルクリックを設定します)
Set-ItemProperty HKCR:Microsoft.PowerShellScript.1Shell '(Default)' 'Open'
これはデフォルトのダブルクリックアクションを変更するための基本です。次のセクションでPowerShellスクリプトをエクスプローラからPowerShellで開いたときのPowerShellスクリプトの処理方法をカスタマイズする方法について詳しく説明します。スコープを設定すると、PSDriveがセッション間で永続するのを防ぐことができます。したがって、この目的のために作成した設定スクリプトの最初にNew-PSDrive行を追加するか、PowerShellプロファイルに追加することをお勧めします。それ以外の場合は、この方法で変更を加える前に、そのビットを手動で実行する必要があります。
PowerShell ExecutionPolicy設定の変更
PowerShellのExecutionPolicyは、悪意のあるスクリプトの実行を防ぐもう1つのレイヤーです。これには複数のオプションがあり、いくつかの設定方法があります。最も安全性の高いものから最も安価なものまで、利用可能なオプションは次のとおりです。
- 制限付き - スクリプトの実行は許可されていません。 (ほとんどのシステムではデフォルトの設定です)。これにより、プロファイルスクリプトが実行されなくなることさえあります。
- AllSigned - ユーザーにプロンプトを表示せずに実行するには、すべてのスクリプトに信頼できる発行元がデジタル署名する必要があります。信頼できないと明示的に定義されたパブリッシャによって署名されたスクリプト、またはデジタル署名されていないスクリプトは実行されません。 PowerShellは、パブリッシャによってスクリプトが署名されているかどうかを確認するメッセージを表示します。プロファイルスクリプトをデジタル署名しておらず、その署名に信頼関係が確立されていれば、それを実行することはできません。間違ったスクリプトを信頼しても悪質なスクリプトが実行される可能性があるため、信頼できるサイト運営者を注意してください。
- RemoteSigned - インターネットからダウンロードしたスクリプトの場合、これは事実上「AllSigned」と同じです。ただし、ローカルで作成されたスクリプトやインターネット以外のソースからインポートされたスクリプトは、確認プロンプトを表示せずに実行することができます。ここでは、どのデジタル署名を信頼するのか注意してください。さらに、実行するように選択した署名されていないスクリプトをより注意する必要があります。これは、デジタル署名をしなくても有効なプロファイルスクリプトを使用できる最高のセキュリティレベルです。
- Unrestricted - すべてのスクリプトは実行できますが、インターネットからのスクリプトに対しては確認のプロンプトが必要です。この時点から、信頼できないスクリプトの実行を避けることは、あなた次第です。
- バイパス - すべてが警告なしで実行されます。これには注意してください。
- 定義されていません - 現在のスコープにポリシーが定義されていません。これは、より低いスコープ(詳細は下記)またはOSのデフォルトに定義されたポリシーにフォールバックすることを許可するために使用されます。
Undefinedの説明で示唆されているように、上記のポリシーは、複数のスコープの1つまたは複数で設定できます。 -Listパラメーターを指定してGet-ExecutionPolicyを使用すると、すべてのスコープとその現在の構成を見ることができます。
スコープは優先順位の順に並べられ、最上位に定義されたスコープはすべてのスコープを上書きします。ポリシーが定義されていない場合、システムはデフォルト設定に戻ります(ほとんどの場合、これは制限されています)。
- MachinePolicyは、コンピュータレベルで有効なグループポリシーを表します。これは通常、ドメイン内でのみ適用されますが、ローカルでも実行できます。
- UserPolicyは、ユーザーに対して有効なグループポリシーを表します。これは通常、エンタープライズ環境でのみ使用されます。
- Processは、PowerShellのこのインスタンスに固有のスコープです。このスコープ内のポリシーの変更は、実行中の他のPowerShellプロセスには影響しません。このセッションが終了すると、無効になります。これはPowerShellの起動時に-ExecutionPolicyパラメータで設定することも、セッション内から適切なSet-ExecutionPolicy構文で設定することもできます。
- CurrentUserは、ローカルレジストリで構成され、PowerShellの起動に使用されたユーザーアカウントに適用されるスコープです。このスコープは、Set-ExecutionPolicyを使用して変更できます。
- LocalMachineは、ローカルレジストリで構成され、システム上のすべてのユーザーに適用されるスコープです。これは、Set-ExecutionPolicyが-Scopeパラメータなしで実行された場合に変更されるデフォルトのスコープです。システム上のすべてのユーザーに適用されるため、昇格したセッションからのみ変更できます。
この記事では主に、使いやすさを向上させるためにセキュリティを取り巻くことについて説明していますので、下位3つのスコープについて懸念しています。 MachinePolicyとUserPolicyの設定は、単純にバイパスされない制限的なポリシーを適用する場合にのみ、本当に便利です。プロセスレベル以下の変更を維持することにより、いつでも特定の状況に適したポリシー設定を簡単に使用できます。
セキュリティとユーザビリティのバランスを保つために、スクリーンショットに示されているポリシーがおそらく最適です。 LocalMachineポリシーをRestrictedに設定すると、通常はあなた以外の誰かがスクリプトを実行することができなくなります。もちろん、これは多くの努力をしなくても何をしているのかを知っているユーザーがバイパスすることができます。しかし、テクノロジーに詳しい知識のないユーザーは、PowerShellで突発的な何かを突発的に引き起こさないようにする必要があります。 CurrentUser(つまりyou)を[制限なし]に設定すると、コマンドラインから手動でスクリプトを実行できますが、インターネットからダウンロードしたスクリプトには注意が必要です。プロセスレベルのRemoteSigned設定は、PowerShellスクリプトの動作を制御するレジストリ値で、PowerShell.exeへのショートカットまたは(以下で説明するように)実行する必要があります。これにより、外部ソースからの(悪意のある可能性のある)スクリプトの意図しない実行に対してより強い障壁を置いて、あなたが書くスクリプトに対してダブルクリックの実行機能を簡単に実行できます。スクリプトを誤ってダブルクリックする方が、対話セッションから手動で呼び出すよりもはるかに簡単なので、ここでこれを実行します。
上記のスクリーンショットのようにCurrentUserおよびLocalMachineポリシーを設定するには、昇格したPowerShellセッションから次のコマンドを実行します。
Set-ExecutionPolicy Restricted Set-ExecutionPolicy Unrestricted -Scope CurrentUser
Explorerから実行されるスクリプトにRemoteSignedポリシーを適用するには、以前見ていたいずれかのレジストリキーの値を変更する必要があります。これは、PowerShellまたはWindowsのバージョンによっては、AllSignedを除くすべてのExecutionPolicy設定をバイパスするように設定されている場合があるため、特に重要です。コンピュータの現在の設定を確認するには、このコマンドを実行します(HKCR PSDriveが最初にマップされていることを確認してください)。
Get-ItemProperty HKCR:Microsoft.PowerShellScript.1ShellCommand | Select-Object '(Default)'
あなたのデフォルトの設定は、おそらく次の2つの文字列のいずれか、またはかなり似ています:
(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設定でスクリプトを実行するだけです。それは、より多くの事故の起こりやすい行動に対してより厳しい制限を適用することによって、より良いものにすることができますが、これはもともとダブルクリックでトリガーされることは意図されておらず、デフォルトポリシーは通常は制限されています。しかし、2番目のオプションは、実行可能なExecutionPolicy(制限付きであっても)を完全にバイパスしたものです。バイパスはProcessスコープに適用されるため、エクスプローラからスクリプトを実行するときに起動されるセッションにのみ影響します。しかし、これは、ポリシーが禁止されていると予想されるスクリプトを起動させてしまう可能性があることを意味します。
上記のスクリーンショットに沿って、エクスプローラから起動されたスクリプトのプロセスレベルExecutionPolicyを設定するには、照会したばかりのレジストリ値と同じレジストリ値を変更する必要があります。 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スクリプトのデフォルトアクションに組み込むことはお勧めしません。しかし、新しいコンテキストメニューオプションを追加することで、必要に応じて昇格したセッションでスクリプトを簡単に実行できるようになります。これは、すべてのファイルのコンテキストメニューに「Open with Notepad」を追加する方法と似ていますが、ここではPowerShellスクリプトを対象にします。また、前回の記事で使用したいくつかのテクニックを引き継ぐ予定で、レジストリハックの代わりにバッチファイルを使用してPowerShellスクリプトを起動しました。
Regeditでこれを行うには、シェルのキーに戻ります。
HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1Shell
そこで、新しいサブキーを作成します。それを「PowerShell(管理者)で実行する」と呼んでください。その下に、「コマンド」という別のサブキーを作成します。次に、[コマンド]の下にある "(デフォルト)"の値を次のように設定します。
'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe' '-Command' ''& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -File '%1'' -Verb RunAs}'
PowerShellで同じことを行うには、実際には今度は3行が必要です。新しいキーごとに1つ、Commandに「(デフォルト)」の値を設定する1つ。標高と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(Admin)で実行」と呼ばれるようになりました。
新しいオプションは、2つの連続するPowerShellインスタンスを生成します。最初は、 "-Verb RunAs"パラメータでStart-Processを使用して新しいセッションの昇格を要求する2番目のランチャだけです。そこから、スクリプトはUACプロンプトをクリックした後に管理者権限で実行できるはずです。
仕上げ。
人生を少しでも簡単にするのに役立つ、これを少し変更するだけです。 1つは、メモ帳機能を完全に取り除くことですか?編集中のコマンドキー(下)の「(デフォルト)」値を「開く」の下の同じ位置にコピーするだけです。
'C:WindowsSystem32WindowsPowerShellv1.0powershell_ise.exe' '%1'
または、あなたはPowerShellのこのビットを使用することができます(もちろん、AdminとHKCRがあります):
Set-ItemProperty HKCR:Microsoft.PowerShellScript.1ShellOpenCommand '(Default)' ''C:WindowsSystem32WindowsPowerShellv1.0powershell_ise.exe' '%1''
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コマンドのコマンドも提供します。最後のリマインダー:標高と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で実行する」アクションを使用する
UACをクリックした後、「PowerShell(Admin)で実行」アクションを使用して、
ProcessスコープでExecutionPolicyが動作していることを示すために、このビットのPowerShellコードを使用して、Windowsがファイルをインターネットから取得したものと見なすようにすることができます。
Add-Content -Path 'D:Script LabMyScript.ps1' -Value '[ZoneTransfer]`nZoneId=3' -Stream 'Zone.Identifier'
Image
幸いにも、私たちは-NoExitを有効にしました。さもなければ、そのエラーはちょうど点滅していて、われわれは知らなかっただろう!
Zone.Identifierはこれで削除できます:
Clear-Content -Path 'D:Script LabMyScript.ps1' -Stream 'Zone.Identifier'
有用な参考文献:
- バッチファイルからPowerShellスクリプトを実行する - Daniel Schroederのプログラミングブログ
- PowerShellの管理者権限の確認 - Hey、Scripting Guy!ブログ