プロバイダーの基本
今回から、PowerShellでレジストリを操作する方法を紹介します。
前回まで、PowerShellでファイルを検索するプログラムを作成しましたが、PowerShellではファイルもレジストリも環境変数も電子証明書も、同じ様に操作できます。対象が異なる以上、「全く同じ」とは言えませんが、「基本的に」同じ様に操作できます。
PowerShellでは操作対象をプロバイダーで区別します。ローカルドライブのパスを指定するとき、Windowsでは伝統的に「C:\folder\file.ext」のように指定します。PowerShellではこのドライブ文字記述(C:、D:など)を拡張し、「PSドライブ」と呼んで、プロバイダー指定に使用します。
自分の使用環境でどのようなプロバイダーを使用できるかについては、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以降で使用できます。
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のサブキーを一覧表示します。但し、表示スタイルはレジストリ情報を見やすいように最適化しますので、ファイルシステムの情報を一覧表示するときとは異なります。
ファイルシステムの情報を表示するときと同様に、Format-Table(省略形ft)やFormat-List(省略形fl)、Format-Wide(省略形fw)コマンドレットで整形したり、Where-Objectコマンドレット(省略形?またはwhere)を使用して必要なオブジェクトを絞り込んだり、あるいはForeach-Objectコマンドレット(省略形%またはforeach)を使用して個々のオブジェクトを加工したりできます。
サブキーの情報を取得するには、ファイルシステムでパスを指定するときのように、¥(PowerShellでは¥の代わりに/も可)でサブキー名を連ねます。
たとえば、HKEY_CURRENT_USERのControl PanelのDesktopの情報を取得するのであれば、"HKCU:\Control Panel\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ドライブに移動。 |
実際にレジストリを操作するスクリプトプログラムを作成する前に、次回も、レジストリの扱い方についてもう少し掘り下げます。