第 1 章 - PowerShell の概要

この章では、PowerShell を見つけて起動すること、および PowerShell の新しいユーザーが経験する最初の問題を解決することに焦点を当てています。 お使いのラボ環境コンピューターで、この章の例に従って手順を実行してください。

PowerShell とは

Windows PowerShell は、Windows ベースのシステムの管理タスクを自動化するための、簡単に使えるコマンド ライン シェルおよびスクリプト環境です。 Windows PowerShell は、すべての最新バージョンの Windows オペレーティング システムにプレインストールされています。

PowerShell が見つかる場所

Windows 11 で PowerShell を見つける最も簡単な方法は、図 1-1 に示すように、検索バーに「PowerShell」と入力することです。 Windows PowerShell には、4 つの異なるショートカットがあることに注意してください。

図 1-1 - PowerShell を探します。

64 ビット バージョンの Windows での Windows PowerShell ショートカット:

  • Windows PowerShell
  • Windows PowerShell ISE
  • Windows PowerShell (x86)
  • Windows PowerShell ISE (x86)

64 ビット バージョンの Windows では、64 ビット バージョンの Windows PowerShell コンソールおよび Windows PowerShell Integrated Scripting Environment (ISE) と、ショートカットの (x86) サフィックスで示されるように、32 ビット バージョンのそれらの各バージョンがあります。

Note

Windows 11 は、64 ビット オペレーティング システムとしてのみ出荷されます。 32 ビット バージョンの Windows 11 はありません。 ただし、Windows 11 には、Windows PowerShell と Windows PowerShell ISE の 32 ビット バージョンが含まれています。

古い 32 ビット バージョンの Windows を実行している場合、ショートカットは 2 つだけです。 これらのショートカットに (x86) サフィックスはありませんが、32 ビット バージョンです。

64 ビット オペレーティング システムを実行している場合は、32 ビット バージョンを使用する特別な理由がない限り、64 ビット バージョンの Windows PowerShell を使用することをお勧めします。

実行している Windows 11 のバージョンによっては、Windows PowerShell が Windows ターミナルで開く場合があります。

Microsoft は PowerShell ISE を更新しなくなりました。 ISE は Windows PowerShell 5.1 でのみ機能します。 Visual Studio Code (VS Code) と PowerShell 拡張機能は、両方のバージョンの PowerShell で動作します。 VS Code と PowerShell 拡張機能は、Windows に付属していません。 PowerShell スクリプトを作成するコンピューターに、VS Code とこの拡張機能をインストールします。 PowerShell を実行するすべてのコンピューターにインストールする必要はありません。

PowerShell の起動方法

サポートする運用環境で、3 つの異なる Active Directory ユーザー アカウントを使用します。 このドキュメントで使用しているラボ環境には、これらのアカウントが複製されています。 ドメインまたはローカル管理者権限を持たないドメイン ユーザーとして、Windows 11 コンピューターにサインインします。

図 1-1 に示すように、[Windows PowerShell] ショートカットをクリックして、PowerShell コンソールを起動します。 図 1-2 に示すように、コンソールのタイトル バーに Windows PowerShell と表示されていることに注目してください。

図 1-2 - PowerShell ウィンドウのタイトル バー。

PowerShell を通常のユーザーとして実行すると、一部のコマンドは正常に実行されます。 ただし、PowerShell は、ユーザー アクセス制御 (UAC) に参加しません。 つまり、管理者の承認を必要とするタスクの昇格を要求することはできません。

Note

UAC は、悪意のあるコードが昇格された特権で実行されるのを防ぐのに役立つ Windows セキュリティ機能です。

通常のユーザーとしてサインオンすると、昇格を必要とするコマンドを実行したときに、PowerShell からエラーが返されます。 たとえば、Windows サービスを停止すると、次のようになります。

Stop-Service -Name W32Time
Stop-Service : Service 'Windows Time (W32Time)' cannot be stopped due to
the following error: Cannot open W32Time service on computer '.'.
At line:1 char:1
+ Stop-Service -Name W32Time
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (System.ServiceProcess.ServiceCon
   troller:ServiceController) [Stop-Service], ServiceCommandException
    + FullyQualifiedErrorId : CouldNotStopService,Microsoft.PowerShell.Comm
   ands.StopServiceCommand

この解決方法は、ローカル管理者であるユーザーとして、PowerShell を管理者特権で実行することです。 これが、2 番目のドメイン ユーザー アカウントを構成した方法です。 最小限の特権の原則に従って、このアカウントはドメイン管理者にせず、ドメイン内で昇格された特権を持たせないようにします。

管理者特権で PowerShell を起動するには、[Windows PowerShell] ショートカットを右クリックし、図 1-3 に示すように、[管理者として実行] を選択します。

図 1-3 - コンテキスト メニュー - [管理者として実行]。

通常のユーザーとして Windows にログインしたため、Windows から資格情報の入力を求められます。 図 1-4 に示すように、ローカル管理者であるドメイン ユーザーの資格情報を入力します。

図 1-4 - [ユーザー アカウント制御] - [資格情報を入力]。

図 1-5 に示すように、管理者特権のコンソール ウィンドウのタイトル バーに、管理者: Windows PowerShell と表示されていることに注意してください。

図 1-5 - 管理者特権の PowerShell ウィンドウのタイトル バー。

これで、管理者として管理者特権で PowerShell を実行しているため、昇格を必要とするコマンドを実行しても、UAC の問題は起きなくなりました。

重要

管理者として管理者特権で PowerShell を実行することは、そうするのが不可欠である場合にのみ、実行してください。

リモート コンピューターを対象とするときに、PowerShell を管理者特権で実行する必要はありません。 PowerShell の管理者特権での実行は、ローカル コンピューターに対して実行されるコマンドにのみ影響します。

PowerShell の検索と起動は、簡略化できます。 これには、PowerShell または Windows ターミナルのショートカットをタスク バーにピン留めします。 PowerShell をもう一度検索します。ただし今回は、図 1-6 に示すように、右クリックし、[タスク バーにピン留めする] を選択します。

図 1-6 - コンテキスト メニュー - [タスク バーにピン留めする]。

重要

2017 年に発行された本書の元のバージョンでは、PowerShell を起動するたびに管理者特権を持つインスタンスが自動的に起動されるように、タスク バーにインスタンスのショートカットをピン留めすることを推奨していました。 しかし、潜在的なセキュリティ上の懸念があるため、現在は推奨していません。 PowerShell のインスタンスを管理者特権で起動するすべてのアプリケーションが、同様に UAC をバイパスし、管理者特権で実行されます。 たとえば、PowerShell の管理者特権のインスタンスから Web ブラウザーを起動すると、悪意のあるコードが訪問先 Web サイトに含まれていた場合、それらも管理者特権で実行されます。

管理者特権で PowerShell を実行する必要がある場合は、Shift キーを押しながら、タスク バーにピン留めされた PowerShell ショートカットを右クリックします。 図 1-7 に示すように、[管理者として実行] を選択します。

図 1-7 - コンテキスト メニュー - [管理者として実行]。

PowerShell のバージョンを決定する

PowerShell には、状態情報を格納するための自動変数があります。 これらの変数の 1 つは $PSVersionTable であり、PowerShell セッションに関するバージョン情報が格納されます。

$PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.22621.2428
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.22621.2428
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

5.1 より前のバージョンの Windows PowerShell を実行している場合は、Windows のバージョンを更新する必要があります。 Windows PowerShell 5.1 は、現在サポートされているバージョンの Windows にプレインストール済みです。

PowerShell バージョン 7 は Windows PowerShell 5.1 の置き換えではありません。Windows PowerShell と並列でインストールされます。 Windows PowerShell バージョン 5.1 と PowerShell バージョン 7 は、2 つの異なる製品です。 Windows PowerShell バージョン 5.1 と PowerShell バージョン 7 の違いの詳細については、「Windows PowerShell 5.1 から PowerShell 7 への移行」を参照してください。

ヒント

以前 PowerShell Core と呼ばれていた PowerShell バージョン 6 は、サポートされなくなりました。

実行ポリシー

PowerShell 実行ポリシーは、PowerShell スクリプトを実行できる条件を制御します。 PowerShell 実行ポリシーは、悪意のあるスクリプトが意図せず実行されるのを防ぐために設計された安全装置です。 ただし、しつこいユーザーが意図的にスクリプトを実行するのを阻止できないため、セキュリティ境界ではありません。 ユーザーは、その気になれば PowerShell 実行ポリシーをバイパスできます。

ローカル コンピューター、現在のユーザー、または PowerShell セッション用に実行ポリシーを設定できます。 または、グループ ポリシーを使用して、ユーザーとコンピューターの実行ポリシーを設定することもできます。

次の表に、現在の Windows オペレーティング システムの既定の実行ポリシーを示します。

Windows オペレーティング システムのバージョン 既定の実行ポリシー
Windows Server 2022 リモート署名
Windows Server 2019 リモート署名
Windows Server 2016 リモート署名
Windows 11 制限あり
Windows 10 制限あり

すべての PowerShell コマンドは、実行ポリシー設定に関係なく、対話的に実行できます。 実行ポリシーは、スクリプト内で実行されているコマンドにのみ影響します。 Get-ExecutionPolicy コマンドレットを使用して、現在の実行ポリシー設定を確認できます。

コンピューターの実行ポリシー設定を確認します。

Get-ExecutionPolicy
Restricted

すべてのスコープの実行ポリシー設定を一覧表示します。

Get-ExecutionPolicy -List
        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

すべての Windows クライアント オペレーティング システムに、Restricted の既定の実行ポリシー設定があります。 Restricted 実行ポリシー設定を使用すると、PowerShell スクリプトは実行できません。 実行ポリシーをテストするには、次のコードを Get-TimeService.ps1 という名前の .ps1 ファイルとして保存します。

ヒント

PowerShell スクリプトは、実行するコマンドが格納されたプレーンテキスト ファイルです。 PowerShell スクリプト ファイルには、.ps1 ファイル拡張子が使用されます。 PowerShell スクリプトを作成するには、Visual Studio Code (VS Code) などのコード エディターまたはメモ帳などの任意のテキスト エディターを使用します。

次のコマンドを対話的に実行すると、エラーなしで完了します。

Get-Service -Name W32Time

ただし、スクリプトから同じコマンドを実行すると、PowerShell からエラーが返されます。

.\Get-TimeService.ps1
.\Get-TimeService.ps1 : File C:\tmp\Get-TimeService.ps1 cannot be loaded
because running scripts is disabled on this system. For more information,
see about_Execution_Policies at
https:/go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ .\Get-TimeService.ps1
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

エラーを生成するコマンドを PowerShell で実行するときは、コマンドを再試行する前に、そのエラー メッセージを読んでください。 エラー メッセージに、コマンドが失敗した理由が示されていることに注目してください。

...スクリプトの実行は、このシステムで無効になっています。

スクリプトの実行を有効にするには、Set-ExecutionPolicy コマンドレットを使用して、実行ポリシーを変更します。 LocalMachine は、Scope パラメーターを指定しない場合の既定のスコープです。 ローカル コンピューターの実行ポリシーを変更するには、管理者として管理者特権で PowerShell を実行する必要があります。 スクリプトに署名するのでない限り、RemoteSigned 実行ポリシーを使用することをお勧めします。 RemoteSigned は、信頼された発行元による署名がないダウンロードされたスクリプトの実行が防止されます。

実行ポリシーを変更する前に、about_Execution_Policies ヘルプ記事を参照して、セキュリティへの影響を理解してください。

お使いのコンピューターの実行ポリシー設定を RemoteSigned に変更します。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

実行ポリシーが正常に変更された場合、PowerShell に次の警告が表示されます。

Execution Policy Change
The execution policy helps protect you from scripts that you do not trust.
Changing the execution policy might expose you to the security risks
described in the about_Execution_Policies help topic at
https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the
execution policy?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "N"):y

管理者として管理者特権で PowerShell を実行していない場合、PowerShell は次のエラー メッセージを返します。

Set-ExecutionPolicy : Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWAR
E\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied. To
change the execution policy for the default (LocalMachine) scope, start
Windows PowerShell with the "Run as administrator" option. To change the
execution policy for the current user, run "Set-ExecutionPolicy -Scope
CurrentUser".
At line:1 char:1
+ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (:) [Set-ExecutionPolicy],
   UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.
   PowerShell.Commands.SetExecutionPolicyCommand

管理者として管理者特権で PowerShell を実行せずに、現在のユーザーの実行ポリシーを変更することもできます。 ローカル コンピューターの実行ポリシーが RemoteSigned に正常に設定された場合、この手順は不要です。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

実行ポリシーが RemoteSigned に設定された状態では、Get-TimeService.ps1 スクリプトは正常に実行されます。

.\Get-TimeService.ps1
Status   Name               DisplayName
------   ----               -----------
Running  W32Time            Windows Time

まとめ

この章では、PowerShell が見つかる場所と起動方法について説明しました。 また、PowerShell のバージョンと実行ポリシーの目的を判断する方法についても学習しました。

確認

  1. コンピューターで実行されている PowerShell のバージョンを確認するにはどうすればよいか。
  2. 管理者として管理者特権で PowerShell を起動する必要があるのはどのような場合か。
  3. Windows クライアント コンピューターの既定の実行ポリシーは何か。また、これによって実行が防止されるのは何か。
  4. 現在の PowerShell 実行ポリシー設定を確認するにはどうすればよいか。
  5. PowerShell 実行ポリシーを変更するにはどうすればよいか。

関連情報

この章で説明する概念の詳細については、次の PowerShell ヘルプ記事を参照してください。

次のステップ

次の章では、PowerShell のコマンドの見つけやすさについて学習します。 また、PowerShell セッションでヘルプを表示できるように、PowerShell のヘルプ ファイルをダウンロードする方法についても学習します。