プロバイダーの基本

今回から、PowerShellでレジストリを操作する方法を紹介します。

前回まで、PowerShellでファイルを検索するプログラムを作成しましたが、PowerShellではファイルもレジストリも環境変数も電子証明書も、同じ様に操作できます。対象が異なる以上、「全く同じ」とは言えませんが、「基本的に」同じ様に操作できます。

PowerShellでは操作対象をプロバイダーで区別します。ローカルドライブのパスを指定するとき、Windowsでは伝統的に「C:\folder\file.ext」のように指定します。PowerShellではこのドライブ文字記述(C:、D:など)を拡張し、「PSドライブ」と呼んで、プロバイダー指定に使用します。

自分の使用環境でどのようなプロバイダーを使用できるかについては、Get-PSProviderコマンドレットで取得できます。

Get-PSProviderを実行して使用可能なプロバイダーの一覧を表示。

Get-PSProviderで表示する一覧情報のうち、Nameはプロバイダー名、Capabilitiesは機能、DrivesはPSドライブ名...ファイルシステムで言うドライブ文字に相当するパス指定などに使用する識別子...です。

PowreShellで使用できる主要なプロバイダーには以下のようなものがあります。

プロバイダー ドライブ名 データストア(操作対象)
Alias Alias: Windows PowerShell エイリアス
Certificate Cert: 電子証明書
Environment Env: Windows 環境変数
FileSystem A:, B:, C:, D:... ファイルシステム
Function Function: Windows PowerShell の関数
Registry HKLM:, HKCU: Windows レジストリ
Variable Variable: Windows PowerShell の変数
WS-Management WSMan: WS-Management 構成情報

なお、プロバイダーはユーザーやベンダーが自作して追加することもできます。アプリケーションなどをインストールすることによって、プロバイダーが追加されることもあります。

Capabilitiesに表示する代表的な機能には、Credentials、Filter、ShouldProcess、Transactions, Non, Include, Exclude, ExpandWindowsなどがありますが、プロバイダーが対応しているからと言って、そのプロバイダーに対応しているコマンドレット全てがその機能を使えるわけではありません。たとえば、ShouldProcessは、コマンドレット実行時の-WhatIfオプションパラメータに対応して、実行時のテスト(事前評価)をする機能です。しかし、プロバイダーがShouldProcess機能に対応していても、ShouldProcess機能に対応していないコマンドレットでは-WhatIfオプションを使えません。逆に、ShoudProcess機能に対応したコマンドレットであっても、ShouldProcess機能に対応していないプロバイダーに対しては-WhatIfオプションを使えません。

Transactions機能は複数の処理を一括する機能で、PowerShell 2.0以降で使用できます。

Get-PSDriveコマンドレット(短縮形gdr)を実行して、実際に使用できるPSドライブの情報を表示できます。

PowerShellによるレジストリアクセス

さっそく、PowerShellでレジストリをアクセスしてみます。

まず、レジストリの構造と保存されている内容を確認するために、regeditコマンドを実行してレジストリエディタを起動します。

レジストリエディタのルートキー。

レジストリエディタでレジストリを見ると、通常、次の5つのルートキーがあります。

ルートキー 用途
HKEY_LOCAL_MACHINE ローカルPC固有の情報を格納しています。
HKEY_CLASS_ROOT HKEY_LOCAL_MACHINE\Softwareのサブキーで、ファイルを開くときのプログラムの情報を格納しています。
HKEY_USERS すべてのユーザー情報を格納しています。
HKEY_CURRENT_USER HKEY_USERSのサブキーで、ログオン中のユーザーの情報を格納しています。
HKEY_CURRENT_CONFIG ローカルPCのハードウェアプロファイル情報を格納しています。成情報

このうち、PowerShellの既定のプロバイダーで直接アクセスできるのは、システム情報を格納するHKEY_LOCAL_MACHINEと、ユーザー情報を格納するHKEY_CURRENT_USERです。それぞれ、HKLMおよびHKCUというPSドライブ名でアクセスできます。

HKEY_CURRENT_USERのサブキーを一覧表示してみましょう。

たとえば、Get-ChildItem(省略形gci)で「gci c:」を実行すると、Cドライブのファイル、フォルダ情報を表示します。同様に、「gci hkcu:」を実行すると、レジストリのHKEY_CURRENT_USERのサブキーを一覧表示します。但し、表示スタイルはレジストリ情報を見やすいように最適化しますので、ファイルシステムの情報を一覧表示するときとは異なります。

gci hkcu:を実行。

レジストリエディターでの表示と比較すると、正しくHKEY\_CURRENT\_USERの情報を表示していることがわかります。

ファイルシステムの情報を表示するときと同様に、Format-Table(省略形ft)やFormat-List(省略形fl)、Format-Wide(省略形fw)コマンドレットで整形したり、Where-Objectコマンドレット(省略形?またはwhere)を使用して必要なオブジェクトを絞り込んだり、あるいはForeach-Objectコマンドレット(省略形%またはforeach)を使用して個々のオブジェクトを加工したりできます。

gci hkcu: | ft -AutoSize。桁幅を自動調整して出力。

gci hkcu: | ? { $_.Name -match "Print" }。「Print」という文字を含むキーを出力。

gci hkcu: | % { $_.Name.ToUpper () }。Nameプロパティの値(名前)を大文字に変換して出力。

サブキーの情報を取得するには、ファイルシステムでパスを指定するときのように、¥(PowerShellでは¥の代わりに/も可)でサブキー名を連ねます。

たとえば、HKEY_CURRENT_USERのControl PanelのDesktopの情報を取得するのであれば、"HKCU:\Control Panel\Desktop"というパス表記になります。

「gci "hkcu:\Control Panel\Desktop"」を実行。レジストリキーDesktopの情報を表示。

パスにスペースを含むときは、パスの記述を" "でくくらなければならないのも、ファイルシステムのパス指定の場合と同じです。

カレントプロバイダーの移動

cmd.exeのコマンドプロンプトでは、ドライブ文字...c:やd:を入力してEnterキーを押せば、カレントドライブをc:やd:に変更できます。また、cd(chdir)コマンドを使用すれば、カレントディレクトリを変更します。

PowerShellのプロバイダーにも、これとよく似たカレントプロバイダーの考え方があります。PowerShellではSet-Locationコマンドレット(省略形sl)を使用します。ファイルシステムを操作する場合、Set-Locationコマンドレットを使用して、

「sl D:」で、Dドライブに移動。

「sl C:\Users」で、C:\Usersディレクトリに移動。

などの操作をします。

同様に、以下のような操作で、カレントプロバイダをレジストリに移動したり、カレントレジストリキーを移動できます。

「sl HKCU:」で、HKEY_CURRENT_USERに移動。

「sl "Control Panel\Desktop"」で、レジストリキーDesktopに移動し、レジストリキーDesktopをカレントパスにした状態で「gci」を実行すると、Desktopのサブキーを表示。

なお、ファイルシステム自体を意味するPSドライブ名はないため、ファイルシステムに移動するときは、c:、d:等のドライブ文字を入力します。

「c:」と入力して、ファイルシステムのCドライブに移動。

実際にレジストリを操作するスクリプトプログラムを作成する前に、次回も、レジストリの扱い方についてもう少し掘り下げます。