Windows PowerShellプロファイルの力

Don Jones

目次

シェル、ホスト、およびプロファイル
プロファイルを使用する
カスタム コンソールを作成する
プロファイルに関するその他のテクニック
プロファイルに関する注意点

このコラムを定期的に読んでいらっしゃる皆さんは、Windows PowerShell でプロファイルのシステムがサポートされていることを既にご存知でしょう。基本的に、これらは .ps1 というファイル名拡張子が付いたシェル スクリプトで、シェルが実行されるときに自動的に実行されます。プロファイルでは、たとえばカスタム エイリアスを定義するためのすばらしい方法が提供されます。シェルを実行するたびにプロファイルによってエイリアスが自動的に定義され、シェルの使用中にいつでもエイリアスを使用できるように、プロファイルを構成できます。

Windows PowerShell では、次の 4 種類のプロファイルが定義されます。

  • すべてのシェルとコンピュータのすべてのユーザーに適用されるプロファイル。
  • すべてのユーザーと Microsoft PowerShell シェルに適用されるプロファイル。
  • 現在のユーザーとすべてのシェルに適用されるプロファイル。
  • 現在のユーザーと Microsoft PowerShell シェルに適用されるプロファイル。

"すべてのシェル" という概念は少し紛らわしいかもしれません。この用語は、Windows PowerShell の初期の開発コンセプトに基づいていますが、このコンセプトは実際に最終的な製品にはなりませんでした。今日では、おそらく "すべてのホスト" という表現の方が適切です。

シェル、ホスト、およびプロファイル

ご存知のように、Windows PowerShell 自体は Microsoft .NET Framework アセンブリの集合です。ここでは、シェルのこの部分を Windows PowerShell エンジンと呼びたいと思います。というのも、ここには皆さんが一般的に Windows PowerShell であると考えている機能が含まれているからです。ただし、ユーザーがこのエンジンと対話できる方法は組み込まれていません。ユーザーが実際にシェルを使用するには、ホスト アプリケーション (つまりホスト) によってエンジンが読み込まれる必要があります。

皆さんがこれまで実行してきた powershell.exe アプリケーションも、このようなホストの 1 つです。Windows PowerShell 2.0 Community Technology Preview (CTP) に含まれている gpowershell.exe アプリケーションは、また別のホストです。ホストとシェルの関係は、私がここで述べたほど単純なものではありませんが、皆さんがご覧になる動作は、私の簡単な説明で理解していただけると思います。

テキスト ベースのコマンド ライン インターフェイスを使用してシェルと対話する場合に、powershell.exe ホストを使用する可能性が高いことを理解しておくことは重要です。このことは、別のアプリケーション (Exchange 管理シェルなど) によってインストールされたショートカットを使用してシェルを起動した場合にも当てはまります。Exchange 管理シェルは、別のシェルやホスト アプリケーションではなく、一連のスナップインとスクリプトをあらかじめ読み込むように指定したショートカットによって起動される、標準的な powershell.exe ホストです。これらのスナップインにより、シェル内で Exchange の管理機能を使用できるようになります。ただし、使用するのは同じシェルです。

Windows Vista の場合、powershell.exe ホストのプロファイルは以下の場所にあります。

  • %windir%\system32\WindowsPowerShell\v1.0\profile.ps1 コンピュータのすべてのユーザーとすべてのシェルに適用されるプロファイル。
  • %windir%\system32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1 コンピュータのすべてのユーザーと Microsoft.PowerShell シェルに適用されるプロファイル。
  • %UserProfile%\Documents\WindowsPowerShell\profile.ps1 現在のユーザーとすべてのシェルに適用されるプロファイル。
  • %UserProfile%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 現在のユーザーと Microsoft.PowerShell シェルに適用されるプロファイル。

これらのプロファイルは既定で作成されるわけではなく、明示的に作成した場合のみ、上記の場所に格納されます。

各ホスト アプリケーションは、適切なプロファイルを読み込んで実行します。特定のホスト アプリケーションによって、どのプロファイルも読み込まないことが "決定" された場合、実際にそのアプリケーションでプロファイルを読み込む必要はありません。プロファイルは Windows PowerShell エンジンによって自動的に実行されるわけではありません。

上記の動作を完全に把握する最も簡単な方法は、シェルを開いて「$profile」と入力し、Enter キーを押すことです。これで、シェルが使用しようとしている "主要な" プロファイル (ユーザーごとに用意される、シェル固有のプロファイル) の完全なパスがわかります。その後、そのスクリプトを作成または変更すれば、シェルが起動するたびにプロファイルが実行されるようになります。

プロファイルを使用する

プロファイルを使用する一般的な方法の 1 つは、既に述べたように、カスタム エイリアスを定義することです。また、カスタムの PSDrive を追加することもできます (これらは基本的に割り当て済みのドライブで、完全に Windows PowerShell 内に存在します)。あまり一般的でない使用方法は、環境内で使用しているソフトウェア製品に基づいて、必要な任意の管理タスクを実行できるスーパー シェルのようなものを作成することです。実際にスーパー シェルの概念について説明するには、まずその背景について少し説明する必要があります。

Windows PowerShell を作成しているマイクロソフト内の製品グループは、Microsoft 管理コンソール (MMC) を含む、その他の主要な管理テクノロジの多くを担当しています。MMC のしくみは、Windows PowerShell とよく似ています。mmc.exe を実行すると、最初にあまり役立たない空のコンソールが起動します。機能的なコンソールを作成するには、MMC スナップインを追加します。

要件に合わせてコンソールを構成したら、.msc 形式でコンソールをファイルに保存します。この保存したコンソール ファイルを使用して、カスタム コンソールをいつでも簡単に再読み込みできます。

多くの管理者は、カスタムの MMC コンソールを作成するのではなく、自分たちが管理する製品と共にインストールされるコンソールを使用します。たとえば、Exchange Server では、Exchange Server スナップインのみを含むコンソールが作成されます。Active Directory ユーザーとコンピュータは、あらかじめ作成されるもう 1 つのコンソールで、単一のスナップインが含まれています。

Windows PowerShell のしくみもほぼ同じです。Exchange Server 2007 の管理ツールと共にインストールされる Exchange 管理シェルのアイコンは、実際には powershell.exe へのショートカットで、コンソール ファイルを読み込む命令が含まれています。シェルのコンソール ファイルには .psc1 ファイル名拡張子が付いていて、あらかじめ読み込まれるスナップインの一覧が含まれています (MMC によってあらかじめ読み込まれるスナップインの一覧が .msc ファイルに含まれているのと非常によく似ています)。ただし、あらかじめ作成されるこのようなシェル コンソールの使用にこだわる必要はありません。MMC の場合と同じようにカスタム コンソールを作成し、そのカスタム コンソールを使用してすべての管理タスクを実行できます。プロファイルは、これを可能にするうえで重要な役割を果たします。

カスタム コンソールを作成する

カスタム コンソールを作成するには、まず使用する各スナップインの完全名を検索する必要があります。まず、必要なすべての管理ツールがコンピュータにインストールされていることを確認します。その後、Windows PowerShell で Get-PSSnapin –registered を実行します。これで、登録されているがまだ読み込まれていないすべての使用可能なスナップインが一覧表示されます。続いて、適切な Windows PowerShell プロファイルを作成または編集します。Add-PSSnapin コマンドを追加して、常に使用するスナップインをそれぞれ読み込みます。これには、Exchange Server、System Center 製品、サードパーティ製のスナップイン (たとえば PowerShell Community Extensions) などがあります。プロファイルを保存して (Windows PowerShell の実行ポリシーで要求されている場合は、プロファイルをデジタル署名します)、シェルを閉じます。もう一度シェルを開くと、プロファイルに列挙されたすべてのスナップインが自動的に読み込まれます。

もう 1 つの手法は、(Add-PSSnapin とスナップインの名前を使用して) すべてのスナップインをシェルに読み込むことです。その後、Export-Console を実行して、現在使用しているすべてのスナップインを含む .psc1 コンソール ファイルを作成します。この .psc1 コンソール ファイルを使用して、PSConsoleFile パラメータとカスタムの .psc1 ファイルが指定された、Windows PowerShell の新しいショートカットを作成できます。その後、ショートカットがコンソールを使用して、指定されたすべてのスナップインを自動的に読み込みます。

プロファイルに関するその他のテクニック

私は自分で作成した Windows PowerShell プロファイルを使用して、シェルが起動するたびに、他にもさまざまな役立つタスクを実行しています。次に、私のシステムでシェルが起動したときに実行されるいくつかの処理を示します。

  1. Get-Credential を実行してドメインの管理者アカウントの資格情報を取得し、$cred という変数に結果を格納します。これにより、シェル全体で $cred を使用できるようになります。次に、$cred をさまざまなコマンドレット (Get-WMIObject コマンドレットなど) の credential パラメータに渡します。$cred にはパスワードが格納されるので、パスワードの入力を求められることなく、これらのコマンドレットを使用できます。
  2. Cd C:\ を実行して、シェルがコンピュータの C: ドライブのルートで開始されるようにします。
  3. New-Alias of Out-File を実行して、"of" という名前のエイリアスを作成します。これは、"Out-File" の代わりに "of" を使用できるようにするためです。短いエイリアスが定義されていると非常に便利なので、私はこの手法をよく使用します。

シェルの HKLM: ドライブにテスト キーを作成します。HKLM はレジストリの HKEY_LOCAL_MACHINE の部分を表しています。エラーが発生した場合は、昇格した権限を使用せずにシェルが起動されます。通常、私が行う作業では、昇格した権限が必要です。エラーが発生するかどうかによって、重要な作業に取りかかる前に、昇格した権限を持っているかどうかを簡単に確認できます。

Ping-Address という名前のカスタム関数を定義します。この関数は、コンピュータ名または IP アドレスを受け取り、そのコンピュータが ping に応答するかどうかに基づいて True または False を返します。私が行う作業ではこの関数をよく使用するので、プロファイル内でこの関数を定義してシェル全体で使用できるようにしています。

今月のコマンドレット : Get-WmiObject

洞察力のある方は、私が以前に取り上げたものと同じコマンドレットを紹介していることに気付いたかもしれませんが、今回は、このコマンドレットで提供されるすばらしい仕掛けについて説明します。管理者はよく次のような手法を使用して、テキスト ファイルに名前が記載されている複数のコンピュータから Windows Management Instrumentation (WMI) に関する情報を取得しようとします。

Get-Content c:\computers.txt | ForEach-Object { Get-WmiObject Win32_Service –comp $_ }

この手法は正しく機能しますが、必ずしもこの手法を使用する必要はありません。その理由は、Get-WmiObject を使用すれば、–computerName パラメータに指定したコンピュータ名の配列を受け取ることができるからです。この同じ効果を得るには、次の手法を使用します。

Get-WmiObject Win32_Service –comp (Get-Content c:\computers.txt)

Get-Content コマンドをかっこ内に入れると、シェルによって強制的にこのコマンドが実行され、結果 (コンピュータ名の配列) が –computerName パラメータに格納されます。

プロファイルに関する注意点

Microsoft.PowerShell プロファイルやすべてのシェルに適用されるプロファイルを読み込むアプリケーションは、powershell.exe だけではありません。SAPIEN Technologies の PrimalScript、Quest Software の PowerGUI、ShellTools の PowerShell Plus など、Windows PowerShell のサポートを提供している多くの統合開発環境 (IDE) でも、これらと同じプロファイルを読み込んで、powershell.exe ホストと同じような操作を行うことができます。

多くのスナップインを読み込む、サイズの大きいプロファイルを使用すると、アプリケーションの起動に時間がかかる可能性があります。その理由は、アプリケーションをホストする準備が整うまでに、Windows PowerShell エンジンによって多くの命令が実行されるためです。実際、実行するプロファイルのスクリプトが非常に多い場合は、powershell.exe でも起動に時間がかかります。

複数のスナップインが、同じ名前を持つコマンドレットを定義している場合も、競合が発生する可能性があります。たとえば、2 つのスナップインで Get-User という名前のコマンドレットが定義されている場合は、ユーザーがコマンドレットの完全修飾名を使用して必要なコマンドレットを指定するまで、Windows PowerShell ではどちらのコマンドレットも実行されません。スナップインの名前は非常に長くなることがあるので、この完全修飾名はわかりにくくなる可能性があります。通常、この問題が発生したら、私はこれら 2 つのスナップインを同時に読み込むことをあきらめます。代わりに、プロファイルでよく使用するスナップインだけを読み込み、もう 1 つのスナップインを読み込んで使用する必要がある場合は、別の "新しい" シェルを使用します。

Windows PowerShell のプロファイルでは、多くの便利な機能がシェルに提供されます。ただし、マルウェアによって故意に編集された場合、プロファイルは大規模な損害を引き起こす可能性があることも忘れないでください。プロファイルを保護するには、プロファイルにデジタル署名し、AllSigned 実行ポリシーを使用するよう Windows PowerShell を構成するか、プロファイルの NTFS ファイルに設定されているアクセス許可をすべて変更して、通常のユーザー アカウントではそれらのファイルを変更できないようにします。

Don Jones は、『Windows PowerShell: TFM』と『VBScript, WMI, and ADSI Unleashed』の著者です。連絡先については、PowerShellCommunity.org を参照してください。