PowerShellスクリプトをより簡単に機能するようにWindowsを構成する方法
WindowsとPowerShellには、エンドユーザーが日常業務の中で誤ってスクリプトを起動しないようにすることを目的とした、セキュリティ機能と既定の構成が組み込まれています。ただし、日常的に日常的に自分のPowerShellスクリプトを作成して実行する必要がある場合は、これはメリットよりも面倒なことになります。ここでは、セキュリティを完全に犠牲にすることなくこれらの機能を回避する方法を紹介します。.
WindowsとPowerShellがスクリプトの実行を妨げる方法とその理由.
PowerShellは事実上、Windowsシステム上のCMDおよびバッチスクリプトを置き換えることを目的としたコマンドシェルおよびスクリプト言語です。そのため、PowerShellスクリプトは、コマンドラインから手動で実行できるすべてのことを実行するようにほぼ構成できます。これは、ユーザーアカウントに課されている制限までは、システム上で実質的にあらゆる変更を可能にすることに相当します。したがって、PowerShellスクリプトをダブルクリックして完全な管理者権限で実行するだけでは、このような単純なワンライナーで一日が壊れる可能性があります。
Get-ChildItem "$ env:SystemDrive \" -Recurse -ErrorActionアイテムの削除-Force -Recurse -ErrorAction SilentlyContinue
上記のコマンドを実行しないでください!
それは単にファイルシステムを通過し、それができるものは何でも削除します。おもしろいことに、これはシステムがあなたが考えているほど速く動作不能にしないかもしれません - たとえ昇格されたセッションから実行されたとしても。しかし、このスクリプトを実行した後に誰かがあなたのファイルを見つけられなかったりいくつかのプログラムを実行することができないためにあなたに電話をかけた場合、おそらくそれをWindows Startup Repairに導きます。問題を解決するためにできることは何もありません。さらに悪いことに、ファイルシステムを破壊するだけのスクリプトを入手するのではなく、キーロガーまたはリモートアクセスサービスをダウンロードしてインストールするスクリプトを実行するように仕向けられる可能性があります。その後、スタートアップの修復について質問するのではなく、銀行の詐欺についていくつか質問をすることがあります。!
ここまでで、エンドユーザーを自分自身から保護するために、いわゆる特定のことが必要になる理由は明らかです。しかし、パワーユーザー、システム管理者、およびその他のオタクは、一般的に(例外はありますが)、これらの脅威をもう少し警戒して、それらを見つけ出して簡単に回避する方法を知っています。これを行うには、いくつかの障害を無効にするか回避する必要があります。
- PowerShellはデフォルトで外部スクリプトの実行を許可しません.
PowerShellのExecutionPolicy設定は、Windowsのすべてのバージョンで、デフォルトで外部スクリプトの実行を禁止します。一部のWindowsバージョンでは、デフォルトではスクリプトの実行がまったく許可されていません。 Windows 7でPowerShellスクリプトの実行を許可する方法でこの設定を変更する方法を説明しましたが、ここでもいくつかのレベルで説明します。. - PowerShellは、デフォルトでは.PS1ファイル拡張子に関連付けられていません.
私達は最初に私達のPowerShellオタク学校シリーズでこれを育てました。 Windowsは、.PS1ファイルをPowerShellコマンドインタープリタに送信するのではなく、メモ帳で開くようにデフォルトのアクションを設定します。これは、単にダブルクリックされたときに悪意のあるスクリプトが誤って実行されるのを直接防ぐためのものです。. - 一部のPowerShellスクリプトは管理者権限がないと機能しません.
管理者レベルのアカウントで実行している場合でも、特定の操作を実行するにはユーザーアカウント制御(UAC)を使用する必要があります。コマンドラインツールの場合、控えめに言ってもこれは少し面倒です。 UACを無効にしたくはありませんが、対処が簡単にできるようになればなおいいです。.
これらと同じ問題が、PowerShellスクリプトを実行しやすくするためのバッチファイルの使用方法でも発生します。ここでは、一時的に回避するためのバッチファイルの作成について説明します。今、私たちはあなたのシステムをもっと長期的な解決策でセットアップする方法をあなたに示すつもりです。一般に、自分で使用していないシステムではこれらの変更を行わないでください。そうしないと、他のユーザーがこれらの機能によって防止されるのと同じ問題に遭遇する危険性が高くなります。.
.PS1ファイルの関連付けを変更する.
最初の、そしておそらく最も重要なのは、.PS1ファイルのデフォルトの関連付けです。これらのファイルをPowerShell.exe以外のものに関連付けると、望ましくないスクリプトが誤って実行されるのを防ぐことができます。しかし、PowerShellには、PowerShellスクリプトを編集するために特別に設計された統合スクリプト環境(ISE)が付属していることを考えると、なぜデフォルトでメモ帳で.PS1ファイルを開きたいのでしょうか。ダブルクリックして実行する機能を完全に有効にする準備が整っていない場合でも、おそらくこれらの設定を微調整する必要があります。.
.PS1ファイルの関連付けをDefault Programsコントロールパネルでお好みのプログラムに変更することができますが、レジストリを直接掘り下げると、ファイルを開く方法をもう少し制御できるようになります。これにより、.PS1ファイルのコンテキストメニューで使用可能な追加オプションを設定または変更することもできます。これを行う前にレジストリのバックアップを作成することを忘れないでください!
PowerShellスクリプトを開く方法を制御するレジストリ設定は、次の場所に格納されています。
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell
変更を始める前にこれらの設定を調べるには、Regeditでそのキーとそのサブキーを見てください。 Shellキーには1つの値「(Default)」があり、それが「Open」に設定されているはずです。これは、ファイルをダブルクリックするためのデフォルトのアクションへのポインタです。これはサブキーに表示されます。.
シェルキーを展開すると、3つのサブキーが表示されます。これらはそれぞれ、PowerShellスクリプトに固有の、実行できるアクションを表しています。.
各キーを展開して値を調べることができますが、基本的には次のデフォルト値と同じです。
- 0 - PowerShellで実行します。 「Run with PowerShell」は、実際にはPowerShellスクリプトのコンテキストメニューにすでに存在するオプションの名前です。テキストは他の場所のようにキー名を使用するのではなく、他の場所から取得されるだけです。それでもまだデフォルトのダブルクリックアクションではありません.
- 編集 - PowerShell ISEで開きます。これはメモ帳よりもはるかに理にかなっていますが、それでも.PS1ファイルを右クリックしてデフォルトで実行する必要があります。.
- 開く - メモ帳で開きます。このキー名は、Shellキーの「(Default)」値に格納されている文字列でもあることに注意してください。これは、ファイルをダブルクリックするとファイルが「開く」ことを意味し、その動作は通常メモ帳を使用するように設定されます。.
すでに利用可能な事前に構築されたコマンド文字列を使い続けたい場合は、ダブルクリックする操作に一致するキーの名前と一致するように、Shellキーの「(Default)」値を変更するだけです。これはRegedit内から簡単に行うことができます。あるいは、PowerShellを使用してレジストリを探索する(および小さなPSDrive微調整)というチュートリアルから学んだ教訓を使用して、システムを構成できる再利用可能なスクリプトを構築し始めることができます。以下のコマンドは、管理者としてCMDを実行するのと同様に、昇格したPowerShellセッションから実行する必要があります。.
まず、PSDriveをHKEY_CLASSES_ROOTに設定します。これはデフォルトでは設定されていません。そのためのコマンドは次のとおりです。
New-PSDrive HKCRレジストリHKEY_CLASSES_ROOT
HKEY_CLASSES_ROOTのレジストリキーと値を通常のHKCUとHKLM PSDriveの場合と同じようにナビゲートして編集できます。.
ダブルクリックでPowerShellスクリプトを直接起動するように設定するには
Set-ItemProperty HKCR:\ Microsoft.PowerShellScript.1 \ Shell '(既定値)' 0
ダブルクリックを設定して、PowerShell ISEでPowerShellスクリプトを開くようにします。
Set-ItemProperty HKCR:\ Microsoft.PowerShellScript.1 \ Shell '(既定値) "編集"
デフォルト値に戻すには(ダブルクリックでメモ帳でPowerShellスクリプトを開くように設定します)。
Set-ItemProperty HKCR:\ Microsoft.PowerShellScript.1 \ Shell '(既定値) "開く"
これは、デフォルトのダブルクリックアクションを変更するための基本です。次のセクションでは、エクスプローラからPowerShellで開いたときのPowerShellスクリプトの処理方法のカスタマイズについて詳しく説明します。スコープを設定すると、PSDriveがセッションを超えて存続するのを防ぐことができます。そのため、この目的のために構築した設定スクリプトの先頭にNew-PSDrive行を含めるか、PowerShellプロファイルに追加することをお勧めします。それ以外の場合は、このように変更を加える前に手動でそのビットを実行する必要があります。.
PowerShellのExecutionPolicy設定を変更する.
PowerShellのExecutionPolicyは、悪質なスクリプトの実行に対する保護のもう1つの層です。これには複数の選択肢があり、設定方法はいくつかあります。最も安全なものから最も安全性の低いものまで、利用可能なオプションは次のとおりです。
- 制限付き - スクリプトを実行することはできません。 (ほとんどのシステムのデフォルト設定です。)これはあなたのプロファイルスクリプトの実行を妨げるでしょう。.
- AllSigned - すべてのスクリプトは、ユーザーに確認を求めずに実行するために、信頼できる発行元によってデジタル署名されている必要があります。信頼できないと明示的に定義されている発行元によって署名されたスクリプト、またはまったくデジタル署名されていないスクリプトは実行されません。信頼済みまたは未信頼として定義されていない発行元によってスクリプトが署名されている場合、PowerShellはユーザーに確認を求めます。プロファイルスクリプトにデジタル署名しておらず、その署名への信頼を確立していない場合は、実行できません。間違ったスクリプトを信頼している場合でも悪意のあるスクリプトを実行することになる可能性があるため、どのパブリッシャーを信頼しているかに注意してください。.
- RemoteSigned - インターネットからダウンロードされたスクリプトの場合、これは事実上「AllSigned」と同じです。ただし、ローカルで作成されたスクリプト、またはインターネット以外のソースからインポートされたスクリプトは、確認プロンプトなしで実行できます。ここでは、どのデジタル署名を信頼するかにも注意する必要がありますが、実行することを選択した署名されていないスクリプトにはさらに注意する必要があります。これは、デジタル署名しなくても作業用のプロファイルスクリプトを作成できる最高のセキュリティレベルです。.
- 制限なし - すべてのスクリプトの実行が許可されていますが、インターネットからのスクリプトには確認プロンプトが必要です。この時点から、信頼できないスクリプトを実行しないようにするのはあなた次第です。.
- バイパス - すべて警告なしで実行されます。これに注意してください.
- 未定義 - 現在のスコープでポリシーが定義されていません。これは、より低いスコープで定義されたポリシー(詳細は後述)またはOSのデフォルトにフォールバックするために使用されます。.
未定義の説明で示唆されているように、上記のポリシーは複数のスコープの1つ以上で設定できます。 Get-ExecutionPolicyを-Listパラメーターと共に使用すると、すべてのスコープとその現在の構成を確認できます。.
有効範囲は優先順位順にリストされており、定義されている最上位の有効範囲が他のすべてのものよりも優先されます。ポリシーが定義されていない場合、システムはデフォルト設定にフォールバックします(ほとんどの場合、これは制限付きです)。.
- MachinePolicyは、コンピュータレベルで有効なグループポリシーを表します。これは一般にドメインでのみ適用されますが、ローカルでも実行できます。.
- UserPolicyは、ユーザーに有効なグループポリシーを表します。これは通常、エンタープライズ環境でのみ使用されます。.
- プロセスは、PowerShellのこのインスタンスに固有の範囲です。この範囲でポリシーを変更しても、実行中の他のPowerShellプロセスには影響しません。また、このセッションが終了した後は無効になります。これは、PowerShellの起動時に-ExecutionPolicyパラメーターで構成することも、セッション内から適切なSet-ExecutionPolicy構文で設定することもできます。.
- CurrentUserは、ローカルレジストリで設定され、PowerShellを起動するために使用されるユーザーアカウントに適用されるスコープです。このスコープはSet-ExecutionPolicyで変更できます.
- LocalMachineは、ローカルレジストリに設定され、システム上のすべてのユーザーに適用されるスコープです。これは、Set-ExecutionPolicyが-Scopeパラメーターなしで実行された場合に変更されるデフォルトの有効範囲です。システム上のすべてのユーザーに適用されるため、昇格セッションからのみ変更できます。.
この記事は主にユーザビリティを容易にするためにセキュリティを回避することを目的としているため、下の3つのスコープについてだけ心配しています。 MachinePolicyとUserPolicyの設定が本当に便利なのは、単純にバイパスされていない制限的なポリシーを適用したい場合だけです。変更をプロセスレベル以下に抑えることで、特定の状況に適していると思われるポリシー設定をいつでも簡単に使用できます。.
セキュリティとユーザビリティのバランスをある程度保つために、スクリーンショットに示されているポリシーがおそらく最善です。 LocalMachineポリシーをRestrictedに設定すると、通常、自分以外の人によるスクリプトの実行が阻止されます。もちろん、これは多くの努力をせずに自分のしていることを知っているユーザーには回避できます。しかし、それは、技術に精通していないユーザーが誤ってPowerShellで壊滅的なことを引き起こしてしまうのを防ぐためです。 CurrentUser(つまり、you)をUnrestrictedに設定すると、コマンドラインから手動でスクリプトを実行できますが、インターネットからダウンロードされたスクリプトについては注意が必要です。プロセスレベルでのRemoteSigned設定は、PowerShell.exeへのショートカットで、または(以下で行うように)PowerShellスクリプトの動作を制御するレジストリ値で行う必要があります。これは、あなたが書くどんなスクリプトに対してもダブルクリックで簡単に実行できる機能を可能にする一方で、外部ソースからの(潜在的に悪意のある)スクリプトの意図しない実行に対する強い障壁を設けます。対話的なセッションから手動で呼び出すよりも、誤ってスクリプトをダブルクリックする方がはるかに簡単なので、ここでこれを行います。.
上のスクリーンショットのようにCurrentUserおよびLocalMachineポリシーを設定するには、昇格したPowerShellセッションから次のコマンドを実行します。
Set-ExecutionPolicy制限ありSet-ExecutionPolicy制限なし-Scope CurrentUser
Explorerから実行されるスクリプトにRemoteSignedポリシーを適用するには、先ほど見ていたレジストリキーの1つの中の値を変更する必要があります。 PowerShellまたはWindowsのバージョンによっては、AllSignedを除くすべてのExecutionPolicy設定を省略するようにデフォルト設定が設定されている場合があるため、これは特に重要です。現在の設定がどのようなものであるかを確認するには、このコマンドを実行します(HKCR PSDriveが最初にマップされていることを確認してください)。
Get-ItemProperty HKCR:\ Microsoft.PowerShellScript.1 \ Shell \ Command |選択オブジェクト '(既定値)'
あなたのデフォルト設定は、おそらく以下の2つの文字列のうちの1つ、またはかなり似たものになるでしょう:
(Windows 7 SP1 x 64、PowerShell 2.0搭載)
"C:¥Windows¥System32¥WindowsPowerShell¥v1.0¥powershell.exe" " - ファイル" "%1"
(PowerShell 4.0を搭載したWindows 8.1 x64で見たもの)
"(C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe")if((Get-ExecutionPolicy)-ne 'AllSigned')Set-ExecutionPolicy -Scope Process Bypass;& '%1 「」
1つ目は、既存のExecutionPolicy設定の下でスクリプトを実行するだけなので、それほど悪くありません。事故を起こしやすいアクションに対してより厳密な制限を適用することで改善することができますが、これはもともとダブルクリックでトリガーされることを意図したものではなく、通常デフォルトのポリシーは結局制限付きです。 2番目の選択肢は、しかし、あなたがその場に持っている可能性があるすべてのExecutionPolicy - 完全制限さえ - を完全に迂回することです。バイパスはProcessスコープで適用されるため、スクリプトがExplorerから実行されたときに起動されるセッションにのみ影響します。しかし、これはあなたがさもなければあなたがあなたの方針が禁止することを期待するかもしれない(そして望んでいる)かもしれないスクリプトを起動することになるかもしれないことを意味します.
上記のスクリーンショットに従って、エクスプローラから起動されたスクリプトに対してプロセスレベルのExecutionPolicyを設定するには、先ほど問い合わせたのと同じレジストリ値を変更する必要があります。これをRegeditでこれを変更することで手動で行うことができます。
"C:¥Windows¥System32¥WindowsPowerShell¥v1.0¥powershell.exe" "-ExecutionPolicy" "RemoteSigned" "-file" "%1"
必要に応じて、PowerShell内から設定を変更することもできます。 HKCR PSDriveがマップされた状態で、昇格されたセッションからこれを行うことを忘れないでください。.
Set-ItemProperty HKCR:\ Microsoft.PowerShellScript.1 \ Shell \ Command '(デフォルト) "" C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" -ExecutionPolicy "" RemoteSigned "" -file "" %1 "'
管理者としてPowerShellスクリプトを実行する.
UACを完全に無効にするのは良くない考えですが、管理者アクセスを必要とする操作を実際に実行する必要がない限り、スクリプトやプログラムを高い特権で実行することもセキュリティ上の悪い習慣です。そのため、UACプロンプトをPowerShellスクリプトのデフォルトのアクションに組み込むことはお勧めできません。ただし、必要に応じて昇格セッションでスクリプトを簡単に実行できるように、新しいコンテキストメニューオプションを追加できます。これは、「メモ帳で開く」をすべてのファイルのコンテキストメニューに追加する方法と似ています。ただし、ここではPowerShellスクリプトのみを対象とします。また、前回の記事で使用したテクニックも引き継ぎます。ここでは、PowerShellスクリプトを起動するためにレジストリハックの代わりにバッチファイルを使用しました。.
Regeditでこれを行うには、次の場所にあるShellキーに戻ります。
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell
そこに、新しいサブキーを作成します。それを「Run with PowerShell(Admin)」と呼びます。その下に、「Command」というサブキーをもう1つ作成します。次に、Commandの下の“(Default)”の値をthisに設定します。
"C:¥Windows¥System32¥WindowsPowerShell¥v1.0¥powershell.exe" " - PowerShell.exeの起動処理プロセス-ArgumentList '-ExecutionPolicy RemoteSigned -File \"%1 \ "' -Verb RunAs 「」
PowerShellで同じことをすると、今度は実際に3行が必要になります。新しいキーごとに1つ、Commandの「(Default)」値を設定するための1つです。標高とHKCRマッピングを忘れないでください.
New-Item 'HKCR:\ Microsoft.PowerShellScript.1 \ Shell \ PowerShellで実行(管理者)' New-Item 'HKCR:\ Microsoft.PowerShellScript.1 \ Shell \ PowerShellで実行(管理者)\コマンド' Set-ItemProperty ' HKCR:\ Microsoft.PowerShellScript.1 \ Shell \ PowerShellで実行(管理者)\コマンド "(デフォルト)" "C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" " - コマンド" "&開始プロセスPowerShell.exe -ArgumentList "-ExecutionPolicy RemoteSigned -File \"%1 \ "" - 動詞RunAs "
また、PowerShellを介して入力されている文字列とレジストリに入力される実際の値との違いに注意してください。特に、コマンド解析のエラーを避けるために、全体を一重引用符で囲み、内部の一重引用符を2重にする必要があります。.
これで、PowerShellスクリプト用の新しいコンテキストメニューエントリ、「Run with PowerShell(Admin)」があるはずです。.
新しいオプションにより、2つの連続したPowerShellインスタンスが生成されます。最初のものは2番目のもののための単なるランチャーです。これは、Start-Processを「-Verb RunAs」パラメーターと共に使用して、新しいセッションの昇格を要求します。そこから、UACプロンプトをクリックした後、スクリプトは管理者権限で実行できるはずです。.
仕上げ.
人生をもう少し楽にするのを助けることができるこれへのほんの少しのより多くの微調整があります。一例として、Notepad機能を完全に取り除くことはどうですか。 「編集」(下)のCommandキーから「(デフォルト)」の値を「開く」の下の同じ場所にコピーするだけです。.
"C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe" "%1"
または、PowerShellのこの部分を使用することもできます(もちろんAdminとHKCRを使用)。
Set-ItemProperty HKCR:\ Microsoft.PowerShellScript.1 \ Shell \ Open \ Command '(デフォルト) "" C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe ""%1 "'
もう1つマイナーな煩わしさは、スクリプトが完成するとコンソールが消える習慣です。それが起こるとき、私達はエラーか他の有用な情報のためにスクリプト出力を検討する機会がありません。もちろん、これは各スクリプトの最後に一時停止を入れることで対処できます。代わりに、Commandキーの“(Default)”値を“ -NoExit”パラメータを含めるように変更することもできます。以下は修正値です。.
(管理者アクセスなし)
"C:¥Windows¥System32¥WindowsPowerShell¥v1.0¥powershell.exe" "-NoExit" "-ExecutionPolicy" "RemoteSigned" "-file" "%1"
(管理者アクセス)
"C:¥Windows¥System32¥WindowsPowerShell¥v1.0¥powershell.exe" "&PowerShell.exeの起動プロセスの引数リスト '-NoExit -ExecutionPolicy RemoteSigned -File \"%1 \ "' - 動詞RunAs "
そしてもちろん、PowerShellコマンドでもそれらを紹介します。最後の注意事項:昇格とHKCR!
(管理者以外)
Set-ItemProperty HKCR:\ Microsoft.PowerShellScript.1 \ Shell \ Command '(デフォルト) "" C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" -NoExit "" -ExecutionPolicy "" RemoteSigned "" -file ""%1 "'
(管理者)
Set-ItemProperty 'HKCR:\ Microsoft.PowerShellScript.1 \ Shell \ PowerShellを使用して実行(管理者)\コマンド "(既定値)" "C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" " - コマンド" ""&Start-Process PowerShell.exe -ArgumentList "-NoExit -ExecutionPolicy RemoteSigned -File \"%1 \ "" - 動詞RunAs ""
スピンのためにそれを取る.
これをテストするために、ExecutionPolicy設定を適切に表示し、そのスクリプトが管理者権限で起動されたかどうかを示すことができるスクリプトを使用します。スクリプトは「MyScript.ps1」と呼ばれ、サンプルシステムの「D:\ Script Lab」に保存されます。参考までに、コードは以下のとおりです。.
if(([[Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent())。IsInRole([Security.Principal.WindowsBuiltInRole] "管理者")書き込み/出力 '管理者として実行中!' Write-Output 'Running Limited!' Get-ExecutionPolicy -List
「Run with PowerShell」アクションを使用します。
UACをクリックした後、「PowerShellで実行(管理者)」アクションを使用します。
ProcessスコープでExecutionPolicyの動作を説明するために、このビットのPowerShellコードを使用して、ファイルがインターネットからのものであるとWindowsに判断させることができます。
追加コンテンツ-Path 'D:\ Script Lab \ MyScript.ps1' - 値 "[ZoneTransfer] 'nZoneId = 3" - ストリーム' Zone.Identifier '
幸い、-NoExitが有効になっています。そうでなければ、そのエラーはすぐに点滅していたでしょう、そして私たちは知らなかったでしょう!
Zone.Identifierはこれで削除できます:
クリアコンテンツ - パス 'D:\ Script Lab \ MyScript.ps1' - ストリーム 'Zone.Identifier'
役に立つ参考文献
- バッチファイルからのPowerShellスクリプトの実行 - Daniel Schroeder's Programming Blog
- PowerShellで管理者権限を確認する - Scripting Guyさん、こんにちは。ブログ